From 8bebc8488e3369c9152c3e03bf802931e387e02c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sandro=20Knau=C3=9F?= Date: Fri, 3 Feb 2023 17:42:21 +0100 Subject: [PATCH] New upstream version 3.7.0 --- .clang-format | 121 +- .clang-tidy | 45 - .drone.yml | 75 +- .github/workflows/clang-format.yml | 20 + .github/workflows/clang-tidy-review.yml | 41 + .github/workflows/sonarcloud.yml | 2 +- .github/workflows/windows-build-and-test.yml | 4 +- .tag | 2 +- .tx/config | 2 +- CHANGELOG.md | 39 +- CMakeLists.txt | 9 +- README.md | 10 +- VERSION.cmake | 6 +- admin/linux/build-appimage.sh | 1 + admin/nix/flake.nix | 143 ++ admin/osx/gen_sym_files.py | 2 +- admin/win/msi/Nextcloud.wxs | 2 +- admin/win/msi/RegistryCleanup.vbs.in | 12 +- admin/win/msi/collect-transform.xsl.in | 5 +- cmake/modules/ECMAddAppIcon.cmake | 28 +- cmake/modules/GenerateIconsUtils.cmake | 58 + cmake/modules/NSIS.template.in | 25 +- config.h.in | 4 + craftmaster.ini | 5 +- doc/README.md | 2 +- doc/conf.py | 6 +- nextcloud.client-desktop/gl_translation | 1 + resources.qrc | 21 +- .../FinderSyncExt/FinderSync.m | 102 +- .../FinderSyncExt/LineProcessor.m | 5 +- .../project.pbxproj | 18 +- .../xcschemes/FinderSyncExt.xcscheme | 1 + shell_integration/dolphin/CMakeLists.txt | 8 +- .../dolphin/ownclouddolphinactionplugin.cpp | 2 +- .../dolphin/ownclouddolphinpluginhelper.h | 14 +- .../libcloudproviders/CMakeLists.txt | 22 +- .../windows/NCContextMenu/CMakeLists.txt | 8 + .../windows/NCContextMenu/NCContextMenu.rc | Bin 4590 -> 4590 bytes .../windows/NCOverlays/CMakeLists.txt | 8 + .../windows/NCOverlays/NCOverlay.rc | Bin 5532 -> 5532 bytes shell_integration/windows/NCUtil/NCUtil.rc | Bin 4476 -> 4476 bytes shell_integration/windows/WinShellExt.wxs.in | 4 +- .../QProgressIndicator/QProgressIndicator.h | 12 +- src/3rdparty/kirigami/wheelhandler.cpp | 696 +++++-- src/3rdparty/kirigami/wheelhandler.h | 255 ++- .../kmessagewidget/kmessagewidget.cpp | 2 +- src/3rdparty/kmessagewidget/kmessagewidget.h | 20 +- src/3rdparty/qtlockedfile/qtlockedfile.h | 4 +- src/3rdparty/qtokenizer/qtokenizer.h | 8 +- .../qtsingleapplication/qtlocalpeer.h | 4 +- .../qtsingleapplication/qtsingleapplication.h | 4 +- .../qtsinglecoreapplication.h | 2 +- src/CMakeLists.txt | 53 +- src/common/checksums.h | 4 +- src/common/ownsql.h | 8 +- src/common/preparedsqlquerymanager.h | 9 + src/common/remotepermissions.h | 8 +- src/common/result.h | 6 +- src/common/shellextensionutils.cpp | 1 - src/common/shellextensionutils.h | 7 +- src/common/syncfilestatus.h | 6 +- src/common/syncjournaldb.cpp | 288 ++- src/common/syncjournaldb.h | 68 +- src/common/syncjournalfilerecord.h | 23 +- src/common/utility.cpp | 56 +- src/common/utility.h | 11 +- src/common/vfs.cpp | 2 +- src/common/vfs.h | 22 +- src/csync/csync.h | 35 +- src/csync/csync_exclude.cpp | 13 +- src/csync/csync_exclude.h | 7 +- src/csync/std/c_private.h | 2 +- src/gui/BasicComboBox.qml | 14 +- src/gui/CMakeLists.txt | 109 +- src/gui/ErrorBox.qml | 72 +- src/gui/PredefinedStatusButton.qml | 1 - src/gui/UserStatusSelector.qml | 9 +- src/gui/UserStatusSelectorButton.qml | 1 - src/gui/accountmanager.cpp | 252 ++- src/gui/accountmanager.h | 22 +- src/gui/accountsettings.cpp | 571 ++++-- src/gui/accountsettings.h | 36 +- src/gui/accountsetupcommandlinemanager.cpp | 114 ++ src/gui/accountsetupcommandlinemanager.h | 51 + src/gui/accountsetupfromcommandlinejob.cpp | 238 +++ src/gui/accountsetupfromcommandlinejob.h | 66 + src/gui/accountstate.h | 24 +- src/gui/application.cpp | 176 +- src/gui/application.h | 13 +- src/gui/authenticationdialog.h | 4 +- src/gui/callstatechecker.h | 8 +- src/gui/caseclashfilenamedialog.cpp | 284 +++ src/gui/caseclashfilenamedialog.h | 83 + src/gui/caseclashfilenamedialog.ui | 340 ++++ src/gui/cloudproviders/cloudproviderwrapper.h | 6 +- src/gui/conflictdialog.h | 6 +- src/gui/conflictsolver.h | 4 +- src/gui/connectionvalidator.cpp | 4 +- src/gui/connectionvalidator.h | 4 +- src/gui/creds/flow2auth.h | 6 +- src/gui/creds/httpcredentialsgui.h | 2 +- src/gui/creds/oauth.cpp | 2 +- src/gui/creds/oauth.h | 2 +- src/gui/creds/webflowcredentials.cpp | 6 +- src/gui/creds/webflowcredentials.h | 10 +- src/gui/creds/webflowcredentialsdialog.cpp | 3 +- src/gui/creds/webflowcredentialsdialog.h | 4 +- src/gui/editlocallyjob.cpp | 25 +- src/gui/editlocallyjob.h | 18 +- src/gui/editlocallymanager.h | 4 +- src/gui/elidedlabel.h | 4 +- src/gui/emojimodel.h | 10 +- src/gui/fileactivitylistmodel.cpp | 43 +- src/gui/fileactivitylistmodel.h | 14 +- src/gui/filedetails/FileActivityView.qml | 33 + src/gui/filedetails/FileDetailsPage.qml | 218 +++ src/gui/filedetails/FileDetailsView.qml | 45 + src/gui/filedetails/FileDetailsWindow.qml | 42 + src/gui/filedetails/NCInputTextEdit.qml | 70 + src/gui/filedetails/NCInputTextField.qml | 65 + src/gui/filedetails/NCTabButton.qml | 88 + src/gui/filedetails/ShareDelegate.qml | 266 +++ src/gui/filedetails/ShareDetailsPage.qml | 789 ++++++++ src/gui/filedetails/ShareView.qml | 317 ++++ src/gui/filedetails/ShareeDelegate.qml | 27 + src/gui/filedetails/ShareeSearchField.qml | 249 +++ src/gui/filedetails/filedetails.cpp | 156 ++ src/gui/filedetails/filedetails.h | 75 + src/gui/filedetails/shareemodel.cpp | 278 +++ src/gui/filedetails/shareemodel.h | 105 + src/gui/filedetails/sharemodel.cpp | 1063 +++++++++++ src/gui/filedetails/sharemodel.h | 217 +++ src/gui/filedetails/sortedsharemodel.cpp | 125 ++ src/gui/filedetails/sortedsharemodel.h | 45 + src/gui/folder.cpp | 133 +- src/gui/folder.h | 33 +- src/gui/folderman.cpp | 203 +- src/gui/folderman.h | 56 +- src/gui/folderstatusdelegate.cpp | 19 +- src/gui/folderstatusdelegate.h | 2 +- src/gui/folderstatusmodel.cpp | 55 +- src/gui/folderstatusmodel.h | 37 +- src/gui/folderstatusview.h | 4 +- src/gui/folderwatcher.h | 4 +- src/gui/folderwatcher_linux.h | 2 +- src/gui/folderwatcher_mac.cpp | 2 +- src/gui/folderwizard.cpp | 2 +- src/gui/folderwizard.h | 6 +- src/gui/generalsettings.cpp | 35 +- src/gui/generalsettings.h | 2 +- src/gui/headerbanner.cpp | 146 -- src/gui/headerbanner.h | 93 - src/gui/internallinkwidget.cpp | 86 - src/gui/internallinkwidget.h | 59 - src/gui/internallinkwidget.ui | 168 -- src/gui/legalnotice.cpp | 4 +- src/gui/main.cpp | 24 +- src/gui/navigationpanehelper.h | 2 +- src/gui/networksettings.cpp | 3 +- src/gui/networksettings.h | 2 +- src/gui/notificationconfirmjob.cpp | 2 +- src/gui/ocsjob.cpp | 21 +- src/gui/ocsjob.h | 7 +- src/gui/ocssharejob.cpp | 11 +- src/gui/ocssharejob.h | 4 +- src/gui/owncloudgui.cpp | 126 +- src/gui/owncloudgui.h | 15 +- src/gui/owncloudsetupwizard.cpp | 20 +- src/gui/passwordinputdialog.h | 2 +- src/gui/proxyauthdialog.h | 4 +- src/gui/proxyauthhandler.h | 4 +- src/gui/remotewipe.cpp | 2 - src/gui/remotewipe.h | 6 +- src/gui/selectivesyncdialog.cpp | 4 +- src/gui/selectivesyncdialog.h | 8 +- src/gui/settingsdialog.cpp | 13 +- src/gui/settingsdialog.h | 9 +- src/gui/sharedialog.cpp | 494 ----- src/gui/sharedialog.h | 114 -- src/gui/sharedialog.ui | 217 --- src/gui/sharee.cpp | 156 -- src/gui/sharee.h | 50 +- src/gui/sharelinkwidget.cpp | 625 ------ src/gui/sharelinkwidget.h | 157 -- src/gui/sharelinkwidget.ui | 439 ----- src/gui/sharemanager.cpp | 23 +- src/gui/sharemanager.h | 173 +- src/gui/sharepermissions.h | 2 + src/gui/shareusergroupwidget.cpp | 1129 ----------- src/gui/shareusergroupwidget.h | 236 --- src/gui/shareusergroupwidget.ui | 154 -- src/gui/shellextensionsserver.cpp | 213 ++- src/gui/shellextensionsserver.h | 28 +- src/gui/socketapi/socketapi.cpp | 147 +- src/gui/socketapi/socketapi.h | 94 +- src/gui/socketapi/socketapi_p.h | 6 +- src/gui/sslerrordialog.h | 6 +- src/gui/syncrunfilelog.cpp | 2 +- src/gui/systray.cpp | 150 +- src/gui/systray.h | 63 +- src/gui/systray.mm | 117 +- src/gui/tooltipupdater.cpp | 2 +- src/gui/tray/ActivityActionButton.qml | 79 +- src/gui/tray/ActivityItem.qml | 49 +- src/gui/tray/ActivityItemActions.qml | 35 +- src/gui/tray/ActivityItemContent.qml | 27 +- src/gui/tray/ActivityList.qml | 84 +- src/gui/tray/CallNotificationDialog.qml | 4 +- src/gui/tray/CustomButton.qml | 60 +- src/gui/tray/CustomTextButton.qml | 48 - src/gui/tray/FileActivityDialog.qml | 40 - src/gui/tray/HeaderButton.qml | 2 +- src/gui/tray/NCButtonBackground.qml | 29 + src/gui/tray/NCButtonContents.qml | 61 + src/gui/tray/SyncStatus.qml | 35 +- src/gui/tray/TextButtonContents.qml | 36 + src/gui/tray/UnifiedSearchResultListItem.qml | 2 +- src/gui/tray/Window.qml | 150 +- src/gui/tray/activitydata.cpp | 39 +- src/gui/tray/activitydata.h | 15 +- src/gui/tray/activitylistmodel.cpp | 345 ++-- src/gui/tray/activitylistmodel.h | 79 +- src/gui/tray/asyncimageresponse.cpp | 24 +- src/gui/tray/asyncimageresponse.h | 4 +- src/gui/tray/notificationhandler.cpp | 5 +- src/gui/tray/notificationhandler.h | 4 +- src/gui/tray/sortedactivitylistmodel.cpp | 110 ++ src/gui/tray/sortedactivitylistmodel.h | 46 + src/gui/tray/syncstatussummary.h | 12 +- .../tray/unifiedsearchresultslistmodel.cpp | 41 +- src/gui/tray/unifiedsearchresultslistmodel.h | 20 +- src/gui/tray/usermodel.cpp | 164 +- src/gui/tray/usermodel.h | 98 +- src/gui/updater/ocupdater.h | 10 +- src/gui/updater/updateinfo.h | 8 +- src/gui/userinfo.h | 8 +- src/gui/userstatusselectormodel.h | 8 +- src/gui/wizard/abstractcredswizardpage.cpp | 2 +- src/gui/wizard/abstractcredswizardpage.h | 2 +- src/gui/wizard/flow2authcredspage.h | 6 +- src/gui/wizard/owncloudadvancedsetuppage.cpp | 20 +- src/gui/wizard/owncloudadvancedsetuppage.h | 18 +- src/gui/wizard/owncloudhttpcredspage.h | 4 +- src/gui/wizard/owncloudoauthcredspage.h | 6 +- src/gui/wizard/owncloudsetuppage.h | 8 +- src/gui/wizard/owncloudwizard.cpp | 25 +- src/gui/wizard/owncloudwizard.h | 24 +- src/gui/wizard/owncloudwizardcommon.cpp | 2 +- src/gui/wizard/postfixlineedit.h | 4 +- src/gui/wizard/slideshow.cpp | 2 + src/gui/wizard/slideshow.h | 11 +- src/gui/wizard/webviewpage.h | 6 +- src/gui/wizard/welcomepage.h | 2 +- src/libsync/CMakeLists.txt | 2 + src/libsync/abstractnetworkjob.cpp | 2 +- src/libsync/abstractnetworkjob.h | 22 +- ...abstractpropagateremotedeleteencrypted.cpp | 8 +- .../abstractpropagateremotedeleteencrypted.h | 4 +- src/libsync/accessmanager.cpp | 2 +- src/libsync/account.cpp | 40 +- src/libsync/account.h | 90 +- src/libsync/bandwidthmanager.h | 4 +- src/libsync/bulkpropagatorjob.cpp | 6 +- src/libsync/bulkpropagatorjob.h | 18 +- src/libsync/capabilities.cpp | 11 +- src/libsync/capabilities.h | 88 +- src/libsync/caseclashconflictsolver.cpp | 227 +++ src/libsync/caseclashconflictsolver.h | 107 ++ src/libsync/clientsideencryption.cpp | 216 ++- src/libsync/clientsideencryption.h | 67 +- src/libsync/clientsideencryptionjobs.cpp | 63 +- src/libsync/clientsideencryptionjobs.h | 22 +- src/libsync/configfile.cpp | 148 +- src/libsync/configfile.h | 120 +- src/libsync/cookiejar.h | 2 +- src/libsync/creds/abstractcredentials.h | 12 +- src/libsync/creds/dummycredentials.cpp | 4 +- src/libsync/creds/dummycredentials.h | 10 +- src/libsync/creds/httpcredentials.cpp | 6 +- src/libsync/creds/httpcredentials.h | 12 +- src/libsync/creds/keychainchunk.h | 12 +- src/libsync/datetimeprovider.h | 4 +- src/libsync/deletejob.h | 2 +- src/libsync/discovery.cpp | 188 +- src/libsync/discovery.h | 15 +- src/libsync/discoveryphase.cpp | 13 +- src/libsync/discoveryphase.h | 26 +- src/libsync/encryptfolderjob.cpp | 39 +- src/libsync/encryptfolderjob.h | 10 +- src/libsync/filesystem.cpp | 13 +- src/libsync/iconjob.cpp | 2 +- src/libsync/localdiscoverytracker.h | 4 +- src/libsync/lockfilejobs.cpp | 5 +- src/libsync/logger.cpp | 10 +- src/libsync/networkjobs.cpp | 4 +- src/libsync/networkjobs.h | 16 +- src/libsync/ocsprofileconnector.h | 2 +- src/libsync/ocsuserstatusconnector.h | 2 +- src/libsync/owncloudpropagator.cpp | 157 +- src/libsync/owncloudpropagator.h | 88 +- src/libsync/progressdispatcher.cpp | 3 + src/libsync/progressdispatcher.h | 36 +- src/libsync/propagatedownload.cpp | 142 +- src/libsync/propagatedownload.h | 12 +- src/libsync/propagatedownloadencrypted.cpp | 26 +- src/libsync/propagatedownloadencrypted.h | 2 +- src/libsync/propagateremotedelete.cpp | 7 +- .../propagateremotedeleteencrypted.cpp | 5 + ...opagateremotedeleteencryptedrootfolder.cpp | 9 +- src/libsync/propagateremotemkdir.cpp | 5 +- src/libsync/propagateremotemove.cpp | 14 +- src/libsync/propagateupload.h | 18 +- src/libsync/propagateuploadencrypted.cpp | 20 +- src/libsync/propagateuploadencrypted.h | 9 +- src/libsync/propagatorjobs.cpp | 57 +- src/libsync/pushnotifications.h | 8 +- src/libsync/putmultifilejob.h | 4 +- src/libsync/syncengine.cpp | 291 ++- src/libsync/syncengine.h | 176 +- src/libsync/syncfileitem.cpp | 9 + src/libsync/syncfileitem.h | 28 +- src/libsync/syncfilestatustracker.h | 6 +- src/libsync/syncoptions.h | 2 +- src/libsync/syncresult.h | 54 +- src/libsync/theme.cpp | 92 +- src/libsync/theme.h | 37 +- src/libsync/userstatusconnector.h | 10 +- src/libsync/vfs/cfapi/cfapiwrapper.cpp | 4 +- src/libsync/vfs/cfapi/hydrationjob.cpp | 41 +- src/libsync/vfs/cfapi/shellext/CMakeLists.txt | 183 +- .../cfapi/shellext/CustomStateProvider.idl | 21 + .../shellext/configvfscfapishellext.h.in | 20 + .../cfapi/shellext/customstateprovider.cpp | 104 + .../vfs/cfapi/shellext/customstateprovider.h | 46 + .../cfapi/shellext/customstateprovideripc.cpp | 104 + .../cfapi/shellext/customstateprovideripc.h | 43 + src/libsync/vfs/cfapi/shellext/dllmain.cpp | 19 +- src/libsync/vfs/cfapi/shellext/ipccommon.cpp | 50 + src/libsync/vfs/cfapi/shellext/ipccommon.h | 21 + .../vfs/cfapi/shellext/thumbnailprovider.cpp | 7 + .../vfs/cfapi/shellext/thumbnailprovider.h | 2 +- .../cfapi/shellext/thumbnailprovideripc.cpp | 27 +- src/libsync/vfs/cfapi/vfs_cfapi.cpp | 54 +- src/libsync/vfs/cfapi/vfs_cfapi.h | 2 +- src/libsync/vfs/suffix/vfs_suffix.cpp | 26 +- src/libsync/vfs/suffix/vfs_suffix.h | 13 +- src/libsync/vfs/xattr/vfs_xattr.cpp | 9 +- src/libsync/vfs/xattr/vfs_xattr.h | 10 +- test/CMakeLists.txt | 15 +- test/csync/vio_tests/check_vio_ext.cpp | 4 +- test/endtoendtestutils.cpp | 174 ++ test/endtoendtestutils.h | 98 + test/nextcloud_add_test.cmake | 37 + test/pushnotificationstestutils.h | 18 +- test/sharetestutils.cpp | 444 +++++ test/sharetestutils.h | 136 ++ test/syncenginetestutils.cpp | 70 +- test/syncenginetestutils.h | 70 +- test/testaccount.cpp | 2 +- test/testactivitydata.cpp | 203 +- test/testactivitylistmodel.cpp | 263 ++- test/testallfilesdeleted.cpp | 16 +- test/testasyncop.cpp | 2 +- test/testblacklist.cpp | 2 +- test/testcfapishellextensionsipc.cpp | 265 ++- test/testchunkingng.cpp | 3 +- test/testdownload.cpp | 4 +- test/teste2efiletransfer.cpp | 117 ++ test/teste2eserversetup.cpp | 59 + test/testfolderman.cpp | 219 ++- test/testfolderwatcher.cpp | 4 +- test/testhelper.cpp | 18 + test/testhelper.h | 23 + test/testlocaldiscovery.cpp | 25 +- test/testlockfile.cpp | 149 ++ test/testoauth.cpp | 6 +- test/testpermissions.cpp | 2 +- test/testsetuserstatusdialog.cpp | 10 +- test/testshareemodel.cpp | 442 +++++ test/testsharemodel.cpp | 981 ++++++++++ test/testsortedsharemodel.cpp | 196 ++ test/testsynccfapi.cpp | 25 +- test/testsyncconflict.cpp | 45 +- test/testsyncengine.cpp | 381 +++- test/testsyncfileitem.cpp | 2 +- test/testsyncfilestatustracker.cpp | 4 +- test/testsyncjournaldb.cpp | 50 +- test/testsyncmove.cpp | 27 +- test/testsyncvirtualfiles.cpp | 216 ++- test/testsyncxattr.cpp | 25 +- test/testunifiedsearchlistmodel.cpp | 2 +- test/testuploadreset.cpp | 6 +- test/themeutils.h | 4 +- theme.qrc.in | 1 + theme/Style/Style.qml | 13 +- theme/black/state-info.svg | 2 +- .../cfapishellext_custom_states/0-locked.svg | 1 + .../cfapishellext_custom_states/1-shared.svg | 1 + .../1024-0-locked.png | Bin 0 -> 12483 bytes .../1024-1-shared.png | Bin 0 -> 20840 bytes .../128-0-locked.png | Bin 0 -> 1064 bytes .../128-1-shared.png | Bin 0 -> 1424 bytes .../24-0-locked.png | Bin 0 -> 325 bytes .../24-1-shared.png | Bin 0 -> 405 bytes .../256-0-locked.png | Bin 0 -> 2257 bytes .../256-1-shared.png | Bin 0 -> 3666 bytes .../32-0-locked.png | Bin 0 -> 314 bytes .../32-1-shared.png | Bin 0 -> 379 bytes .../40-0-locked.png | Bin 0 -> 439 bytes .../40-1-shared.png | Bin 0 -> 566 bytes .../48-0-locked.png | Bin 0 -> 459 bytes .../48-1-shared.png | Bin 0 -> 585 bytes .../512-0-locked.png | Bin 0 -> 5037 bytes .../512-1-shared.png | Bin 0 -> 9135 bytes .../64-0-locked.png | Bin 0 -> 580 bytes .../64-1-shared.png | Bin 0 -> 656 bytes theme/lock-broken.svg | 52 +- theme/lock-http.svg | 62 +- theme/lock-https.svg | 44 +- theme/lock.svg | 1 + theme/white/state-info.svg | 2 +- translations/client_bg.ts | 1547 +++++++++------ translations/client_br.ts | 1517 +++++++++------ translations/client_ca.ts | 1626 ++++++++++------ translations/client_cs.ts | 1531 +++++++++------ translations/client_da.ts | 1517 +++++++++------ translations/client_de.ts | 1533 +++++++++------ translations/client_el.ts | 1519 +++++++++------ translations/client_en_GB.ts | 1531 +++++++++------ translations/client_eo.ts | 1513 +++++++++------ translations/client_es.ts | 1546 +++++++++------ translations/client_es_CL.ts | 1513 +++++++++------ translations/client_es_CO.ts | 1513 +++++++++------ translations/client_es_CR.ts | 1513 +++++++++------ translations/client_es_DO.ts | 1513 +++++++++------ translations/client_es_EC.ts | 1513 +++++++++------ translations/client_es_GT.ts | 1513 +++++++++------ translations/client_es_HN.ts | 1513 +++++++++------ translations/client_es_MX.ts | 1513 +++++++++------ translations/client_es_SV.ts | 1513 +++++++++------ translations/client_et.ts | 1513 +++++++++------ translations/client_eu.ts | 1546 +++++++++------ translations/client_fa.ts | 1513 +++++++++------ translations/client_fi.ts | 1579 +++++++++------ translations/client_fr.ts | 1571 +++++++++------ translations/client_gl.ts | 1517 +++++++++------ translations/client_he.ts | 1525 +++++++++------ translations/client_hr.ts | 1517 +++++++++------ translations/client_hu.ts | 1535 +++++++++------ translations/client_id.ts | 1513 +++++++++------ translations/client_is.ts | 1513 +++++++++------ translations/client_it.ts | 1517 +++++++++------ translations/client_ja.ts | 1517 +++++++++------ translations/client_ko.ts | 1517 +++++++++------ translations/client_lt_LT.ts | 1517 +++++++++------ translations/client_lv.ts | 1513 +++++++++------ translations/client_mk.ts | 1513 +++++++++------ translations/client_nb_NO.ts | 1519 +++++++++------ translations/client_nl.ts | 1525 +++++++++------ translations/client_oc.ts | 1513 +++++++++------ translations/client_pl.ts | 1541 +++++++++------ translations/client_pt.ts | 1513 +++++++++------ translations/client_pt_BR.ts | 1569 +++++++++------ translations/client_ro.ts | 1517 +++++++++------ translations/client_ru.ts | 1517 +++++++++------ translations/client_sc.ts | 1517 +++++++++------ translations/client_sk.ts | 1517 +++++++++------ translations/client_sl.ts | 1601 ++++++++++------ translations/client_sr.ts | 1513 +++++++++------ translations/client_sv.ts | 1547 +++++++++------ translations/client_th.ts | 1690 ++++++++++------- translations/client_tr.ts | 1577 +++++++++------ translations/client_uk.ts | 1529 +++++++++------ translations/client_zh_CN.ts | 1530 +++++++++------ translations/client_zh_HK.ts | 1531 +++++++++------ translations/client_zh_TW.ts | 1531 +++++++++------ 476 files changed, 71761 insertions(+), 38942 deletions(-) delete mode 100644 .clang-tidy create mode 100644 .github/workflows/clang-format.yml create mode 100644 .github/workflows/clang-tidy-review.yml create mode 100644 admin/nix/flake.nix create mode 100644 cmake/modules/GenerateIconsUtils.cmake create mode 100644 src/gui/accountsetupcommandlinemanager.cpp create mode 100644 src/gui/accountsetupcommandlinemanager.h create mode 100644 src/gui/accountsetupfromcommandlinejob.cpp create mode 100644 src/gui/accountsetupfromcommandlinejob.h create mode 100644 src/gui/caseclashfilenamedialog.cpp create mode 100644 src/gui/caseclashfilenamedialog.h create mode 100644 src/gui/caseclashfilenamedialog.ui create mode 100644 src/gui/filedetails/FileActivityView.qml create mode 100644 src/gui/filedetails/FileDetailsPage.qml create mode 100644 src/gui/filedetails/FileDetailsView.qml create mode 100644 src/gui/filedetails/FileDetailsWindow.qml create mode 100644 src/gui/filedetails/NCInputTextEdit.qml create mode 100644 src/gui/filedetails/NCInputTextField.qml create mode 100644 src/gui/filedetails/NCTabButton.qml create mode 100644 src/gui/filedetails/ShareDelegate.qml create mode 100644 src/gui/filedetails/ShareDetailsPage.qml create mode 100644 src/gui/filedetails/ShareView.qml create mode 100644 src/gui/filedetails/ShareeDelegate.qml create mode 100644 src/gui/filedetails/ShareeSearchField.qml create mode 100644 src/gui/filedetails/filedetails.cpp create mode 100644 src/gui/filedetails/filedetails.h create mode 100644 src/gui/filedetails/shareemodel.cpp create mode 100644 src/gui/filedetails/shareemodel.h create mode 100644 src/gui/filedetails/sharemodel.cpp create mode 100644 src/gui/filedetails/sharemodel.h create mode 100644 src/gui/filedetails/sortedsharemodel.cpp create mode 100644 src/gui/filedetails/sortedsharemodel.h delete mode 100644 src/gui/headerbanner.cpp delete mode 100644 src/gui/headerbanner.h delete mode 100644 src/gui/internallinkwidget.cpp delete mode 100644 src/gui/internallinkwidget.h delete mode 100644 src/gui/internallinkwidget.ui delete mode 100644 src/gui/sharedialog.cpp delete mode 100644 src/gui/sharedialog.h delete mode 100644 src/gui/sharedialog.ui delete mode 100644 src/gui/sharelinkwidget.cpp delete mode 100644 src/gui/sharelinkwidget.h delete mode 100644 src/gui/sharelinkwidget.ui delete mode 100644 src/gui/shareusergroupwidget.cpp delete mode 100644 src/gui/shareusergroupwidget.h delete mode 100644 src/gui/shareusergroupwidget.ui delete mode 100644 src/gui/tray/CustomTextButton.qml delete mode 100644 src/gui/tray/FileActivityDialog.qml create mode 100644 src/gui/tray/NCButtonBackground.qml create mode 100644 src/gui/tray/NCButtonContents.qml create mode 100644 src/gui/tray/TextButtonContents.qml create mode 100644 src/gui/tray/sortedactivitylistmodel.cpp create mode 100644 src/gui/tray/sortedactivitylistmodel.h create mode 100644 src/libsync/caseclashconflictsolver.cpp create mode 100644 src/libsync/caseclashconflictsolver.h create mode 100644 src/libsync/vfs/cfapi/shellext/CustomStateProvider.idl create mode 100644 src/libsync/vfs/cfapi/shellext/configvfscfapishellext.h.in create mode 100644 src/libsync/vfs/cfapi/shellext/customstateprovider.cpp create mode 100644 src/libsync/vfs/cfapi/shellext/customstateprovider.h create mode 100644 src/libsync/vfs/cfapi/shellext/customstateprovideripc.cpp create mode 100644 src/libsync/vfs/cfapi/shellext/customstateprovideripc.h create mode 100644 src/libsync/vfs/cfapi/shellext/ipccommon.cpp create mode 100644 src/libsync/vfs/cfapi/shellext/ipccommon.h create mode 100644 test/endtoendtestutils.cpp create mode 100644 test/endtoendtestutils.h create mode 100644 test/sharetestutils.cpp create mode 100644 test/sharetestutils.h create mode 100644 test/teste2efiletransfer.cpp create mode 100644 test/teste2eserversetup.cpp create mode 100644 test/testshareemodel.cpp create mode 100644 test/testsharemodel.cpp create mode 100644 test/testsortedsharemodel.cpp create mode 100644 theme/cfapishellext_custom_states/0-locked.svg create mode 100644 theme/cfapishellext_custom_states/1-shared.svg create mode 100644 theme/cfapishellext_custom_states/1024-0-locked.png create mode 100644 theme/cfapishellext_custom_states/1024-1-shared.png create mode 100644 theme/cfapishellext_custom_states/128-0-locked.png create mode 100644 theme/cfapishellext_custom_states/128-1-shared.png create mode 100644 theme/cfapishellext_custom_states/24-0-locked.png create mode 100644 theme/cfapishellext_custom_states/24-1-shared.png create mode 100644 theme/cfapishellext_custom_states/256-0-locked.png create mode 100644 theme/cfapishellext_custom_states/256-1-shared.png create mode 100644 theme/cfapishellext_custom_states/32-0-locked.png create mode 100644 theme/cfapishellext_custom_states/32-1-shared.png create mode 100644 theme/cfapishellext_custom_states/40-0-locked.png create mode 100644 theme/cfapishellext_custom_states/40-1-shared.png create mode 100644 theme/cfapishellext_custom_states/48-0-locked.png create mode 100644 theme/cfapishellext_custom_states/48-1-shared.png create mode 100644 theme/cfapishellext_custom_states/512-0-locked.png create mode 100644 theme/cfapishellext_custom_states/512-1-shared.png create mode 100644 theme/cfapishellext_custom_states/64-0-locked.png create mode 100644 theme/cfapishellext_custom_states/64-1-shared.png create mode 100644 theme/lock.svg diff --git a/.clang-format b/.clang-format index 9fdba8f2f..cf5ff2c05 100644 --- a/.clang-format +++ b/.clang-format @@ -1,65 +1,88 @@ -# Copyright (C) 2016 Olivier Goffart +--- +# SPDX-FileCopyrightText: 2019 Christoph Cullmann +# SPDX-FileCopyrightText: 2019 Gernot Gebhard # -# You may use this file under the terms of the 3-clause BSD license. -# See the file LICENSE from this package for details. - -# This is the clang-format configuration style to be used by Qt, -# based on the rules from https://wiki.qt.io/Qt_Coding_Style and -# https://wiki.qt.io/Coding_Conventions +# SPDX-License-Identifier: MIT +# This file got automatically created by ECM, do not edit +# See https://clang.llvm.org/docs/ClangFormatStyleOptions.html for the config options +# and https://community.kde.org/Policies/Frameworks_Coding_Style#Clang-format_automatic_code_formatting +# for clang-format tips & tricks --- -# Webkit style was loosely based on the Qt style +Language: JavaScript +DisableFormat: true +--- + +# Style for C++ +Language: Cpp + +# base is WebKit coding style: https://webkit.org/code-style-guidelines/ +# below are only things set that diverge from this style! BasedOnStyle: WebKit +# enforce C++11 (e.g. for std::vector> Standard: Cpp11 -ColumnLimit: 120 -# Disable reflow of qdoc comments: indentation rules are different. -# Translation comments are also excluded -CommentPragmas: "^!|^:" +# 4 spaces indent +TabWidth: 4 -# We want a space between the type and the star for pointer types -PointerBindsToType: false +# 2 * 80 wide lines +ColumnLimit: 160 -# We want to break before the operators, but not before a '=' -BreakBeforeBinaryOperators: NonAssignment +# sort includes inside line separated groups +SortIncludes: true -# Braces are usually attached, but not after functions or classes declaration -BreakBeforeBraces: Custom -BraceWrapping: - AfterClass: true - AfterControlStatement: false - AfterEnum: false - AfterFunction: true - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: true - AfterUnion: false - BeforeCatch: false - BeforeElse: false - IndentBraces: false - -# The coding style does not specify the following, but this is what gives -# results closest to the existing code. -AlignAfterOpenBracket: DontAlign -AlwaysBreakTemplateDeclarations: true +# break before braces on function, namespace and class definitions. +BreakBeforeBraces: Linux -# Ideally we should also allow less short function in a single line, but -# clang-format does not handle that -AllowShortFunctionsOnASingleLine: Inline +# CrlInstruction *a; +PointerAlignment: Right -# The coding style specifies some include order categories, but also tells to -# separate categories with an empty line. It does not specify the order within -# the categories. Since the SortInclude feature of clang-format does not -# re-order includes separated by empty lines, the feature is not used. -SortIncludes: false +# horizontally aligns arguments after an open bracket. +AlignAfterOpenBracket: Align -# macros for which the opening brace stays attached -ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCHMARK, QBENCHMARK_ONCE ] +# don't move all parameters to new line +AllowAllParametersOfDeclarationOnNextLine: false -# Allow two empty lines for structuring -MaxEmptyLinesToKeep: 2 -KeepEmptyLinesAtTheStartOfBlocks: false +# no single line functions +AllowShortFunctionsOnASingleLine: None -SpaceBeforeCpp11BracedList: false +# always break before you encounter multi line strings +AlwaysBreakBeforeMultilineStrings: true + +# don't move arguments to own lines if they are not all on the same +BinPackArguments: false + +# don't move parameters to own lines if they are not all on the same +BinPackParameters: false + +# In case we have an if statement with multiple lines the operator should be at the beginning of the line +# but we do not want to break assignments +BreakBeforeBinaryOperators: NonAssignment + +# format C++11 braced lists like function calls Cpp11BracedListStyle: true + +# do not put a space before C++11 braced lists +SpaceBeforeCpp11BracedList: false + +# remove empty lines +KeepEmptyLinesAtTheStartOfBlocks: false + +# no namespace indentation to keep indent level low +NamespaceIndentation: None + +# we use template< without space. +SpaceAfterTemplateKeyword: false + +# Always break after template declaration +AlwaysBreakTemplateDeclarations: true + +# macros for which the opening brace stays attached. +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCHMARK, QBENCHMARK_ONCE , wl_resource_for_each, wl_resource_for_each_safe ] + +# keep lambda formatting multi-line if not empty +AllowShortLambdasOnASingleLine: Empty + +# We do not want clang-format to put all arguments on a new line +AllowAllArgumentsOnNextLine: false diff --git a/.clang-tidy b/.clang-tidy deleted file mode 100644 index c064c54d8..000000000 --- a/.clang-tidy +++ /dev/null @@ -1,45 +0,0 @@ -Checks: '-*, - bugprone-*, - -bugprone-forward-declaration-namespace, - cppcoreguidelines-init-variables, - misc-*, - -misc-non-private-member-variables-in-classes, - modernize-avoid-bind, - modernize-concat-nested-namespaces, - modernize-deprecated-headers, - modernize-deprecated-ios-base-aliases, - modernize-loop-convert, - modernize-make-*, - modernize-raw-string-literal, - modernize-redundant-void-arg, - modernize-replace-*, - modernize-return-braced-init-list, - modernize-shrink-to-fit, - modernize-unary-static-assert, - modernize-use-auto, - modernize-use-bool-literals, - modernize-use-default-member-init, - modernize-use-emplace, - modernize-use-equals-delete, - modernize-use-nodiscard, - modernize-use-equals-default, - modernize-use-noexcept, - modernize-use-override, - modernize-use-nullptr, - modernize-use-transparent-functors, - modernize-use-uncaught-exceptions, - modernize-use-using, -' -WarningsAsErrors: '*' -HeaderFilterRegex: '.*' -AnalyzeTemporaryDtors: false -FormatStyle: none -CheckOptions: - - key: bugprone-assert-side-effect.AssertMacros - value: 'assert;Q_ASSERT' - - key: bugprone-dangling-handle.HandleClasses - value: 'std::basic_string_view;std::experimental::basic_string_view;QStringView' - - key: bugprone-sizeof-expression.WarnOnSizeOfIntegerExpression - value: 1 - - key: modernize-use-default-member-init.UseAssignment - value: 1 diff --git a/.drone.yml b/.drone.yml index 80772184a..ac25d7f66 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,23 +3,25 @@ name: qt-5.15 steps: - name: cmake - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 volumes: - name: build path: /drone/build commands: - cd /drone/build - - cmake -G Ninja -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 ../src + - cmake -G Ninja -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DADD_E2E_TESTS=ON -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 ../src + - name: compile - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 volumes: - name: build path: /drone/build commands: - cd /drone/build - ninja + - name: test - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 volumes: - name: build path: /drone/build @@ -29,6 +31,30 @@ steps: - chown -R test:test . - su -c 'ASAN_OPTIONS=detect_leaks=0 xvfb-run ctest --output-on-failure' test +services: + - name: server + image: ghcr.io/nextcloud/continuous-integration-server:latest # also change in updateScreenshots.sh + environment: + EVAL: true + SERVER_VERSION: 'stable24' + commands: + - BRANCH="$SERVER_VERSION" /usr/local/bin/initnc.sh + - echo 127.0.0.1 server >> /etc/hosts + - su www-data -c "OC_PASS=user1 php /var/www/html/occ user:add --password-from-env --display-name='User One' user1" + - su www-data -c "OC_PASS=user2 php /var/www/html/occ user:add --password-from-env --display-name='User Two' user2" + - su www-data -c "OC_PASS=user3 php /var/www/html/occ user:add --password-from-env --display-name='User Three' user3" + - su www-data -c "php /var/www/html/occ user:setting user2 files quota 1G" + - su www-data -c "php /var/www/html/occ group:add users" + - su www-data -c "php /var/www/html/occ group:adduser users user1" + - su www-data -c "php /var/www/html/occ group:adduser users user2" + - su www-data -c "git clone --depth=1 -b $SERVER_VERSION https://github.com/nextcloud/activity.git /var/www/html/apps/activity/" + - su www-data -c "php /var/www/html/occ app:enable activity" + - su www-data -c "git clone --depth=1 -b $SERVER_VERSION https://github.com/nextcloud/text.git /var/www/html/apps/text/" + - su www-data -c "php /var/www/html/occ app:enable text" + - su www-data -c "git clone --depth=1 -b $SERVER_VERSION https://github.com/nextcloud/end_to_end_encryption.git /var/www/html/apps/end_to_end_encryption/" + - su www-data -c "php /var/www/html/occ app:enable end_to_end_encryption" + - /usr/local/bin/run.sh + volumes: - name: build temp: {} @@ -47,15 +73,15 @@ name: qt-5.15-clang steps: - name: cmake - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 volumes: - name: build path: /drone/build commands: - cd /drone/build - - cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-14 -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 ../src + - cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-14 -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DADD_E2E_TESTS=ON -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 ../src - name: compile - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 volumes: - name: build path: /drone/build @@ -63,7 +89,7 @@ steps: - cd /drone/build - ninja - name: test - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 volumes: - name: build path: /drone/build @@ -72,13 +98,30 @@ steps: - useradd -m -s /bin/bash test - chown -R test:test . - su -c 'ASAN_OPTIONS=detect_leaks=0 xvfb-run ctest --output-on-failure' test -- name: clang-tidy - image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 - volumes: - - name: build - path: /drone/build - commands: - - "! run-clang-tidy-10 -j$(nproc) -p /drone/build -header-filter $PWD -quiet | grep -A 5 ': error:'" + +services: + - name: server + image: ghcr.io/nextcloud/continuous-integration-server:latest # also change in updateScreenshots.sh + environment: + EVAL: true + SERVER_VERSION: 'stable24' + commands: + - BRANCH="$SERVER_VERSION" /usr/local/bin/initnc.sh + - echo 127.0.0.1 server >> /etc/hosts + - su www-data -c "OC_PASS=user1 php /var/www/html/occ user:add --password-from-env --display-name='User One' user1" + - su www-data -c "OC_PASS=user2 php /var/www/html/occ user:add --password-from-env --display-name='User Two' user2" + - su www-data -c "OC_PASS=user3 php /var/www/html/occ user:add --password-from-env --display-name='User Three' user3" + - su www-data -c "php /var/www/html/occ user:setting user2 files quota 1G" + - su www-data -c "php /var/www/html/occ group:add users" + - su www-data -c "php /var/www/html/occ group:adduser users user1" + - su www-data -c "php /var/www/html/occ group:adduser users user2" + - su www-data -c "git clone --depth=1 -b $SERVER_VERSION https://github.com/nextcloud/activity.git /var/www/html/apps/activity/" + - su www-data -c "php /var/www/html/occ app:enable activity" + - su www-data -c "git clone --depth=1 -b $SERVER_VERSION https://github.com/nextcloud/text.git /var/www/html/apps/text/" + - su www-data -c "php /var/www/html/occ app:enable text" + - su www-data -c "git clone --depth=1 -b $SERVER_VERSION https://github.com/nextcloud/end_to_end_encryption.git /var/www/html/apps/end_to_end_encryption/" + - su www-data -c "php /var/www/html/occ app:enable end_to_end_encryption" + - /usr/local/bin/run.sh volumes: - name: build @@ -98,7 +141,7 @@ name: AppImage steps: - name: build - image: ghcr.io/nextcloud/continuous-integration-client-appimage:client-appimage-5 + image: ghcr.io/nextcloud/continuous-integration-client-appimage:client-appimage-6 environment: CI_UPLOAD_GIT_TOKEN: from_secret: CI_UPLOAD_GIT_TOKEN diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 000000000..77ca2acf0 --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,20 @@ +name: Clang Format Checker +on: + pull_request: + types: [opened, synchronize, reopened] +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2 + - uses: cpp-linter/cpp-linter-action@v2.1.1 + id: linter + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + style: file + lines-changed-only: true + version: 14 + - name: Fail fast?! + if: steps.linter.outputs.checks-failed > 0 + run: echo "Some files failed the linting checks!" diff --git a/.github/workflows/clang-tidy-review.yml b/.github/workflows/clang-tidy-review.yml new file mode 100644 index 000000000..7a727059c --- /dev/null +++ b/.github/workflows/clang-tidy-review.yml @@ -0,0 +1,41 @@ +name: clang-tidy-review + +# You can be more specific, but it currently only works on pull requests +on: [pull_request] + +jobs: + clang-tidy: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 2 + - name: Install clang-tidy + run: | + sudo apt-get update + sudo apt-get install -y clang-tidy + sudo apt-get install -y ninja-build zlib1g-dev texlive-latex-base qtwebengine5-dev qttools5-dev-tools qttools5-dev qtquickcontrols2-5-dev qt5keychain-dev qtdeclarative5-dev qtbase5-dev python3-sphinx libssl-dev libsqlite3-dev libqt5websockets5-dev libqt5svg5-dev pkg-config libkf5archive-dev libcloudproviders-dev libcmocka-dev libdbus-1-dev qtbase5-private-dev qt5-qmake inkscape + - name: Prepare compile_commands.json + run: | + cmake -G Ninja -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 + cd build && ninja + - name: Create results directory + run: | + mkdir clang-tidy-result + - name: Analyze + run: | + git diff -U0 HEAD^ | clang-tidy-diff -checks='-*,modernize-use-auto,modernize-use-using,modernize-use-nodiscard,modernize-use-nullptr,modernize-use-override,cppcoreguidelines-pro-type-static-cast-downcast' -p1 -path build -export-fixes clang-tidy-result/fixes.yml + - name: Run clang-tidy-pr-comments action + uses: platisd/clang-tidy-pr-comments@master + with: + # The GitHub token (or a personal access token) + github_token: ${{ secrets.GITHUB_TOKEN }} + # The path to the clang-tidy fixes generated previously + clang_tidy_fixes: clang-tidy-result/fixes.yml + # Optionally set to true if you want the Action to request + # changes in case warnings are found + request_changes: true + # Optionally set the number of comments per review + # to avoid GitHub API timeouts for heavily loaded + # pull requests + suggestions_per_comment: 10 diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 527e8fe8b..88378c1f5 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -9,7 +9,7 @@ jobs: build: name: Build runs-on: ubuntu-latest - container: ghcr.io/nextcloud/continuous-integration-client:client-5.15-9 + container: ghcr.io/nextcloud/continuous-integration-client:client-5.15-11 env: SONAR_SERVER_URL: "https://sonarcloud.io" BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed diff --git a/.github/workflows/windows-build-and-test.yml b/.github/workflows/windows-build-and-test.yml index 8ae1085ad..593392853 100644 --- a/.github/workflows/windows-build-and-test.yml +++ b/.github/workflows/windows-build-and-test.yml @@ -1,4 +1,4 @@ -name: Build and Test +name: Windows Build and Test on: push: branches: @@ -72,7 +72,7 @@ jobs: $binFolder = "$buildFolder\bin" - & OpenCppCoverage.exe --quiet --sources ${{ github.workspace }} --modules $binFolder\*.dll* --export_type cobertura:${{ env.COBERTURA_COVERAGE_FILE }} --cover_children -- ctest --output-on-failure --timeout 300 + & OpenCppCoverage.exe --optimized_build --quiet --sources ${{ github.workspace }} --modules $binFolder\*.dll* --export_type cobertura:${{ env.COBERTURA_COVERAGE_FILE }} --cover_children -- ctest --output-on-failure --timeout 300 } runTestsAndCreateCoverage diff --git a/.tag b/.tag index aaed0d4c1..d4f2a6cdb 100644 --- a/.tag +++ b/.tag @@ -1 +1 @@ -3ffb9827ba813c9163fafb2ab95e79efc46efe73 +292d6973a33c08950bc3955d9d2b20ffafc58957 diff --git a/.tx/config b/.tx/config index 838212681..9d9454973 100644 --- a/.tx/config +++ b/.tx/config @@ -1,6 +1,6 @@ [main] host = https://www.transifex.com -lang_map = th_TH: th, ja_JP: ja, et_EE: et, bg_BG: bg, cs_CZ: cs, hu_HU: hu, nb_NO: nb, sk_SK: sk, pt_PT: pt, de_DE: de, fi_FI: fi +lang_map = bg_BG: bg, de_DE: de, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, pt_PT: pt, et_EE: et [o:nextcloud:p:nextcloud:r:client] file_filter = translations/client_.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d26d5a21..7048016cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,41 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.6.1] - 2022-10-18 + +### Added + +### Changed +* Improve 'Handle local file editing' feature by @mgallien in https://github.com/nextcloud/desktop/pull/5054 +* Update after tx migrate by @tobiasKaminsky in https://github.com/nextcloud/desktop/pull/5019 +* Bring back .lnk files on Windows and always treat them as non-virtual files by @allexzander in https://github.com/nextcloud/desktop/pull/4968 + +### Fixed +* Fix two factor auth notification: activity item was disabled by @camilasan in https://github.com/nextcloud/desktop/pull/5057 +* Fix account not found when doing local file editing by @mgallien in https://github.com/nextcloud/desktop/pull/5056 +* Check token for edit locally requests by @mgallien in https://github.com/nextcloud/desktop/pull/5055 +* Fix command-line client: do not trust SSL certificates by default, unless '--trust' option is set by @allexzander in https://github.com/nextcloud/desktop/pull/5022 +* Fix invisible user status selector button not being checked when user is in Offline mode by @claucambra in https://github.com/nextcloud/desktop/pull/5012 +* Fix the dismiss button: display it whenever possible by @camilasan in https://github.com/nextcloud/desktop/pull/4989 +* Fix predefined status text formatting by @claucambra in https://github.com/nextcloud/desktop/pull/4987 +* Fix sync progress bar colours in dark mode by @claucambra in https://github.com/nextcloud/desktop/pull/4986 +* Fix 'Reply' primary property. by @camilasan in https://github.com/nextcloud/desktop/pull/4985 +* Fix link shares default expire date being enforced as maximum expire date even when maximum date enforcement is disabled on the server by @claucambra in https://github.com/nextcloud/desktop/pull/4982 +* Use correct version copmparison on NSIS updater: fix update from rc by @mgallien in https://github.com/nextcloud/desktop/pull/4979 +* Ensure strings in main window QML are presented as plain text and not HTML by @claucambra in https://github.com/nextcloud/desktop/pull/4972 +* Improve handling of file name clashes by @claucambra in https://github.com/nextcloud/desktop/pull/4970 +* Ensure placeholder message in emoji picker wraps correctly by @claucambra in https://github.com/nextcloud/desktop/pull/4960 +* Do not format text in QML components as HTML by @claucambra in https://github.com/nextcloud/desktop/pull/4944 +* Ensure that the file being processed has had its etag properly sanitised, log etag more by @claucambra in https://github.com/nextcloud/desktop/pull/4940 +* Deallocate call notification dialog objects when closed by @claucambra in https://github.com/nextcloud/desktop/pull/4939 +* Fix low-resolution file changed overlay icons in activities by @claucambra in https://github.com/nextcloud/desktop/pull/4930 +* Accept valid lsColJob reply XML content types by @claucambra in https://github.com/nextcloud/desktop/pull/4919 +* Fix menu bar height calculation on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4917 +* Bugfix/conflict resolution when selecting folder by @allexzander in https://github.com/nextcloud/desktop/pull/4914 +* Fix add account window text clipping, enlarge text by @claucambra in https://github.com/nextcloud/desktop/pull/4910 +* Fix selective sync abort error by @allexzander in https://github.com/nextcloud/desktop/pull/4903 +* Fix wrong estimated time when doing sync by @allexzander in https://github.com/nextcloud/desktop/pull/4902 + ## [3.6.0] - 2022-09-06 ### Added @@ -264,7 +299,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Move CFAPI shell extensions variables to root CMakeLists. by @allexzander in https://github.com/nextcloud/desktop/pull/4810 ## [ChangeLog - Legacy][legacy] - +[3.6.1]: https://github.com/nextcloud/desktop/compare/v3.6.0...v3.6.1 [3.6.0]: https://github.com/nextcloud/desktop/compare/v3.6.0-rc1...v3.6.0 [3.6.0-rc1]: https://github.com/nextcloud/desktop/compare/v3.5.0...v3.6.0-rc1 -[legacy]: https://github.com/nextcloud/desktop/blob/master/ChangeLog%20-%20Legacy \ No newline at end of file +[legacy]: https://github.com/nextcloud/desktop/blob/master/ChangeLog%20-%20Legacy diff --git a/CMakeLists.txt b/CMakeLists.txt index a32c1cee2..475cef06b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.16) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) cmake_policy(SET CMP0071 NEW) # Enable use of QtQuick compiler/generated code project(client) @@ -16,6 +16,10 @@ set( CFAPI_SHELL_EXTENSIONS_LIB_NAME CfApiShellExtensions ) set( CFAPI_SHELLEXT_APPID_REG "{E314A650-DCA4-416E-974E-18EA37C213EA}") set( CFAPI_SHELLEXT_APPID_DISPLAY_NAME "${APPLICATION_NAME} CfApi Shell Extensions" ) +set( CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID "1E62D59A-6EA4-476C-B707-4A32E88ED822" ) +set( CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG "{${CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID}}" ) +set( CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME "${APPLICATION_NAME} Custom State Handler" ) + set( CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID "6FF9B5B6-389F-444A-9FDD-A286C36EA079" ) set( CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG "{${CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID}}" ) set( CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME "${APPLICATION_NAME} Thumbnail Handler" ) @@ -164,6 +168,9 @@ option(BUILD_LIBRARIES_ONLY "BUILD_LIBRARIES_ONLY" OFF) # build the GUI component, when disabled only nextcloudcmd is built option(BUILD_GUI "BUILD_GUI" ON) +# build the tests +option(BUILD_TESTING "BUILD_TESTING" ON) + # When this option is enabled, 5xx errors are not added to the blacklist # Normally you don't want to enable this option because if a particular file # triggers a bug on the server, you want the file to be blacklisted. diff --git a/README.md b/README.md index 06b300e4c..38cb45c15 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,10 @@ with your computer. #### :memo: Step by step instructions -##### Clone the repo and create build directory +##### Clone the repo ``` $ git clone https://github.com/nextcloud/desktop.git $ cd desktop -$ mkdir build -$ cd build ``` ##### Compile and install @@ -33,14 +31,14 @@ $ cd build ##### Linux & Mac OS ``` -$ cmake .. -DCMAKE_INSTALL_PREFIX=~/nextcloud-desktop-client -DCMAKE_BUILD_TYPE=Debug -$ make install +$ cmake -S . -B build -DCMAKE_INSTALL_PREFIX=~/nextcloud-desktop-client -DCMAKE_BUILD_TYPE=Debug +$ cmake --build build --target install ``` ##### Windows ``` -$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=$USERPROFILE\nextcloud-desktop-client -DCMAKE_BUILD_TYPE=Debug +$ cmake -S . -B build -G "Visual Studio 15 2017 Win64" -DCMAKE_INSTALL_PREFIX=$USERPROFILE\nextcloud-desktop-client -DCMAKE_BUILD_TYPE=Debug $ cmake --build . --config Debug --target install ``` diff --git a/VERSION.cmake b/VERSION.cmake index 705694625..3a2ad05a1 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -1,7 +1,7 @@ set( MIRALL_VERSION_MAJOR 3 ) -set( MIRALL_VERSION_MINOR 6 ) -set( MIRALL_VERSION_PATCH 4 ) -set( MIRALL_VERSION_YEAR 2022 ) +set( MIRALL_VERSION_MINOR 7 ) +set( MIRALL_VERSION_PATCH 0 ) +set( MIRALL_VERSION_YEAR 2023 ) set( MIRALL_SOVERSION 0 ) # Minimum supported server version according to https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html diff --git a/admin/linux/build-appimage.sh b/admin/linux/build-appimage.sh index 99a32dacb..c6f255333 100755 --- a/admin/linux/build-appimage.sh +++ b/admin/linux/build-appimage.sh @@ -34,6 +34,7 @@ cmake \ -D BUILD_UPDATER=$BUILD_UPDATER \ -D MIRALL_VERSION_BUILD=$BUILDNR \ -D MIRALL_VERSION_SUFFIX="$VERSION_SUFFIX" \ + -D CMAKE_UNITY_BUILD=ON \ ${DESKTOP_CLIENT_ROOT} cmake --build . --target all DESTDIR=/app cmake --install . diff --git a/admin/nix/flake.nix b/admin/nix/flake.nix new file mode 100644 index 000000000..c2bf70772 --- /dev/null +++ b/admin/nix/flake.nix @@ -0,0 +1,143 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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. + */ + +{ + description = "A flake for the Nextcloud desktop client"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + with flake-utils.lib; + eachSystem [ "aarch64-linux" "x86_64-linux" "aarch64-darwin" "x86_64-darwin" ] (system: + let + pkgs = import nixpkgs { + inherit system; + }; + + inherit (pkgs.lib.lists) optional optionals; + inherit (pkgs.lib.strings) hasPrefix optionalString; + isARM = hasPrefix "aarch64" system; + + buildMacOSSymlinks = pkgs.runCommand "nextcloud-build-symlinks" {} '' + mkdir -p $out/bin + ln -s /usr/bin/xcrun /usr/bin/xcodebuild /usr/bin/iconutil $out/bin + ''; + + nativeBuildInputs = with pkgs; [ + cmake + extra-cmake-modules + pkg-config + inkscape + qt5.wrapQtAppsHook + ] ++ optionals stdenv.isDarwin [ + buildMacOSSymlinks + ]; + + buildInputs = with pkgs; [ + sqlite + openssl + pcre + + qt5.qtbase + qt5.qtquickcontrols2 + qt5.qtsvg + qt5.qtgraphicaleffects + qt5.qtdeclarative + qt5.qttools + qt5.qtwebsockets + + libsForQt5.karchive + libsForQt5.qtkeychain + ] ++ optionals (!isARM) [ + # Qt WebEngine not available on ARM + qt5.qtwebengine + ] ++ optionals stdenv.isLinux [ + inotify-tools + libcloudproviders + libsecret + + libsForQt5.breeze-icons + libsForQt5.qqc2-desktop-style + libsForQt5.kio + ] ++ optionals stdenv.isDarwin [ + libsForQt5.qt5.qtmacextras + + darwin.apple_sdk.frameworks.UserNotifications + ]; + + packages.default = with pkgs; stdenv.mkDerivation rec { + inherit nativeBuildInputs buildInputs; + pname = "nextcloud-client"; + version = "dev"; + src = ../../.; + + dontStrip = true; + enableDebugging = true; + separateDebugInfo = false; + enableParallelBuilding = true; + + preConfigure = optionals stdenv.isLinux [ + '' + substituteInPlace shell_integration/libcloudproviders/CMakeLists.txt \ + --replace "PKGCONFIG_GETVAR(dbus-1 session_bus_services_dir _install_dir)" "set(_install_dir "\$\{CMAKE_INSTALL_DATADIR\}/dbus-1/service")" + '' + ] ++ optionals stdenv.isDarwin [ + '' + substituteInPlace shell_integration/MacOSX/CMakeLists.txt \ + --replace "-target FinderSyncExt -configuration Release" "-scheme FinderSyncExt -configuration Release -derivedDataPath $ENV{NIX_BUILD_TOP}/derivedData" + '' + ]; + + cmakeFlags = optionals stdenv.isLinux [ + "-DCMAKE_INSTALL_LIBDIR=lib" # expected to be prefix-relative by build code setting RPATH + "-DNO_SHIBBOLETH=1" # allows to compile without qtwebkit + ] ++ optionals stdenv.isDarwin [ + "-DQT_ENABLE_VERBOSE_DEPLOYMENT=TRUE" + "-DBUILD_OWNCLOUD_OSX_BUNDLE=OFF" + ]; + postPatch = optionalString stdenv.isLinux '' + for file in src/libsync/vfs/*/CMakeLists.txt; do + substituteInPlace $file \ + --replace "PLUGINDIR" "KDE_INSTALL_PLUGINDIR" + done + ''; + postFixup = optionalString stdenv.isLinux '' + wrapProgram "$out/bin/nextcloud" \ + --set LD_LIBRARY_PATH ${lib.makeLibraryPath [ libsecret ]} \ + --set PATH ${lib.makeBinPath [ xdg-utils ]} \ + --set QML_DISABLE_DISK_CACHE "1" + ''; + }; + + apps.default = mkApp { + name = "nextcloud"; + drv = packages.default; + }; + + in { + inherit packages apps; + devShell = pkgs.mkShell { + inherit buildInputs; + nativeBuildInputs = with pkgs; nativeBuildInputs ++ optionals (stdenv.isLinux) [ + gdb + qtcreator + ]; + name = "nextcloud-client-dev-shell"; + }; + } + ); +} diff --git a/admin/osx/gen_sym_files.py b/admin/osx/gen_sym_files.py index 1d9fa2489..beaece4dc 100755 --- a/admin/osx/gen_sym_files.py +++ b/admin/osx/gen_sym_files.py @@ -31,7 +31,7 @@ def extractDeps(macho): if m: path = resolvePath(m.group(0)) if not os.path.exists(path): - logging.warning("Non-existant file found in dependencies, ignoring: [%s]", path) + logging.warning("Non-existent file found in dependencies, ignoring: [%s]", path) continue deps.append(path) return deps diff --git a/admin/win/msi/Nextcloud.wxs b/admin/win/msi/Nextcloud.wxs index 05b1ba595..5e2bb2930 100644 --- a/admin/win/msi/Nextcloud.wxs +++ b/admin/win/msi/Nextcloud.wxs @@ -148,7 +148,7 @@ - + diff --git a/admin/win/msi/RegistryCleanup.vbs.in b/admin/win/msi/RegistryCleanup.vbs.in index 35c3b7651..0eeb1a4ed 100644 --- a/admin/win/msi/RegistryCleanup.vbs.in +++ b/admin/win/msi/RegistryCleanup.vbs.in @@ -53,19 +53,25 @@ End Function Function RegistryCleanupCfApiShellExtensions() Set objRegistry = GetObject(strObjRegistry) - strShellExtThumbnailHandlerAppId = "Software\Classes\AppID\@CFAPI_SHELLEXT_APPID_REG@" + strShellExtAppId = "Software\Classes\AppID\@CFAPI_SHELLEXT_APPID_REG@" + strShellExtThumbnailHandlerClsId = "Software\Classes\CLSID\@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG@" + strShellExtCustomStateHandlerClsId = "Software\Classes\CLSID\@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG@" rootKey = HKEY_CURRENT_USER - If objRegistry.EnumKey(rootKey, strShellExtThumbnailHandlerAppId, arrSubKeys) = 0 Then - RegistryDeleteKeyRecursive rootKey, strShellExtThumbnailHandlerAppId + If objRegistry.EnumKey(rootKey, strShellExtAppId, arrSubKeys) = 0 Then + RegistryDeleteKeyRecursive rootKey, strShellExtAppId End If If objRegistry.EnumKey(rootKey, strShellExtThumbnailHandlerClsId, arrSubKeys) = 0 Then RegistryDeleteKeyRecursive rootKey, strShellExtThumbnailHandlerClsId End If + If objRegistry.EnumKey(rootKey, strShellExtCustomStateHandlerClsId, arrSubKeys) = 0 Then + RegistryDeleteKeyRecursive rootKey, strShellExtCustomStateHandlerClsId + End If + End Function Function RegistryCleanup() diff --git a/admin/win/msi/collect-transform.xsl.in b/admin/win/msi/collect-transform.xsl.in index 475788d83..63d335307 100644 --- a/admin/win/msi/collect-transform.xsl.in +++ b/admin/win/msi/collect-transform.xsl.in @@ -26,13 +26,10 @@ - + - - - diff --git a/cmake/modules/ECMAddAppIcon.cmake b/cmake/modules/ECMAddAppIcon.cmake index 61dba6c42..bd27b0590 100644 --- a/cmake/modules/ECMAddAppIcon.cmake +++ b/cmake/modules/ECMAddAppIcon.cmake @@ -102,11 +102,13 @@ include(CMakeParseArguments) function(ecm_add_app_icon appsources) set(options) - set(oneValueArgs OUTFILE_BASENAME ICON_INDEX) + set(oneValueArgs OUTFILE_BASENAME ICON_INDEX DO_NOT_GENERATE_RC_FILE) set(multiValueArgs ICONS SIDEBAR_ICONS RC_DEPENDENCIES) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT ARG_ICON_INDEX) - set(ARG_ICON_INDEX 1) + if (ARG_DO_NOT_GENERATE_RC_FILE) + set (_do_not_generate_rc_file TRUE) + else() + set (_do_not_generate_rc_file FALSE) endif() if(NOT ARG_ICONS) @@ -211,15 +213,17 @@ function(ecm_add_app_icon appsources) DEPENDS ${deps} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) - # this bit's a little hacky to make the dependency stuff work - file(WRITE "${_outfilename}.rc.in" "IDI_ICON${ARG_ICON_INDEX} ICON DISCARDABLE \"${_outfilename}.ico\"\n") - add_custom_command( - OUTPUT "${_outfilename}.rc" - COMMAND ${CMAKE_COMMAND} - ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc" - DEPENDS ${ARG_RC_DEPENDENCIES} "${_outfilename}.ico" - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - ) + if (NOT _do_not_generate_rc_file) + # this bit's a little hacky to make the dependency stuff work + file(WRITE "${_outfilename}.rc.in" "IDI_ICON${ARG_ICON_INDEX} ICON DISCARDABLE \"${_outfilename}.ico\"\n") + add_custom_command( + OUTPUT "${_outfilename}.rc" + COMMAND ${CMAKE_COMMAND} + ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc" + DEPENDS ${ARG_RC_DEPENDENCIES} "${_outfilename}.ico" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + ) + endif() endfunction() if (IcoTool_FOUND) diff --git a/cmake/modules/GenerateIconsUtils.cmake b/cmake/modules/GenerateIconsUtils.cmake new file mode 100644 index 000000000..e37b04cfe --- /dev/null +++ b/cmake/modules/GenerateIconsUtils.cmake @@ -0,0 +1,58 @@ +# UPSTREAM our ECMAddAppIcon.cmake then require that version here +# find_package(ECM 1.7.0 REQUIRED NO_MODULE) +# list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) +include(ECMAddAppIcon) + +find_program(SVG_CONVERTER + NAMES inkscape inkscape.exe rsvg-convert + REQUIRED + HINTS "C:\\Program Files\\Inkscape\\bin" "/usr/bin" ENV SVG_CONVERTER_DIR) +# REQUIRED keyword is only supported on CMake 3.18 and above +if (NOT SVG_CONVERTER) + message(FATAL_ERROR "Could not find a suitable svg converter. Set SVG_CONVERTER_DIR to the path of either the inkscape or rsvg-convert executable.") +endif() + +function(generate_sized_png_from_svg icon_path size) + set(options) + set(oneValueArgs OUTPUT_ICON_NAME OUTPUT_ICON_FULL_NAME_WLE OUTPUT_ICON_PATH) + set(multiValueArgs) + + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + get_filename_component(icon_name_dir ${icon_path} DIRECTORY) + get_filename_component(icon_name_wle ${icon_path} NAME_WLE) + + if (ARG_OUTPUT_ICON_NAME) + set(icon_name_wle ${ARG_OUTPUT_ICON_NAME}) + endif () + + if (ARG_OUTPUT_ICON_PATH) + set(icon_name_dir ${ARG_OUTPUT_ICON_PATH}) + endif () + + set(output_icon_full_name_wle "${size}-${icon_name_wle}") + + if (ARG_OUTPUT_ICON_FULL_NAME_WLE) + set(output_icon_full_name_wle ${ARG_OUTPUT_ICON_FULL_NAME_WLE}) + endif () + + if (EXISTS "${icon_name_dir}/${output_icon_full_name_wle}.png") + return() + endif() + + set(icon_output_name "${output_icon_full_name_wle}.png") + message(STATUS "Generate ${icon_output_name}") + execute_process(COMMAND + "${SVG_CONVERTER}" -w ${size} -h ${size} "${icon_path}" -o "${icon_output_name}" + WORKING_DIRECTORY "${icon_name_dir}" + RESULT_VARIABLE + SVG_CONVERTER_SIDEBAR_ERROR + OUTPUT_QUIET + ERROR_QUIET) + + if (SVG_CONVERTER_SIDEBAR_ERROR) + message(FATAL_ERROR + "${SVG_CONVERTER} could not generate icon: ${SVG_CONVERTER_SIDEBAR_ERROR}") + else() + endif() +endfunction() diff --git a/cmake/modules/NSIS.template.in b/cmake/modules/NSIS.template.in index 0f44ab2b4..6a02525f8 100644 --- a/cmake/modules/NSIS.template.in +++ b/cmake/modules/NSIS.template.in @@ -486,20 +486,19 @@ SectionEnd File "${BUILD_PATH}\vcredist_x86.exe" File "${BUILD_PATH}\vcredist_x64.exe" Call InstallRedistributables - CreateDirectory "$INSTDIR\shellext" !define LIBRARY_COM !define LIBRARY_SHELL_EXTENSION !define LIBRARY_IGNORE_VERSION ${If} ${RunningX64} !define LIBRARY_X64 - !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCUtil_x64.dll" "$INSTDIR\shellext\OCUtil_x64.dll" "$INSTDIR\shellext" - !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCOverlays_x64.dll" "$INSTDIR\shellext\OCOverlays_x64.dll" "$INSTDIR\shellext" - !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCContextMenu_x64.dll" "$INSTDIR\shellext\OCContextMenu_x64.dll" "$INSTDIR\shellext" + !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCUtil_x64.dll" "$INSTDIR\OCUtil_x64.dll" "$INSTDIR" + !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCOverlays_x64.dll" "$INSTDIR\OCOverlays_x64.dll" "$INSTDIR" + !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCContextMenu_x64.dll" "$INSTDIR\OCContextMenu_x64.dll" "$INSTDIR" !undef LIBRARY_X64 ${Else} - !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCUtil_x86.dll" "$INSTDIR\shellext\OCUtil_x86.dll" "$INSTDIR\shellext" - !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCOverlays_x86.dll" "$INSTDIR\shellext\OCOverlays_x86.dll" "$INSTDIR\shellext" - !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCContextMenu_x86.dll" "$INSTDIR\shellext\OCContextMenu_x86.dll" "$INSTDIR\shellext" + !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCUtil_x86.dll" "$INSTDIR\OCUtil_x86.dll" "$INSTDIR" + !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCOverlays_x86.dll" "$INSTDIR\OCOverlays_x86.dll" "$INSTDIR" + !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCContextMenu_x86.dll" "$INSTDIR\OCContextMenu_x86.dll" "$INSTDIR" ${Endif} !undef LIBRARY_COM !undef LIBRARY_SHELL_EXTENSION @@ -664,14 +663,14 @@ Section Uninstall ${If} ${HasSection} SEC_SHELL_EXT DetailPrint "Uninstalling x64 overlay DLLs" !define LIBRARY_X64 - !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x64.dll" - !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x64.dll" - !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x64.dll" + !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCContextMenu_x64.dll" + !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCOverlays_x64.dll" + !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCUtil_x64.dll" !undef LIBRARY_X64 DetailPrint "Uninstalling x86 overlay DLLs" - !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCContextMenu_x86.dll" - !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCOverlays_x86.dll" - !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\shellext\OCUtil_x86.dll" + !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCContextMenu_x86.dll" + !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCOverlays_x86.dll" + !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCUtil_x86.dll" ${EndIf} !undef LIBRARY_COM !undef LIBRARY_SHELL_EXTENSION diff --git a/config.h.in b/config.h.in index 00a06c869..5b91a8338 100644 --- a/config.h.in +++ b/config.h.in @@ -49,6 +49,10 @@ #cmakedefine CFAPI_SHELLEXT_APPID_REG "@CFAPI_SHELLEXT_APPID_REG@" #cmakedefine CFAPI_SHELLEXT_APPID_DISPLAY_NAME "@CFAPI_SHELLEXT_APPID_DISPLAY_NAME@" +#cmakedefine CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID "@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID@" +#cmakedefine CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG "@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG@" +#cmakedefine CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME "@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME@" + #cmakedefine CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID "@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID@" #cmakedefine CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG "@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG@" #cmakedefine CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME "@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME@" diff --git a/craftmaster.ini b/craftmaster.ini index 90b0e6e56..6bb623484 100644 --- a/craftmaster.ini +++ b/craftmaster.ini @@ -1,7 +1,7 @@ [General] Branch = master ShallowClone = True -CraftUrl = https://github.com/allexzander/craft.git +# CraftUrl = https://github.com/allexzander/craft.git # Variables defined here override the default value # The variable names are casesensitive @@ -45,8 +45,11 @@ Packager/CacheDir = ${Variables:Root}\cache [BlueprintSettings] # don't try to pip install on the ci python-modules.ignored = True +dev-utils/python2.ignored = True +dev-utils/python3.ignored = True nextcloud-client.buildTests = True binary/mysql.useMariaDB = False +libs/pixman.version = 0.40.0 [windows-msvc2019_64-cl] QtSDK/Compiler = msvc2019_64 diff --git a/doc/README.md b/doc/README.md index 632aad507..69d828a99 100644 --- a/doc/README.md +++ b/doc/README.md @@ -2,7 +2,7 @@ The main nextcloud Documentation is found at https://github.com/nextcloud/documentation -The rst files from the current stable branch will be parsed with sphinx to be used at https://docs.nextcloud.com/desktop/3.0/ +The rst files from the current stable branch will be parsed with sphinx to be used at https://docs.nextcloud.com/desktop/latest/ ## Dependencies diff --git a/doc/conf.py b/doc/conf.py index cf44f2d0b..d21346e0a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -41,16 +41,16 @@ master_doc = 'index' # General information about the project. project = u'Nextcloud Client Manual' -copyright = u'2013-2022, The Nextcloud developers' +copyright = u'2013-2023, The Nextcloud 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 = '3.6' +version = '3.7' # The full version, including alpha/beta/rc tags. -release = '3.6.4' +release = '3.7.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/nextcloud.client-desktop/gl_translation b/nextcloud.client-desktop/gl_translation index ee420804c..d3261d675 100644 --- a/nextcloud.client-desktop/gl_translation +++ b/nextcloud.client-desktop/gl_translation @@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[gl]=@APPLICATION_ICON_NAME@ +Name[gl]=Escritorio @APPLICATION_NAME@ Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio GenericName[gl]=Sincronización de cartafol diff --git a/resources.qrc b/resources.qrc index 97ffcaec7..f233501fc 100644 --- a/resources.qrc +++ b/resources.qrc @@ -7,17 +7,26 @@ src/gui/PredefinedStatusButton.qml src/gui/BasicComboBox.qml src/gui/ErrorBox.qml + src/gui/filedetails/FileActivityView.qml + src/gui/filedetails/FileDetailsPage.qml + src/gui/filedetails/FileDetailsView.qml + src/gui/filedetails/FileDetailsWindow.qml + src/gui/filedetails/NCInputTextEdit.qml + src/gui/filedetails/NCInputTextField.qml + src/gui/filedetails/NCTabButton.qml + src/gui/filedetails/ShareeDelegate.qml + src/gui/filedetails/ShareDelegate.qml + src/gui/filedetails/ShareDetailsPage.qml + src/gui/filedetails/ShareeSearchField.qml + src/gui/filedetails/ShareView.qml src/gui/tray/Window.qml src/gui/tray/UserLine.qml src/gui/tray/HeaderButton.qml src/gui/tray/SyncStatus.qml - theme/Style/Style.qml - theme/Style/qmldir src/gui/tray/ActivityActionButton.qml src/gui/tray/ActivityItem.qml src/gui/tray/AutoSizingMenu.qml src/gui/tray/ActivityList.qml - src/gui/tray/FileActivityDialog.qml src/gui/tray/UnifiedSearchInputContainer.qml src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml src/gui/tray/UnifiedSearchResultItem.qml @@ -28,7 +37,9 @@ src/gui/tray/UnifiedSearchResultNothingFound.qml src/gui/tray/UnifiedSearchResultSectionItem.qml src/gui/tray/CustomButton.qml - src/gui/tray/CustomTextButton.qml + src/gui/tray/NCButtonContents.qml + src/gui/tray/NCButtonBackground.qml + src/gui/tray/TextButtonContents.qml src/gui/tray/ActivityItemContextMenu.qml src/gui/tray/ActivityItemActions.qml src/gui/tray/ActivityItemContent.qml @@ -38,5 +49,7 @@ src/gui/tray/NCBusyIndicator.qml src/gui/tray/NCToolTip.qml src/gui/tray/EnforcedPlainTextLabel.qml + theme/Style/Style.qml + theme/Style/qmldir diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m index 1da21a9d3..84a124f51 100644 --- a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m +++ b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/FinderSync.m @@ -21,57 +21,59 @@ - (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 - NSString *socketApiPrefix = [extBundle objectForInfoDictionaryKey:@"SocketApiPrefix"]; - - NSImage *ok = [extBundle imageForResource:@"ok.icns"]; - NSImage *ok_swm = [extBundle imageForResource:@"ok_swm.icns"]; - NSImage *sync = [extBundle imageForResource:@"sync.icns"]; - NSImage *warning = [extBundle imageForResource:@"warning.icns"]; - NSImage *error = [extBundle imageForResource:@"error.icns"]; - - [syncController setBadgeImage:ok label:@"Up to date" forBadgeIdentifier:@"OK"]; - [syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"SYNC"]; - [syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"NEW"]; - [syncController setBadgeImage:warning label:@"Ignored" forBadgeIdentifier:@"IGNORE"]; - [syncController setBadgeImage:error label:@"Error" forBadgeIdentifier:@"ERROR"]; - [syncController setBadgeImage:ok_swm label:@"Shared" forBadgeIdentifier:@"OK+SWM"]; - [syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"SYNC+SWM"]; - [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 - // - The App Group itself must be a prefix of (or equal to) the application bundle identifier - // We end up in the official signed client with: 9B5WD74GWJ.com.owncloud.desktopclient.socket - // With ad-hoc signing (the '-' signing identity) we must drop the Team ID. - // When the code isn't sandboxed (e.g. the OC client or the legacy overlay icon extension) - // the OS doesn't seem to put any restriction on the port name, so we just follow what - // 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 - - NSURL *container = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:socketApiPrefix]; - NSURL *socketPath = [container URLByAppendingPathComponent:@".socket" isDirectory:NO]; - - NSLog(@"Socket path: %@", socketPath.path); - - if (socketPath.path) { - self.lineProcessor = [[LineProcessor alloc] initWithDelegate:self]; - self.localSocketClient = [[LocalSocketClient alloc] init:socketPath.path - lineProcessor:self.lineProcessor]; - [self.localSocketClient start]; - } else { - NSLog(@"No socket path. Not initiating local socket client."); - self.localSocketClient = nil; + + if (self) { + 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 + NSString *socketApiPrefix = [extBundle objectForInfoDictionaryKey:@"SocketApiPrefix"]; + + NSImage *ok = [extBundle imageForResource:@"ok.icns"]; + NSImage *ok_swm = [extBundle imageForResource:@"ok_swm.icns"]; + NSImage *sync = [extBundle imageForResource:@"sync.icns"]; + NSImage *warning = [extBundle imageForResource:@"warning.icns"]; + NSImage *error = [extBundle imageForResource:@"error.icns"]; + + [syncController setBadgeImage:ok label:@"Up to date" forBadgeIdentifier:@"OK"]; + [syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"SYNC"]; + [syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"NEW"]; + [syncController setBadgeImage:warning label:@"Ignored" forBadgeIdentifier:@"IGNORE"]; + [syncController setBadgeImage:error label:@"Error" forBadgeIdentifier:@"ERROR"]; + [syncController setBadgeImage:ok_swm label:@"Shared" forBadgeIdentifier:@"OK+SWM"]; + [syncController setBadgeImage:sync label:@"Synchronizing" forBadgeIdentifier:@"SYNC+SWM"]; + [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 + // - The App Group itself must be a prefix of (or equal to) the application bundle identifier + // We end up in the official signed client with: 9B5WD74GWJ.com.owncloud.desktopclient.socket + // With ad-hoc signing (the '-' signing identity) we must drop the Team ID. + // When the code isn't sandboxed (e.g. the OC client or the legacy overlay icon extension) + // the OS doesn't seem to put any restriction on the port name, so we just follow what + // 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 + + NSURL *container = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:socketApiPrefix]; + NSURL *socketPath = [container URLByAppendingPathComponent:@".socket" isDirectory:NO]; + + NSLog(@"Socket path: %@", socketPath.path); + + if (socketPath.path) { + self.lineProcessor = [[LineProcessor alloc] initWithDelegate:self]; + self.localSocketClient = [[LocalSocketClient alloc] init:socketPath.path + lineProcessor:self.lineProcessor]; + [self.localSocketClient start]; + } else { + NSLog(@"No socket path. Not initiating local socket client."); + self.localSocketClient = nil; + } + _registeredDirectories = [[NSMutableSet alloc] init]; + _strings = [[NSMutableDictionary alloc] init]; + _menuIsComplete = [[NSCondition alloc] init]; } - _registeredDirectories = [[NSMutableSet alloc] init]; - _strings = [[NSMutableDictionary alloc] init]; - _menuIsComplete = [[NSCondition alloc] init]; return self; } diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/LineProcessor.m b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/LineProcessor.m index f67642e7c..56ec7046a 100644 --- a/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/LineProcessor.m +++ b/shell_integration/MacOSX/OwnCloudFinderSync/FinderSyncExt/LineProcessor.m @@ -20,7 +20,10 @@ -(instancetype)initWithDelegate:(id)delegate { NSLog(@"Init line processor with delegate."); - self.delegate = delegate; + self = [super init]; + if (self) { + self.delegate = delegate; + } return self; } diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/project.pbxproj b/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/project.pbxproj index c055182bb..ad6d849dc 100644 --- a/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/project.pbxproj +++ b/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/project.pbxproj @@ -33,14 +33,14 @@ /* Begin PBXCopyFilesBuildPhase section */ C2B573E11B1CD9CE00303B36 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; + buildActionMask = 8; dstPath = ""; dstSubfolderSpec = 13; files = ( C2B573E21B1CD9CE00303B36 /* FinderSyncExt.appex in Embed App Extensions */, ); name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; + runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ @@ -198,10 +198,12 @@ C2B573B01B1CD91E00303B36 = { CreatedOnToolsVersion = 6.3.1; DevelopmentTeam = 9B5WD74GWJ; + ProvisioningStyle = Manual; }; C2B573D61B1CD9CE00303B36 = { CreatedOnToolsVersion = 6.3.1; DevelopmentTeam = 9B5WD74GWJ; + ProvisioningStyle = Manual; SystemCapabilities = { com.apple.ApplicationGroups.Mac = { enabled = 1; @@ -384,6 +386,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; @@ -405,7 +408,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = desktopclient/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -433,6 +436,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -448,7 +452,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = desktopclient/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -475,6 +479,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_ENTITLEMENTS = FinderSyncExt/FinderSyncExt.entitlements; CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; @@ -496,7 +501,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = FinderSyncExt/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; OC_APPLICATION_NAME = ownCloud; OC_APPLICATION_REV_DOMAIN = com.owncloud.desktopclient; @@ -530,6 +535,7 @@ CODE_SIGN_ENTITLEMENTS = FinderSyncExt/FinderSyncExt.entitlements; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -545,7 +551,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = FinderSyncExt/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; OC_APPLICATION_NAME = ownCloud; OC_APPLICATION_REV_DOMAIN = com.owncloud.desktopclient; diff --git a/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/xcshareddata/xcschemes/FinderSyncExt.xcscheme b/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/xcshareddata/xcschemes/FinderSyncExt.xcscheme index 3c65bbe5e..63ec0b6c5 100644 --- a/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/xcshareddata/xcschemes/FinderSyncExt.xcscheme +++ b/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj/xcshareddata/xcschemes/FinderSyncExt.xcscheme @@ -83,6 +83,7 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES" + askForAppToLaunch = "Yes" launchAutomaticallySubstyle = "2"> diff --git a/shell_integration/dolphin/CMakeLists.txt b/shell_integration/dolphin/CMakeLists.txt index 1642c80d7..07e609661 100644 --- a/shell_integration/dolphin/CMakeLists.txt +++ b/shell_integration/dolphin/CMakeLists.txt @@ -41,8 +41,8 @@ target_link_libraries(${OWNCLOUDDOLPHINOVERLAYPLUGIN} KF5::CoreAddons KF5::KIOCo #---ACTION PLUGIN--- set(OWNCLOUDDOLPHINACTIONPLUGIN ${APPLICATION_EXECUTABLE}dolphinactionplugin) -add_library(${OWNCLOUDDOLPHINACTIONPLUGIN} MODULE ownclouddolphinactionplugin.cpp) -target_link_libraries(${OWNCLOUDDOLPHINACTIONPLUGIN} KF5::CoreAddons KF5::KIOCore KF5::KIOWidgets ${OWNCLOUDDOLPHINHELPER}) configure_file(ownclouddolphinactionplugin.desktop.in ${OWNCLOUDDOLPHINACTIONPLUGIN}.desktop ESCAPE_QUOTES @ONLY) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${OWNCLOUDDOLPHINACTIONPLUGIN}.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}) -install(TARGETS ${OWNCLOUDDOLPHINACTIONPLUGIN} DESTINATION ${KDE_INSTALL_PLUGINDIR}) +kcoreaddons_add_plugin(${OWNCLOUDDOLPHINACTIONPLUGIN} INSTALL_NAMESPACE "kf5/kfileitemaction" + SOURCES ownclouddolphinactionplugin.cpp) +target_link_libraries(${OWNCLOUDDOLPHINACTIONPLUGIN} KF5::CoreAddons KF5::KIOCore KF5::KIOWidgets ${OWNCLOUDDOLPHINHELPER}) +kcoreaddons_desktop_to_json(${OWNCLOUDDOLPHINACTIONPLUGIN} ${CMAKE_CURRENT_BINARY_DIR}/${OWNCLOUDDOLPHINACTIONPLUGIN}.desktop) diff --git a/shell_integration/dolphin/ownclouddolphinactionplugin.cpp b/shell_integration/dolphin/ownclouddolphinactionplugin.cpp index 5403a0b5d..1f1d4f30c 100644 --- a/shell_integration/dolphin/ownclouddolphinactionplugin.cpp +++ b/shell_integration/dolphin/ownclouddolphinactionplugin.cpp @@ -133,6 +133,6 @@ public: }; -K_PLUGIN_FACTORY(OwncloudDolphinPluginActionFactory, registerPlugin();) +K_PLUGIN_CLASS_WITH_JSON(OwncloudDolphinPluginAction, APPLICATION_EXECUTABLE "dolphinactionplugin.json") #include "ownclouddolphinactionplugin.moc" diff --git a/shell_integration/dolphin/ownclouddolphinpluginhelper.h b/shell_integration/dolphin/ownclouddolphinpluginhelper.h index f6659e417..67119ba70 100644 --- a/shell_integration/dolphin/ownclouddolphinpluginhelper.h +++ b/shell_integration/dolphin/ownclouddolphinpluginhelper.h @@ -30,25 +30,25 @@ class OWNCLOUDDOLPHINPLUGINHELPER_EXPORT OwncloudDolphinPluginHelper : public QO public: static OwncloudDolphinPluginHelper *instance(); - bool isConnected() const; + [[nodiscard]] bool isConnected() const; void sendCommand(const char *data); - QVector paths() const { return _paths; } + [[nodiscard]] QVector paths() const { return _paths; } - QString contextMenuTitle() const + [[nodiscard]] QString contextMenuTitle() const { return _strings.value("CONTEXT_MENU_TITLE", APPLICATION_NAME); } - QString shareActionTitle() const + [[nodiscard]] QString shareActionTitle() const { return _strings.value("SHARE_MENU_TITLE", "Share …"); } - QString contextMenuIconName() const + [[nodiscard]] QString contextMenuIconName() const { return _strings.value("CONTEXT_MENU_ICON", APPLICATION_ICON_NAME); } - QString copyPrivateLinkTitle() const { return _strings["COPY_PRIVATE_LINK_MENU_TITLE"]; } - QString emailPrivateLinkTitle() const { return _strings["EMAIL_PRIVATE_LINK_MENU_TITLE"]; } + [[nodiscard]] QString copyPrivateLinkTitle() const { return _strings["COPY_PRIVATE_LINK_MENU_TITLE"]; } + [[nodiscard]] QString emailPrivateLinkTitle() const { return _strings["EMAIL_PRIVATE_LINK_MENU_TITLE"]; } QByteArray version() { return _version; } diff --git a/shell_integration/libcloudproviders/CMakeLists.txt b/shell_integration/libcloudproviders/CMakeLists.txt index d5391a7a4..2e7349ef7 100644 --- a/shell_integration/libcloudproviders/CMakeLists.txt +++ b/shell_integration/libcloudproviders/CMakeLists.txt @@ -1,25 +1,5 @@ -include(UsePkgConfig) - -MACRO(PKGCONFIG_GETVAR _package _var _output_variable) - SET(${_output_variable}) - - # if pkg-config has been found - IF (PKGCONFIG_EXECUTABLE) - - EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --exists RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull) - - # and if the package of interest also exists for pkg-config, then get the information - IF (NOT _return_VALUE) - - EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --variable ${_var} OUTPUT_VARIABLE ${_output_variable}) - - ENDIF (NOT _return_VALUE) - - ENDIF (PKGCONFIG_EXECUTABLE) -ENDMACRO(PKGCONFIG_GETVAR _package _var _output_variable) - macro(dbus_add_activation_service _sources) - PKGCONFIG_GETVAR(dbus-1 session_bus_services_dir _install_dir) + pkg_get_variable(_install_dir dbus-1 session_bus_services_dir) foreach (_i ${_sources}) get_filename_component(_service_file ${_i} ABSOLUTE) string(REGEX REPLACE "\\.service.*$" ".service" _output_file ${_i}) diff --git a/shell_integration/windows/NCContextMenu/CMakeLists.txt b/shell_integration/windows/NCContextMenu/CMakeLists.txt index f8f9dc324..43d60d1b0 100644 --- a/shell_integration/windows/NCContextMenu/CMakeLists.txt +++ b/shell_integration/windows/NCContextMenu/CMakeLists.txt @@ -11,6 +11,14 @@ add_library(NCContextMenu MODULE target_link_libraries(NCContextMenu NCUtil) +set_target_properties(NCContextMenu + PROPERTIES + LIBRARY_OUTPUT_DIRECTORY + ${BIN_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY + ${BIN_OUTPUT_DIRECTORY} +) + install(TARGETS NCContextMenu RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR} diff --git a/shell_integration/windows/NCContextMenu/NCContextMenu.rc b/shell_integration/windows/NCContextMenu/NCContextMenu.rc index ea3f44b20da6721aaa017713cbc52dc252a9063a..e77e71ea59ee995e4abac8a6ad7079d7ba2d5059 100644 GIT binary patch delta 14 VcmaE-{7!j89}lDP=6;@dRsb)X1ycY3 delta 14 VcmaE-{7!j89}lC!=6;@dRsb)F1yBG0 diff --git a/shell_integration/windows/NCOverlays/CMakeLists.txt b/shell_integration/windows/NCOverlays/CMakeLists.txt index 35bfc2ce5..3b141138a 100644 --- a/shell_integration/windows/NCOverlays/CMakeLists.txt +++ b/shell_integration/windows/NCOverlays/CMakeLists.txt @@ -10,6 +10,14 @@ add_library(NCOverlays MODULE target_link_libraries(NCOverlays NCUtil) +set_target_properties(NCOverlays + PROPERTIES + LIBRARY_OUTPUT_DIRECTORY + ${BIN_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY + ${BIN_OUTPUT_DIRECTORY} +) + install(TARGETS NCOverlays RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR} diff --git a/shell_integration/windows/NCOverlays/NCOverlay.rc b/shell_integration/windows/NCOverlays/NCOverlay.rc index 69bf79b9f43189934dc5113902905320b08e5eec..cc99a61633cc235f88df1e2ca049f104a15a70d2 100644 GIT binary patch delta 24 gcmbQEJx6=P3;||i28GG{`P?VR2=Z - + @@ -68,7 +68,7 @@ - + diff --git a/src/3rdparty/QProgressIndicator/QProgressIndicator.h b/src/3rdparty/QProgressIndicator/QProgressIndicator.h index 536516106..f71946e8b 100644 --- a/src/3rdparty/QProgressIndicator/QProgressIndicator.h +++ b/src/3rdparty/QProgressIndicator/QProgressIndicator.h @@ -48,27 +48,27 @@ public: \return The number of milliseconds between animation steps. By default, the animation delay is set to 40 milliseconds. \sa setAnimationDelay */ - int animationDelay() const { return m_delay; } + [[nodiscard]] int animationDelay() const { return m_delay; } /*! Returns a Boolean value indicating whether the component is currently animated. \return Animation state. \sa startAnimation stopAnimation */ - bool isAnimated () const; + [[nodiscard]] bool isAnimated () const; /*! Returns a Boolean value indicating whether the receiver shows itself even when it is not animating. \return Return true if the progress indicator shows itself even when it is not animating. By default, it returns false. \sa setDisplayedWhenStopped */ - bool isDisplayedWhenStopped() const; + [[nodiscard]] bool isDisplayedWhenStopped() const; /*! Returns the color of the component. \sa setColor */ - const QColor & color() const { return m_color; } + [[nodiscard]] const QColor & color() const { return m_color; } - QSize sizeHint() const override; - int heightForWidth(int w) const override; + [[nodiscard]] QSize sizeHint() const override; + [[nodiscard]] int heightForWidth(int w) const override; public slots: /*! Starts the spin animation. \sa stopAnimation isAnimated diff --git a/src/3rdparty/kirigami/wheelhandler.cpp b/src/3rdparty/kirigami/wheelhandler.cpp index ce21e51ac..9dacae4db 100644 --- a/src/3rdparty/kirigami/wheelhandler.cpp +++ b/src/3rdparty/kirigami/wheelhandler.cpp @@ -6,275 +6,621 @@ #include "wheelhandler.h" #include -#include -#include +#include -class GlobalWheelFilterSingleton -{ -public: - GlobalWheelFilter self; -}; - -Q_GLOBAL_STATIC(GlobalWheelFilterSingleton, privateGlobalWheelFilterSelf) - -GlobalWheelFilter::GlobalWheelFilter(QObject *parent) +KirigamiWheelEvent::KirigamiWheelEvent(QObject *parent) : QObject(parent) { } -GlobalWheelFilter::~GlobalWheelFilter() = default; +KirigamiWheelEvent::~KirigamiWheelEvent() +{ +} -GlobalWheelFilter *GlobalWheelFilter::self() +void KirigamiWheelEvent::initializeFromEvent(QWheelEvent *event) { - return &privateGlobalWheelFilterSelf()->self; + m_x = event->position().x(); + m_y = event->position().y(); + m_angleDelta = event->angleDelta(); + m_pixelDelta = event->pixelDelta(); + m_buttons = event->buttons(); + m_modifiers = event->modifiers(); + m_accepted = false; + m_inverted = event->inverted(); } -void GlobalWheelFilter::setItemHandlerAssociation(QQuickItem *item, WheelHandler *handler) +qreal KirigamiWheelEvent::x() const { - if (!m_handlersForItem.contains(handler->target())) { - handler->target()->installEventFilter(this); - } - m_handlersForItem.insert(item, handler); + return m_x; +} - connect(item, &QObject::destroyed, this, [this](QObject *obj) { - auto item = static_cast(obj); - m_handlersForItem.remove(item); - }); +qreal KirigamiWheelEvent::y() const +{ + return m_y; +} - connect(handler, &QObject::destroyed, this, [this](QObject *obj) { - auto handler = static_cast(obj); - removeItemHandlerAssociation(handler->target(), handler); - }); +QPointF KirigamiWheelEvent::angleDelta() const +{ + return m_angleDelta; } -void GlobalWheelFilter::removeItemHandlerAssociation(QQuickItem *item, WheelHandler *handler) +QPointF KirigamiWheelEvent::pixelDelta() const { - if (!item || !handler) { - return; - } - m_handlersForItem.remove(item, handler); - if (!m_handlersForItem.contains(item)) { - item->removeEventFilter(this); - } + return m_pixelDelta; } -bool GlobalWheelFilter::eventFilter(QObject *watched, QEvent *event) +int KirigamiWheelEvent::buttons() const { - if (event->type() == QEvent::Wheel) { - auto item = qobject_cast(watched); - if (!item || !item->isEnabled()) { - return QObject::eventFilter(watched, event); - } - auto we = static_cast(event); - m_wheelEvent.initializeFromEvent(we); + return m_buttons; +} - bool shouldBlock = false; - bool shouldScrollFlickable = false; +int KirigamiWheelEvent::modifiers() const +{ + return m_modifiers; +} - for (auto *handler : m_handlersForItem.values(item)) { - if (handler->m_blockTargetWheel) { - shouldBlock = true; - } - if (handler->m_scrollFlickableTarget) { - shouldScrollFlickable = true; - } - emit handler->wheel(&m_wheelEvent); - } +bool KirigamiWheelEvent::inverted() const +{ + return m_inverted; +} - if (shouldScrollFlickable && !m_wheelEvent.isAccepted()) { - manageWheel(item, we); - } +bool KirigamiWheelEvent::isAccepted() +{ + return m_accepted; +} - if (shouldBlock) { - return true; - } - } - return QObject::eventFilter(watched, event); +void KirigamiWheelEvent::setAccepted(bool accepted) +{ + m_accepted = accepted; } -void GlobalWheelFilter::manageWheel(QQuickItem *target, QWheelEvent *event) +/////////////////////////////// + +WheelFilterItem::WheelFilterItem(QQuickItem *parent) + : QQuickItem(parent) { - // Duck typing: accept everyhint that has all the properties we need - if (target->metaObject()->indexOfProperty("contentX") == -1 - || target->metaObject()->indexOfProperty("contentY") == -1 - || target->metaObject()->indexOfProperty("contentWidth") == -1 - || target->metaObject()->indexOfProperty("contentHeight") == -1 - || target->metaObject()->indexOfProperty("topMargin") == -1 - || target->metaObject()->indexOfProperty("bottomMargin") == -1 - || target->metaObject()->indexOfProperty("leftMargin") == -1 - || target->metaObject()->indexOfProperty("rightMargin") == -1 - || target->metaObject()->indexOfProperty("originX") == -1 - || target->metaObject()->indexOfProperty("originY") == -1) { - return; - } + setEnabled(false); +} - qreal contentWidth = target->property("contentWidth").toReal(); - qreal contentHeight = target->property("contentHeight").toReal(); - qreal contentX = target->property("contentX").toReal(); - qreal contentY = target->property("contentY").toReal(); - qreal topMargin = target->property("topMargin").toReal(); - qreal bottomMargin = target->property("bottomMargin").toReal(); - qreal leftMargin = target->property("leftMaring").toReal(); - qreal rightMargin = target->property("rightMargin").toReal(); - qreal originX = target->property("originX").toReal(); - qreal originY = target->property("originY").toReal(); +/////////////////////////////// - // Scroll Y - if (contentHeight > target->height()) { +WheelHandler::WheelHandler(QObject *parent) + : QObject(parent) + , m_filterItem(new WheelFilterItem(nullptr)) +{ + m_filterItem->installEventFilter(this); - int y = event->pixelDelta().y() != 0 ? event->pixelDelta().y() : event->angleDelta().y() / 8; + m_wheelScrollingTimer.setSingleShot(true); + m_wheelScrollingTimer.setInterval(m_wheelScrollingDuration); + m_wheelScrollingTimer.callOnTimeout([this]() { + setScrolling(false); + }); - //if we don't have a pixeldelta, apply the configured mouse wheel lines - if (!event->pixelDelta().y()) { - y *= 3; // Magic copied value from Kirigami::Settings + connect(QGuiApplication::styleHints(), &QStyleHints::wheelScrollLinesChanged, this, [this](int scrollLines) { + m_defaultPixelStepSize = 20 * scrollLines; + if (!m_explicitVStepSize && m_verticalStepSize != m_defaultPixelStepSize) { + m_verticalStepSize = m_defaultPixelStepSize; + Q_EMIT verticalStepSizeChanged(); } - - // Scroll one page regardless of delta: - if ((event->modifiers() & Qt::ControlModifier) || (event->modifiers() & Qt::ShiftModifier)) { - if (y > 0) { - y = target->height(); - } else if (y < 0) { - y = -target->height(); - } + if (!m_explicitHStepSize && m_horizontalStepSize != m_defaultPixelStepSize) { + m_horizontalStepSize = m_defaultPixelStepSize; + Q_EMIT horizontalStepSizeChanged(); } + }); +} - qreal minYExtent = topMargin - originY; - qreal maxYExtent = target->height() - (contentHeight + bottomMargin + originY); +WheelHandler::~WheelHandler() = default; - target->setProperty("contentY", qMin(-maxYExtent, qMax(-minYExtent, contentY - y))); - } +QQuickItem *WheelHandler::target() const +{ + return m_flickable; +} - //Scroll X - if (contentWidth > target->width()) { +void WheelHandler::setTarget(QQuickItem *target) +{ + if (m_flickable == target) { + return; + } - int x = event->pixelDelta().x() != 0 ? event->pixelDelta().x() : event->angleDelta().x() / 8; + if (target && !target->inherits("QQuickFlickable")) { + qmlWarning(this) << "target must be a QQuickFlickable"; + return; + } - // Special case: when can't scroll vertically, scroll horizontally with vertical wheel as well - if (x == 0 && contentHeight <= target->height()) { - x = event->pixelDelta().y() != 0 ? event->pixelDelta().y() : event->angleDelta().y() / 8; - } + if (m_flickable) { + m_flickable->removeEventFilter(this); + disconnect(m_flickable, nullptr, m_filterItem, nullptr); + } - //if we don't have a pixeldelta, apply the configured mouse wheel lines - if (!event->pixelDelta().x()) { - x *= 3; // Magic copied value from Kirigami::Settings + m_flickable = target; + m_filterItem->setParentItem(target); + + QQuickItem *vscrollbar = nullptr; + QQuickItem *hscrollbar = nullptr; + + if (target) { + target->installEventFilter(this); + + // Stack WheelFilterItem over the Flickable's scrollable content + m_filterItem->stackAfter(target->property("contentItem").value()); + // Make it fill the Flickable + m_filterItem->setWidth(target->width()); + m_filterItem->setHeight(target->height()); + connect(target, &QQuickItem::widthChanged, m_filterItem, [this, target](){ + m_filterItem->setWidth(target->width()); + }); + connect(target, &QQuickItem::heightChanged, m_filterItem, [this, target](){ + m_filterItem->setHeight(target->height()); + }); + + // Get ScrollBars so that we can filter them too, even if they're not in the bounds of the Flickable + auto targetChildren = target->children(); + for (auto child : targetChildren) { + if (child->inherits("QQuickScrollBarAttached")) { + vscrollbar = child->property("vertical").value(); + hscrollbar = child->property("horizontal").value(); + break; + } } - - // Scroll one page regardless of delta: - if ((event->modifiers() & Qt::ControlModifier) || (event->modifiers() & Qt::ShiftModifier)) { - if (x > 0) { - x = target->width(); - } else if (x < 0) { - x = -target->width(); + // Check ScrollView if there are no scrollbars attached to the Flickable. + // We need to check if the parent inherits QQuickScrollView in case the + // parent is another Flickable that already has a Kirigami WheelHandler. + auto targetParent = target->parentItem(); + if (targetParent && targetParent->inherits("QQuickScrollView") && !vscrollbar && !hscrollbar) { + auto targetParentChildren = targetParent->children(); + for (auto child : targetParentChildren) { + if (child->inherits("QQuickScrollBarAttached")) { + vscrollbar = child->property("vertical").value(); + hscrollbar = child->property("horizontal").value(); + break; + } } } + } - qreal minXExtent = leftMargin - originX; - qreal maxXExtent = target->width() - (contentWidth + rightMargin + originX); + if (m_verticalScrollBar != vscrollbar) { + if (m_verticalScrollBar) { + m_verticalScrollBar->removeEventFilter(this); + } + m_verticalScrollBar = vscrollbar; + if (vscrollbar) { + vscrollbar->installEventFilter(this); + } + } - target->setProperty("contentX", qMin(-maxXExtent, qMax(-minXExtent, contentX - x))); + if (m_horizontalScrollBar != hscrollbar) { + if (m_horizontalScrollBar) { + m_horizontalScrollBar->removeEventFilter(this); + } + m_horizontalScrollBar = hscrollbar; + if (hscrollbar) { + hscrollbar->installEventFilter(this); + } } - //this is just for making the scrollbar - target->metaObject()->invokeMethod(target, "flick", Q_ARG(double, 0), Q_ARG(double, 1)); - target->metaObject()->invokeMethod(target, "cancelFlick"); + Q_EMIT targetChanged(); } +qreal WheelHandler::verticalStepSize() const +{ + return m_verticalStepSize; +} -//////////////////////////// -KirigamiWheelEvent::KirigamiWheelEvent(QObject *parent) - : QObject(parent) -{} +void WheelHandler::setVerticalStepSize(qreal stepSize) +{ + m_explicitVStepSize = true; + if (qFuzzyCompare(m_verticalStepSize, stepSize)) { + return; + } + // Mimic the behavior of QQuickScrollBar when stepSize is 0 + if (qFuzzyIsNull(stepSize)) { + resetVerticalStepSize(); + return; + } + m_verticalStepSize = stepSize; + Q_EMIT verticalStepSizeChanged(); +} -KirigamiWheelEvent::~KirigamiWheelEvent() = default; +void WheelHandler::resetVerticalStepSize() +{ + m_explicitVStepSize = false; + if (qFuzzyCompare(m_verticalStepSize, m_defaultPixelStepSize)) { + return; + } + m_verticalStepSize = m_defaultPixelStepSize; + Q_EMIT verticalStepSizeChanged(); +} -void KirigamiWheelEvent::initializeFromEvent(QWheelEvent *event) +qreal WheelHandler::horizontalStepSize() const { - m_x = event->position().x(); - m_y = event->position().y(); - m_angleDelta = event->angleDelta(); - m_pixelDelta = event->pixelDelta(); - m_buttons = event->buttons(); - m_modifiers = event->modifiers(); - m_accepted = false; - m_inverted = event->inverted(); + return m_horizontalStepSize; } -qreal KirigamiWheelEvent::x() const +void WheelHandler::setHorizontalStepSize(qreal stepSize) { - return m_x; + m_explicitHStepSize = true; + if (qFuzzyCompare(m_horizontalStepSize, stepSize)) { + return; + } + // Mimic the behavior of QQuickScrollBar when stepSize is 0 + if (qFuzzyIsNull(stepSize)) { + resetHorizontalStepSize(); + return; + } + m_horizontalStepSize = stepSize; + Q_EMIT horizontalStepSizeChanged(); } -qreal KirigamiWheelEvent::y() const +void WheelHandler::resetHorizontalStepSize() { - return m_y; + m_explicitHStepSize = false; + if (qFuzzyCompare(m_horizontalStepSize, m_defaultPixelStepSize)) { + return; + } + m_horizontalStepSize = m_defaultPixelStepSize; + Q_EMIT horizontalStepSizeChanged(); } -QPointF KirigamiWheelEvent::angleDelta() const +Qt::KeyboardModifiers WheelHandler::pageScrollModifiers() const { - return m_angleDelta; + return m_pageScrollModifiers; } -QPointF KirigamiWheelEvent::pixelDelta() const +void WheelHandler::setPageScrollModifiers(Qt::KeyboardModifiers modifiers) { - return m_pixelDelta; + if (m_pageScrollModifiers == modifiers) { + return; + } + m_pageScrollModifiers = modifiers; + Q_EMIT pageScrollModifiersChanged(); } -int KirigamiWheelEvent::buttons() const +void WheelHandler::resetPageScrollModifiers() { - return m_buttons; + setPageScrollModifiers(m_defaultPageScrollModifiers); } -int KirigamiWheelEvent::modifiers() const +bool WheelHandler::filterMouseEvents() const { - return m_modifiers; + return m_filterMouseEvents; } -bool KirigamiWheelEvent::inverted() const +void WheelHandler::setFilterMouseEvents(bool enabled) { - return m_inverted; + if (m_filterMouseEvents == enabled) { + return; + } + m_filterMouseEvents = enabled; + Q_EMIT filterMouseEventsChanged(); } -bool KirigamiWheelEvent::isAccepted() +bool WheelHandler::keyNavigationEnabled() const { - return m_accepted; + return m_keyNavigationEnabled; } -void KirigamiWheelEvent::setAccepted(bool accepted) +void WheelHandler::setKeyNavigationEnabled(bool enabled) { - m_accepted = accepted; + if (m_keyNavigationEnabled == enabled) { + return; + } + m_keyNavigationEnabled = enabled; + Q_EMIT keyNavigationEnabledChanged(); } +void WheelHandler::setScrolling(bool scrolling) +{ + if (m_wheelScrolling == scrolling) { + if (m_wheelScrolling) { + m_wheelScrollingTimer.start(); + } + return; + } + m_wheelScrolling = scrolling; + m_filterItem->setEnabled(m_wheelScrolling); +} -/////////////////////////////// +bool WheelHandler::scrollFlickable(QPointF pixelDelta, QPointF angleDelta, Qt::KeyboardModifiers modifiers) +{ + if (!m_flickable || (pixelDelta.isNull() && angleDelta.isNull())) { + return false; + } -WheelHandler::WheelHandler(QObject *parent) - : QObject(parent) + const qreal width = m_flickable->width(); + const qreal height = m_flickable->height(); + const qreal contentWidth = m_flickable->property("contentWidth").toReal(); + const qreal contentHeight = m_flickable->property("contentHeight").toReal(); + const qreal contentX = m_flickable->property("contentX").toReal(); + const qreal contentY = m_flickable->property("contentY").toReal(); + const qreal topMargin = m_flickable->property("topMargin").toReal(); + const qreal bottomMargin = m_flickable->property("bottomMargin").toReal(); + const qreal leftMargin = m_flickable->property("leftMargin").toReal(); + const qreal rightMargin = m_flickable->property("rightMargin").toReal(); + const qreal originX = m_flickable->property("originX").toReal(); + const qreal originY = m_flickable->property("originY").toReal(); + const qreal pageWidth = width - leftMargin - rightMargin; + const qreal pageHeight = height - topMargin - bottomMargin; + const auto window = m_flickable->window(); + const qreal devicePixelRatio = window != nullptr ? window->devicePixelRatio() : qGuiApp->devicePixelRatio(); + + // HACK: Only transpose deltas when not using xcb in order to not conflict with xcb's own delta transposing + if (modifiers & m_defaultHorizontalScrollModifiers && qGuiApp->platformName() != QLatin1String("xcb")) { + angleDelta = angleDelta.transposed(); + pixelDelta = pixelDelta.transposed(); + } + + const qreal xTicks = angleDelta.x() / 120; + const qreal yTicks = angleDelta.y() / 120; + qreal xChange; + qreal yChange; + bool scrolled = false; + + // Scroll X + if (contentWidth > pageWidth) { + // Use page size with pageScrollModifiers. Matches QScrollBar, which uses QAbstractSlider behavior. + if (modifiers & m_pageScrollModifiers) { + xChange = qBound(-pageWidth, xTicks * pageWidth, pageWidth); + } else if (pixelDelta.x() != 0) { + xChange = pixelDelta.x(); + } else { + xChange = xTicks * m_horizontalStepSize; + } + + // contentX and contentY use reversed signs from what x and y would normally use, so flip the signs + + qreal minXExtent = leftMargin - originX; + qreal maxXExtent = width - (contentWidth + rightMargin + originX); + + qreal newContentX = qBound(-minXExtent, contentX - xChange, -maxXExtent); + // Flickable::pixelAligned rounds the position, so round to mimic that behavior. + // Rounding prevents fractional positioning from causing text to be + // clipped off on the top and bottom. + // Multiply by devicePixelRatio before rounding and divide by devicePixelRatio + // after to make position match pixels on the screen more closely. + newContentX = std::round(newContentX * devicePixelRatio) / devicePixelRatio; + if (contentX != newContentX) { + scrolled = true; + m_flickable->setProperty("contentX", newContentX); + } + } + + // Scroll Y + if (contentHeight > pageHeight) { + if (modifiers & m_pageScrollModifiers) { + yChange = qBound(-pageHeight, yTicks * pageHeight, pageHeight); + } else if (pixelDelta.y() != 0) { + yChange = pixelDelta.y(); + } else { + yChange = yTicks * m_verticalStepSize; + } + + // contentX and contentY use reversed signs from what x and y would normally use, so flip the signs + + qreal minYExtent = topMargin - originY; + qreal maxYExtent = height - (contentHeight + bottomMargin + originY); + + qreal newContentY = qBound(-minYExtent, contentY - yChange, -maxYExtent); + // Flickable::pixelAligned rounds the position, so round to mimic that behavior. + // Rounding prevents fractional positioning from causing text to be + // clipped off on the top and bottom. + // Multiply by devicePixelRatio before rounding and divide by devicePixelRatio + // after to make position match pixels on the screen more closely. + newContentY = std::round(newContentY * devicePixelRatio) / devicePixelRatio; + if (contentY != newContentY) { + scrolled = true; + m_flickable->setProperty("contentY", newContentY); + } + } + + return scrolled; +} + +bool WheelHandler::scrollUp(qreal stepSize) { + if (qFuzzyIsNull(stepSize)) { + return false; + } else if (stepSize < 0) { + stepSize = m_verticalStepSize; + } + // contentY uses reversed sign + return scrollFlickable(QPointF(0, stepSize)); } -WheelHandler::~WheelHandler() = default; +bool WheelHandler::scrollDown(qreal stepSize) +{ + if (qFuzzyIsNull(stepSize)) { + return false; + } else if (stepSize < 0) { + stepSize = m_verticalStepSize; + } + // contentY uses reversed sign + return scrollFlickable(QPointF(0, -stepSize)); +} -QQuickItem *WheelHandler::target() const +bool WheelHandler::scrollLeft(qreal stepSize) { - return m_target; + if (qFuzzyIsNull(stepSize)) { + return false; + } else if (stepSize < 0) { + stepSize = m_horizontalStepSize; + } + // contentX uses reversed sign + return scrollFlickable(QPoint(stepSize, 0)); } -void WheelHandler::setTarget(QQuickItem *target) +bool WheelHandler::scrollRight(qreal stepSize) { - if (m_target == target) { - return; + if (qFuzzyIsNull(stepSize)) { + return false; + } else if (stepSize < 0) { + stepSize = m_horizontalStepSize; } + // contentX uses reversed sign + return scrollFlickable(QPoint(-stepSize, 0)); +} - if (m_target) { - GlobalWheelFilter::self()->removeItemHandlerAssociation(m_target, this); +bool WheelHandler::eventFilter(QObject *watched, QEvent *event) +{ + auto item = qobject_cast(watched); + if (!item || !item->isEnabled()) { + return false; } - m_target = target; + qreal contentWidth = 0; + qreal contentHeight = 0; + qreal pageWidth = 0; + qreal pageHeight = 0; + if (m_flickable) { + contentWidth = m_flickable->property("contentWidth").toReal(); + contentHeight = m_flickable->property("contentHeight").toReal(); + pageWidth = m_flickable->width() - m_flickable->property("leftMargin").toReal() - m_flickable->property("rightMargin").toReal(); + pageHeight = m_flickable->height() - m_flickable->property("topMargin").toReal() - m_flickable->property("bottomMargin").toReal(); + } - GlobalWheelFilter::self()->setItemHandlerAssociation(target, this); + // The code handling touch, mouse and hover events is mostly copied/adapted from QQuickScrollView::childMouseEventFilter() + switch (event->type()) { + case QEvent::Wheel: { + // QQuickScrollBar::interactive handling Matches behavior in QQuickScrollView::eventFilter() + if (m_filterMouseEvents) { + if (m_verticalScrollBar) { + m_verticalScrollBar->setProperty("interactive", true); + } + if (m_horizontalScrollBar) { + m_horizontalScrollBar->setProperty("interactive", true); + } + } + QWheelEvent *wheelEvent = static_cast(event); + + // NOTE: On X11 with libinput, pixelDelta is identical to angleDelta when using a mouse that shouldn't use pixelDelta. + // If faulty pixelDelta, reset pixelDelta to (0,0). + if (wheelEvent->pixelDelta() == wheelEvent->angleDelta()) { + // In order to change any of the data, we have to create a whole new QWheelEvent from its constructor. + QWheelEvent newWheelEvent( + wheelEvent->position(), + wheelEvent->globalPosition(), + QPoint(0,0), // pixelDelta + wheelEvent->angleDelta(), + wheelEvent->buttons(), + wheelEvent->modifiers(), + wheelEvent->phase(), + wheelEvent->inverted(), + wheelEvent->source() + ); + m_kirigamiWheelEvent.initializeFromEvent(&newWheelEvent); + } else { + m_kirigamiWheelEvent.initializeFromEvent(wheelEvent); + } - emit targetChanged(); -} + Q_EMIT wheel(&m_kirigamiWheelEvent); + + if (m_kirigamiWheelEvent.isAccepted()) { + return true; + } + + bool scrolled = false; + if (m_scrollFlickableTarget || (contentHeight <= pageHeight && contentWidth <= pageWidth)) { + // Don't use pixelDelta from the event unless angleDelta is not available + // because scrolling by pixelDelta is too slow on Wayland with libinput. + QPointF pixelDelta = m_kirigamiWheelEvent.angleDelta().isNull() ? m_kirigamiWheelEvent.pixelDelta() : QPoint(0, 0); + scrolled = scrollFlickable(pixelDelta, + m_kirigamiWheelEvent.angleDelta(), + Qt::KeyboardModifiers(m_kirigamiWheelEvent.modifiers())); + } + setScrolling(scrolled); + + // NOTE: Wheel events created by touchpad gestures with pixel deltas will cause scrolling to jump back + // to where scrolling started unless the event is always accepted before it reaches the Flickable. + bool flickableWillUseGestureScrolling = !(wheelEvent->source() == Qt::MouseEventNotSynthesized || wheelEvent->pixelDelta().isNull()); + return scrolled || m_blockTargetWheel || flickableWillUseGestureScrolling; + } + + case QEvent::TouchBegin: { + m_wasTouched = true; + if (!m_filterMouseEvents) { + break; + } + if (m_verticalScrollBar) { + m_verticalScrollBar->setProperty("interactive", false); + } + if (m_horizontalScrollBar) { + m_horizontalScrollBar->setProperty("interactive", false); + } + break; + } + case QEvent::TouchEnd: { + m_wasTouched = false; + break; + } -#include "moc_wheelhandler.cpp" + case QEvent::MouseButtonPress: { + // NOTE: Flickable does not handle touch events, only synthesized mouse events + m_wasTouched = static_cast(event)->source() != Qt::MouseEventNotSynthesized; + if (!m_filterMouseEvents) { + break; + } + if (!m_wasTouched) { + if (m_verticalScrollBar) { + m_verticalScrollBar->setProperty("interactive", true); + } + if (m_horizontalScrollBar) { + m_horizontalScrollBar->setProperty("interactive", true); + } + break; + } + return !m_wasTouched && item == m_flickable; + } + + case QEvent::MouseMove: + case QEvent::MouseButtonRelease: { + setScrolling(false); + if (!m_filterMouseEvents) { + break; + } + if (static_cast(event)->source() == Qt::MouseEventNotSynthesized && item == m_flickable) { + return true; + } + break; + } + + case QEvent::HoverEnter: + case QEvent::HoverMove: { + if (!m_filterMouseEvents) { + break; + } + if (m_wasTouched && (item == m_verticalScrollBar || item == m_horizontalScrollBar)) { + if (m_verticalScrollBar) { + m_verticalScrollBar->setProperty("interactive", true); + } + if (m_horizontalScrollBar) { + m_horizontalScrollBar->setProperty("interactive", true); + } + } + break; + } + + case QEvent::KeyPress: { + if (!m_keyNavigationEnabled) { + break; + } + QKeyEvent *keyEvent = static_cast(event); + bool horizontalScroll = keyEvent->modifiers() & m_defaultHorizontalScrollModifiers; + switch (keyEvent->key()) { + case Qt::Key_Up: return scrollUp(); + case Qt::Key_Down: return scrollDown(); + case Qt::Key_Left: return scrollLeft(); + case Qt::Key_Right: return scrollRight(); + case Qt::Key_PageUp: return horizontalScroll ? scrollLeft(pageWidth) : scrollUp(pageHeight); + case Qt::Key_PageDown: return horizontalScroll ? scrollRight(pageWidth) : scrollDown(pageHeight); + case Qt::Key_Home: return horizontalScroll ? scrollLeft(contentWidth) : scrollUp(contentHeight); + case Qt::Key_End: return horizontalScroll ? scrollRight(contentWidth) : scrollDown(contentHeight); + default: break; + } + break; + } + + default: break; + } + + return false; +} diff --git a/src/3rdparty/kirigami/wheelhandler.h b/src/3rdparty/kirigami/wheelhandler.h index 114869465..d921a6c9d 100644 --- a/src/3rdparty/kirigami/wheelhandler.h +++ b/src/3rdparty/kirigami/wheelhandler.h @@ -1,18 +1,18 @@ -/* - * SPDX-FileCopyrightText: 2019 Marco Martin - * - * SPDX-License-Identifier: LGPL-2.0-or-later +/* SPDX-FileCopyrightText: 2019 Marco Martin + * SPDX-FileCopyrightText: 2021 Noah Davis + * SPDX-License-Identifier: LGPL-2.0-or-later */ #pragma once -#include +#include +#include #include #include -#include +#include +#include class QWheelEvent; - class WheelHandler; /** @@ -132,59 +132,135 @@ private: bool m_accepted = false; }; -class GlobalWheelFilter : public QObject +class WheelFilterItem : public QQuickItem { Q_OBJECT - public: - GlobalWheelFilter(QObject *parent = nullptr); - ~GlobalWheelFilter() override; - - static GlobalWheelFilter *self(); - - void setItemHandlerAssociation(QQuickItem *item, WheelHandler *handler); - void removeItemHandlerAssociation(QQuickItem *item, WheelHandler *handler); - -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - void manageWheel(QQuickItem *target, QWheelEvent *wheel); - - QMultiHash m_handlersForItem; - KirigamiWheelEvent m_wheelEvent; + WheelFilterItem(QQuickItem *parent = nullptr); }; - - /** - * This class intercepts the mouse wheel events of its target, and gives them to the user code as a signal, which can be used for custom mouse wheel management code. - * The handler can block completely the wheel events from its target, and if it's a Flickable, it can automatically handle scrolling on it + * @brief Handles scrolling for a Flickable and 2 attached ScrollBars. + * + * WheelHandler filters events from a Flickable, a vertical ScrollBar and a horizontal ScrollBar. + * Wheel and KeyPress events (when `keyNavigationEnabled` is true) are used to scroll the Flickable. + * When `filterMouseEvents` is true, WheelHandler blocks mouse button input from reaching the Flickable + * and sets the `interactive` property of the scrollbars to false when touch input is used. + * + * Wheel event handling behavior: + * + * - Pixel delta is ignored unless angle delta is not available because pixel delta scrolling is too slow. Qt Widgets doesn't use pixel delta either, so the default scroll speed should be consistent with Qt Widgets. + * - When using angle delta, scroll using the step increments defined by `verticalStepSize` and `horizontalStepSize`. + * - When one of the keyboard modifiers in `pageScrollModifiers` is used, scroll by pages. + * - When using a device that doesn't use 120 angle delta unit increments such as a touchpad, the `verticalStepSize`, `horizontalStepSize` and page increments (if using page scrolling) will be multiplied by `angle delta / 120` to keep scrolling smooth. + * - If scrolling has happened in the last 400ms, use an internal QQuickItem stacked over the Flickable's contentItem to catch wheel events and use those wheel events to scroll, if possible. This prevents controls inside the Flickable's contentItem that allow scrolling to change the value (e.g., Sliders, SpinBoxes) from conflicting with scrolling the page. + * + * Common usage with a Flickable: + * + * @include wheelhandler/FlickableUsage.qml + * + * Common usage inside of a ScrollView template: + * + * @include wheelhandler/ScrollViewUsage.qml + * */ class WheelHandler : public QObject { Q_OBJECT /** - * target: Item + * @brief This property holds the Qt Quick Flickable that the WheelHandler will control. + */ + Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged FINAL) + + /** + * @brief This property holds the vertical step size. + * + * The default value is equivalent to `20 * Qt.styleHints.wheelScrollLines`. This is consistent with the default increment for QScrollArea. + * + * @sa horizontalStepSize * - * The target we want to manage wheel events. - * We will receive wheel() signals every time the user moves - * the mouse wheel (or scrolls with the touchpad) on top - * of that item. + * @since KDE Frameworks 5.89 */ - Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged) + Q_PROPERTY(qreal verticalStepSize READ verticalStepSize + WRITE setVerticalStepSize RESET resetVerticalStepSize + NOTIFY verticalStepSizeChanged FINAL) /** - * blockTargetWheel: bool + * @brief This property holds the horizontal step size. * - * If true, the target won't receive any wheel event at all (default true) + * The default value is equivalent to `20 * Qt.styleHints.wheelScrollLines`. This is consistent with the default increment for QScrollArea. + * + * @sa verticalStepSize + * + * @since KDE Frameworks 5.89 + */ + Q_PROPERTY(qreal horizontalStepSize READ horizontalStepSize + WRITE setHorizontalStepSize RESET resetHorizontalStepSize + NOTIFY horizontalStepSizeChanged FINAL) + + /** + * @brief This property holds the keyboard modifiers that will be used to start page scrolling. + * + * The default value is equivalent to `Qt.ControlModifier | Qt.ShiftModifier`. This matches QScrollBar, which uses QAbstractSlider behavior. + * + * @since KDE Frameworks 5.89 + */ + Q_PROPERTY(Qt::KeyboardModifiers pageScrollModifiers READ pageScrollModifiers + WRITE setPageScrollModifiers RESET resetPageScrollModifiers + NOTIFY pageScrollModifiersChanged FINAL) + + /** + * @brief This property holds whether the WheelHandler filters mouse events like a Qt Quick Controls ScrollView would. + * + * Touch events are allowed to flick the view and they make the scrollbars not interactive. + * + * Mouse events are not allowed to flick the view and they make the scrollbars interactive. + * + * Hover events on the scrollbars and wheel events on anything also make the scrollbars interactive when this property is set to true. + * + * The default value is `false`. + * + * @since KDE Frameworks 5.89 + */ + Q_PROPERTY(bool filterMouseEvents READ filterMouseEvents + WRITE setFilterMouseEvents NOTIFY filterMouseEventsChanged FINAL) + + /** + * @brief This property holds whether the WheelHandler handles keyboard scrolling. + * + * - Left arrow scrolls a step to the left. + * - Right arrow scrolls a step to the right. + * - Up arrow scrolls a step upwards. + * - Down arrow scrolls a step downwards. + * - PageUp scrolls to the previous page. + * - PageDown scrolls to the next page. + * - Home scrolls to the beginning. + * - End scrolls to the end. + * - When Alt is held, scroll horizontally when using PageUp, PageDown, Home or End. + * + * The default value is `false`. + * + * @since KDE Frameworks 5.89 + */ + Q_PROPERTY(bool keyNavigationEnabled READ keyNavigationEnabled + WRITE setKeyNavigationEnabled NOTIFY keyNavigationEnabledChanged FINAL) + + /** + * @brief This property holds whether the WheelHandler blocks all wheel events from reaching the Flickable. + * + * When this property is false, scrolling the Flickable with WheelHandler will only block an event from reaching the Flickable if the Flickable is actually scrolled by WheelHandler. + * + * NOTE: Wheel events created by touchpad gestures with pixel deltas will always be accepted no matter what. This is because they will cause the Flickable to jump back to where scrolling started unless the events are always accepted before they reach the Flickable. + * + * The default value is true. */ Q_PROPERTY(bool blockTargetWheel MEMBER m_blockTargetWheel NOTIFY blockTargetWheelChanged) /** - * scrollFlickableTarget: bool - * If this property is true and the target is a Flickable, wheel events will cause the Flickable to scroll (default true) + * @brief This property holds whether the WheelHandler can use wheel events to scroll the Flickable. + * + * The default value is true. */ Q_PROPERTY(bool scrollFlickableTarget MEMBER m_scrollFlickableTarget NOTIFY scrollFlickableTargetChanged) @@ -195,19 +271,108 @@ public: QQuickItem *target() const; void setTarget(QQuickItem *target); + qreal verticalStepSize() const; + void setVerticalStepSize(qreal stepSize); + void resetVerticalStepSize(); + + qreal horizontalStepSize() const; + void setHorizontalStepSize(qreal stepSize); + void resetHorizontalStepSize(); + + Qt::KeyboardModifiers pageScrollModifiers() const; + void setPageScrollModifiers(Qt::KeyboardModifiers modifiers); + void resetPageScrollModifiers(); + + bool filterMouseEvents() const; + void setFilterMouseEvents(bool enabled); + + bool keyNavigationEnabled() const; + void setKeyNavigationEnabled(bool enabled); + + /** + * Scroll up one step. If the stepSize parameter is less than 0, the verticalStepSize will be used. + * + * returns true if the contentItem was moved. + * + * @since KDE Frameworks 5.89 + */ + Q_INVOKABLE bool scrollUp(qreal stepSize = -1); + + /** + * Scroll down one step. If the stepSize parameter is less than 0, the verticalStepSize will be used. + * + * returns true if the contentItem was moved. + * + * @since KDE Frameworks 5.89 + */ + Q_INVOKABLE bool scrollDown(qreal stepSize = -1); + + /** + * Scroll left one step. If the stepSize parameter is less than 0, the horizontalStepSize will be used. + * + * returns true if the contentItem was moved. + * + * @since KDE Frameworks 5.89 + */ + Q_INVOKABLE bool scrollLeft(qreal stepSize = -1); + + /** + * Scroll right one step. If the stepSize parameter is less than 0, the horizontalStepSize will be used. + * + * returns true if the contentItem was moved. + * + * @since KDE Frameworks 5.89 + */ + Q_INVOKABLE bool scrollRight(qreal stepSize = -1); + Q_SIGNALS: void targetChanged(); + void verticalStepSizeChanged(); + void horizontalStepSizeChanged(); + void pageScrollModifiersChanged(); + void filterMouseEventsChanged(); + void keyNavigationEnabledChanged(); void blockTargetWheelChanged(); void scrollFlickableTargetChanged(); + + /** + * @brief This signal is emitted when a wheel event reaches the event filter, just before scrolling is handled. + * + * Accepting the wheel event in the `onWheel` signal handler prevents scrolling from happening. + */ void wheel(KirigamiWheelEvent *wheel); +protected: + bool eventFilter(QObject *watched, QEvent *event) override; + private: - QPointer m_target; + void setScrolling(bool scrolling); + bool scrollFlickable(QPointF pixelDelta, + QPointF angleDelta = {}, + Qt::KeyboardModifiers modifiers = Qt::NoModifier); + + QPointer m_flickable; + QPointer m_verticalScrollBar; + QPointer m_horizontalScrollBar; + QPointer m_filterItem; + // Matches QScrollArea and QTextEdit + qreal m_defaultPixelStepSize = 20 * QGuiApplication::styleHints()->wheelScrollLines(); + qreal m_verticalStepSize = m_defaultPixelStepSize; + qreal m_horizontalStepSize = m_defaultPixelStepSize; + bool m_explicitVStepSize = false; + bool m_explicitHStepSize = false; + bool m_wheelScrolling = false; + constexpr static qreal m_wheelScrollingDuration = 400; + bool m_filterMouseEvents = false; + bool m_keyNavigationEnabled = false; + bool m_wasTouched = false; bool m_blockTargetWheel = true; bool m_scrollFlickableTarget = true; - KirigamiWheelEvent m_wheelEvent; - - friend class GlobalWheelFilter; + // Same as QXcbWindow. + constexpr static Qt::KeyboardModifiers m_defaultHorizontalScrollModifiers = Qt::AltModifier; + // Same as QScrollBar/QAbstractSlider. + constexpr static Qt::KeyboardModifiers m_defaultPageScrollModifiers = Qt::ControlModifier | Qt::ShiftModifier; + Qt::KeyboardModifiers m_pageScrollModifiers = m_defaultPageScrollModifiers; + QTimer m_wheelScrollingTimer; + KirigamiWheelEvent m_kirigamiWheelEvent; }; - - diff --git a/src/3rdparty/kmessagewidget/kmessagewidget.cpp b/src/3rdparty/kmessagewidget/kmessagewidget.cpp index 595a5fa33..29666a6c4 100644 --- a/src/3rdparty/kmessagewidget/kmessagewidget.cpp +++ b/src/3rdparty/kmessagewidget/kmessagewidget.cpp @@ -61,7 +61,7 @@ public: void slotTimeLineChanged(qreal); void slotTimeLineFinished(); - int bestContentHeight() const; + [[nodiscard]] int bestContentHeight() const; }; void KMessageWidgetPrivate::init(KMessageWidget *q_ptr) diff --git a/src/3rdparty/kmessagewidget/kmessagewidget.h b/src/3rdparty/kmessagewidget/kmessagewidget.h index cc2767bf9..6ace579c9 100644 --- a/src/3rdparty/kmessagewidget/kmessagewidget.h +++ b/src/3rdparty/kmessagewidget/kmessagewidget.h @@ -138,7 +138,7 @@ public: * Get the text of this message widget. * @see setText() */ - QString text() const; + [[nodiscard]] QString text() const; /** * Check whether word wrap is enabled. @@ -149,14 +149,14 @@ public: * * @see setWordWrap() */ - bool wordWrap() const; + [[nodiscard]] bool wordWrap() const; /** * Check whether the close button is visible. * * @see setCloseButtonVisible() */ - bool isCloseButtonVisible() const; + [[nodiscard]] bool isCloseButtonVisible() const; /** * Get the type of this message. @@ -164,7 +164,7 @@ public: * * @see KMessageWidget::MessageType, setMessageType() */ - MessageType messageType() const; + [[nodiscard]] MessageType messageType() const; /** * Add @p action to the message widget. @@ -187,24 +187,24 @@ public: /** * Returns the preferred size of the message widget. */ - QSize sizeHint() const override; + [[nodiscard]] QSize sizeHint() const override; /** * Returns the minimum size of the message widget. */ - QSize minimumSizeHint() const override; + [[nodiscard]] QSize minimumSizeHint() const override; /** * Returns the required height for @p width. * @param width the width in pixels */ - int heightForWidth(int width) const override; + [[nodiscard]] int heightForWidth(int width) const override; /** * The icon shown on the left of the text. By default, no icon is shown. * @since 4.11 */ - QIcon icon() const; + [[nodiscard]] QIcon icon() const; /** * Check whether the hide animation started by calling animatedHide() @@ -214,7 +214,7 @@ public: * @see animatedHide(), hideAnimationFinished() * @since 5.0 */ - bool isHideAnimationRunning() const; + [[nodiscard]] bool isHideAnimationRunning() const; /** * Check whether the show animation started by calling animatedShow() @@ -224,7 +224,7 @@ public: * @see animatedShow(), showAnimationFinished() * @since 5.0 */ - bool isShowAnimationRunning() const; + [[nodiscard]] bool isShowAnimationRunning() const; public Q_SLOTS: /** diff --git a/src/3rdparty/qtlockedfile/qtlockedfile.h b/src/3rdparty/qtlockedfile/qtlockedfile.h index 128cbf0ff..5e1b487a2 100644 --- a/src/3rdparty/qtlockedfile/qtlockedfile.h +++ b/src/3rdparty/qtlockedfile/qtlockedfile.h @@ -61,8 +61,8 @@ public: bool lock(LockMode mode, bool block = true); bool unlock(); - bool isLocked() const; - LockMode lockMode() const; + [[nodiscard]] bool isLocked() const; + [[nodiscard]] LockMode lockMode() const; private: #ifdef Q_OS_WIN diff --git a/src/3rdparty/qtokenizer/qtokenizer.h b/src/3rdparty/qtokenizer/qtokenizer.h index c317c42a9..0eda45a66 100644 --- a/src/3rdparty/qtokenizer/qtokenizer.h +++ b/src/3rdparty/qtokenizer/qtokenizer.h @@ -71,11 +71,11 @@ struct QTokenizerPrivate { { } - bool isDelimiter(char_type c) const { + [[nodiscard]] bool isDelimiter(char_type c) const { return delimiters.contains(c); } - bool isQuote(char_type c) const { + [[nodiscard]] bool isQuote(char_type c) const { return quotes.contains(c); } @@ -212,14 +212,14 @@ public: Returns true if the current token is a delimiter, if one more more delimiting characters have been set. */ - bool isDelimiter() const { return d->isDelim; } + [[nodiscard]] bool isDelimiter() const { return d->isDelim; } /*! Returns the current token. Use \c hasNext() to fetch the next token. */ - T next() const { + [[nodiscard]] T next() const { int len = std::distance(d->tokenBegin, d->tokenEnd); const_iterator tmpStart = d->tokenBegin; if (!d->returnQuotes && len > 1 && d->isQuote(*d->tokenBegin)) { diff --git a/src/3rdparty/qtsingleapplication/qtlocalpeer.h b/src/3rdparty/qtsingleapplication/qtlocalpeer.h index ce93a5e0a..352976978 100644 --- a/src/3rdparty/qtsingleapplication/qtlocalpeer.h +++ b/src/3rdparty/qtsingleapplication/qtlocalpeer.h @@ -27,6 +27,8 @@ ** ****************************************************************************/ +#pragma once + #include #include @@ -43,7 +45,7 @@ public: explicit QtLocalPeer(QObject *parent = nullptr, const QString &appId = QString()); bool isClient(); bool sendMessage(const QString &message, int timeout, bool block); - QString applicationId() const + [[nodiscard]] QString applicationId() const { return id; } static QString appSessionId(const QString &appId); diff --git a/src/3rdparty/qtsingleapplication/qtsingleapplication.h b/src/3rdparty/qtsingleapplication/qtsingleapplication.h index 1fa8d9131..cb9c80b5d 100644 --- a/src/3rdparty/qtsingleapplication/qtsingleapplication.h +++ b/src/3rdparty/qtsingleapplication/qtsingleapplication.h @@ -49,9 +49,9 @@ public: bool isRunning(qint64 pid = -1); void setActivationWindow(QWidget* aw, bool activateOnMessage = true); - QWidget* activationWindow() const; + [[nodiscard]] QWidget* activationWindow() const; - QString applicationId() const; + [[nodiscard]] QString applicationId() const; void setBlock(bool value); public Q_SLOTS: diff --git a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h index 157503212..139f9d858 100644 --- a/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h +++ b/src/3rdparty/qtsingleapplication/qtsinglecoreapplication.h @@ -42,7 +42,7 @@ public: QtSingleCoreApplication(const QString &id, int &argc, char **argv); bool isRunning(); - QString id() const; + [[nodiscard]] QString id() const; void setBlock(bool value); public Q_SLOTS: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd3805799..a4d06844a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,8 +4,57 @@ endif() include(ECMEnableSanitizers) -find_package(Qt5 5.15 COMPONENTS Core Network Xml Concurrent REQUIRED) -find_package(Qt5 5.15 COMPONENTS WebEngineWidgets WebEngine) +set(REQUIRED_QT_VERSION "5.15.0") + +find_package(Qt5Core ${REQUIRED_QT_VERSION} CONFIG QUIET) +set_package_properties(Qt5Core PROPERTIES + DESCRIPTION "Qt5 Core component." + TYPE REQUIRED +) + +find_package(Qt5Network ${REQUIRED_QT_VERSION} CONFIG QUIET) +set_package_properties(Qt5Network PROPERTIES + DESCRIPTION "Qt5 Network component." + TYPE REQUIRED +) + +find_package(Qt5Xml ${REQUIRED_QT_VERSION} CONFIG QUIET) +set_package_properties(Qt5Xml PROPERTIES + DESCRIPTION "Qt5 Xml component." + TYPE REQUIRED +) + +find_package(Qt5Concurrent ${REQUIRED_QT_VERSION} CONFIG QUIET) +set_package_properties(Qt5Concurrent PROPERTIES + DESCRIPTION "Qt5 Concurrent component." + TYPE REQUIRED +) + +find_package(Qt5WebEngineWidgets ${REQUIRED_QT_VERSION} CONFIG QUIET) +if(APPLE) + set_package_properties(Qt5WebEngineWidgets PROPERTIES + DESCRIPTION "Qt5 WebEngineWidgets component." + TYPE RECOMMENDED + ) +else() + set_package_properties(Qt5WebEngineWidgets PROPERTIES + DESCRIPTION "Qt5 WebEngineWidgets component." + TYPE REQUIRED + ) +endif() + +find_package(Qt5WebEngine ${REQUIRED_QT_VERSION} CONFIG QUIET) +if(APPLE) + set_package_properties(Qt5WebEngine PROPERTIES + DESCRIPTION "Qt5 WebEngine component." + TYPE RECOMMENDED + ) +else() + set_package_properties(Qt5WebEngine PROPERTIES + DESCRIPTION "Qt5 WebEngine component." + TYPE REQUIRED + ) +endif() if(Qt5WebEngine_FOUND AND Qt5WebEngineWidgets_FOUND) add_compile_definitions(WITH_WEBENGINE=1) diff --git a/src/common/checksums.h b/src/common/checksums.h index 4fd40d78b..3c0e5528f 100644 --- a/src/common/checksums.h +++ b/src/common/checksums.h @@ -169,8 +169,8 @@ public: */ void start(std::unique_ptr device, const QByteArray &checksumHeader); - QByteArray calculatedChecksumType() const; - QByteArray calculatedChecksum() const; + [[nodiscard]] QByteArray calculatedChecksumType() const; + [[nodiscard]] QByteArray calculatedChecksum() const; signals: void validated(const QByteArray &checksumType, const QByteArray &checksum); diff --git a/src/common/ownsql.h b/src/common/ownsql.h index d409dc827..47c87b2e8 100644 --- a/src/common/ownsql.h +++ b/src/common/ownsql.h @@ -50,7 +50,7 @@ public: bool transaction(); bool commit(); void close(); - QString error() const; + [[nodiscard]] QString error() const; sqlite3 *sqliteDb(); private: @@ -111,8 +111,8 @@ public: int prepare(const QByteArray &sql, bool allow_failure = false); ~SqlQuery(); - QString error() const; - int errorId() const; + [[nodiscard]] QString error() const; + [[nodiscard]] int errorId() const; /// Checks whether the value at the given column index is NULL bool nullValue(int index); @@ -152,7 +152,7 @@ public: bindValueInternal(pos, value); } - const QByteArray &lastQuery() const; + [[nodiscard]] const QByteArray &lastQuery() const; int numRowsAffected(); void reset_and_clear_bindings(); diff --git a/src/common/preparedsqlquerymanager.h b/src/common/preparedsqlquerymanager.h index 64cecabbd..beea7d74b 100644 --- a/src/common/preparedsqlquerymanager.h +++ b/src/common/preparedsqlquerymanager.h @@ -91,6 +91,11 @@ public: DeleteKeyValueStoreQuery, GetConflictRecordQuery, SetConflictRecordQuery, + GetCaseClashConflictRecordQuery, + GetCaseClashConflictRecordByPathQuery, + SetCaseClashConflictRecordQuery, + DeleteCaseClashConflictRecordQuery, + GetAllCaseClashConflictPathQuery, DeleteConflictRecordQuery, GetRawPinStateQuery, GetEffectivePinStateQuery, @@ -98,6 +103,10 @@ public: CountDehydratedFilesQuery, SetPinStateQuery, WipePinStateQuery, + SetE2EeLockedFolderQuery, + GetE2EeLockedFolderQuery, + GetE2EeLockedFoldersQuery, + DeleteE2EeLockedFolderQuery, PreparedQueryCount }; diff --git a/src/common/remotepermissions.h b/src/common/remotepermissions.h index e02738a60..6d7c56633 100644 --- a/src/common/remotepermissions.h +++ b/src/common/remotepermissions.h @@ -63,10 +63,10 @@ public: RemotePermissions() = default; /// array with one character per permission, "" is null, " " is non-null but empty - QByteArray toDbValue() const; + [[nodiscard]] QByteArray toDbValue() const; /// output for display purposes, no defined format (same as toDbValue in practice) - QString toString() const; + [[nodiscard]] QString toString() const; /// read value that was written with toDbValue() static RemotePermissions fromDbValue(const QByteArray &); @@ -74,7 +74,7 @@ public: /// read a permissions string received from the server, never null static RemotePermissions fromServerString(const QString &); - bool hasPermission(Permissions p) const + [[nodiscard]] bool hasPermission(Permissions p) const { return _value & (1 << static_cast(p)); } @@ -87,7 +87,7 @@ public: _value &= ~(1 << static_cast(p)); } - bool isNull() const { return !(_value & notNullMask); } + [[nodiscard]] bool isNull() const { return !(_value & notNullMask); } friend bool operator==(RemotePermissions a, RemotePermissions b) { return a._value == b._value; diff --git a/src/common/result.h b/src/common/result.h index 77a9d121c..129efa108 100644 --- a/src/common/result.h +++ b/src/common/result.h @@ -117,13 +117,13 @@ public: return &_result; } - const T &get() const + [[nodiscard]] const T &get() const { ASSERT(!_isError) return _result; } - const Error &error() const & + [[nodiscard]] const Error &error() const & { ASSERT(_isError); return _error; @@ -134,7 +134,7 @@ public: return std::move(_error); } - bool isValid() const { return !_isError; } + [[nodiscard]] bool isValid() const { return !_isError; } }; namespace detail { diff --git a/src/common/shellextensionutils.cpp b/src/common/shellextensionutils.cpp index d6f4b244c..b2b59be80 100644 --- a/src/common/shellextensionutils.cpp +++ b/src/common/shellextensionutils.cpp @@ -29,7 +29,6 @@ namespace Protocol { if (!valid) { qCWarning(lcShellExtensionUtils) << "Invalid shell extensions IPC protocol: " << message.value(QStringLiteral("version")) << " vs " << Version; } - Q_ASSERT(valid); return valid; } } diff --git a/src/common/shellextensionutils.h b/src/common/shellextensionutils.h index ca0d9922d..d0b2e071d 100644 --- a/src/common/shellextensionutils.h +++ b/src/common/shellextensionutils.h @@ -23,11 +23,14 @@ QString serverNameForApplicationName(const QString &applicationName); QString serverNameForApplicationNameDefault(); namespace Protocol { + static constexpr auto CustomStateProviderRequestKey = "customStateProviderRequest"; + static constexpr auto CustomStateDataKey = "customStateData"; + static constexpr auto CustomStateStatesKey = "states"; + static constexpr auto FilePathKey = "filePath"; static constexpr auto ThumbnailProviderRequestKey = "thumbnailProviderRequest"; - static constexpr auto ThumbnailProviderRequestFilePathKey = "filePath"; static constexpr auto ThumbnailProviderRequestFileSizeKey = "fileSize"; static constexpr auto ThumnailProviderDataKey = "thumbnailData"; - static constexpr auto Version = "1.0"; + static constexpr auto Version = "2.0"; QByteArray createJsonMessage(const QVariantMap &message); bool validateProtocolVersion(const QVariantMap &message); diff --git a/src/common/syncfilestatus.h b/src/common/syncfilestatus.h index 87ebb57e8..801fd9204 100644 --- a/src/common/syncfilestatus.h +++ b/src/common/syncfilestatus.h @@ -43,12 +43,12 @@ public: SyncFileStatus(SyncFileStatusTag); void set(SyncFileStatusTag tag); - SyncFileStatusTag tag() const; + [[nodiscard]] SyncFileStatusTag tag() const; void setShared(bool isShared); - bool shared() const; + [[nodiscard]] bool shared() const; - QString toSocketAPIString() const; + [[nodiscard]] QString toSocketAPIString() const; private: SyncFileStatusTag _tag = StatusNone; diff --git a/src/common/syncjournaldb.cpp b/src/common/syncjournaldb.cpp index a2caff63a..84668ed26 100644 --- a/src/common/syncjournaldb.cpp +++ b/src/common/syncjournaldb.cpp @@ -49,7 +49,7 @@ Q_LOGGING_CATEGORY(lcDb, "nextcloud.sync.database", QtInfoMsg) #define GET_FILE_RECORD_QUERY \ "SELECT path, inode, modtime, type, md5, fileid, remotePerm, filesize," \ " ignoredChildrenRemote, contentchecksumtype.name || ':' || contentChecksum, e2eMangledName, isE2eEncrypted, " \ - " lock, lockOwnerDisplayName, lockOwnerId, lockType, lockOwnerEditor, lockTime, lockTimeout " \ + " lock, lockOwnerDisplayName, lockOwnerId, lockType, lockOwnerEditor, lockTime, lockTimeout, isShared, lastShareStateFetchedTimestmap, sharedByMe" \ " FROM metadata" \ " LEFT JOIN checksumtype as contentchecksumtype ON metadata.contentChecksumTypeId == contentchecksumtype.id" @@ -74,6 +74,9 @@ static void fillFileRecordFromGetQuery(SyncJournalFileRecord &rec, SqlQuery &que rec._lockstate._lockEditorApp = query.stringValue(16); rec._lockstate._lockTime = query.int64Value(17); rec._lockstate._lockTimeout = query.int64Value(18); + rec._isShared = query.intValue(19) > 0; + rec._lastShareStateFetchedTimestamp = query.int64Value(20); + rec._sharedByMe = query.intValue(21) > 0; } static QByteArray defaultJournalMode(const QString &dbPath) @@ -516,6 +519,18 @@ bool SyncJournalDb::checkConnect() return sqlFail(QStringLiteral("Create table conflicts"), createQuery); } + // create the caseconflicts table. + createQuery.prepare("CREATE TABLE IF NOT EXISTS caseconflicts(" + "path TEXT PRIMARY KEY," + "baseFileId TEXT," + "baseEtag TEXT," + "baseModtime INTEGER," + "basePath TEXT UNIQUE" + ");"); + if (!createQuery.exec()) { + return sqlFail(QStringLiteral("Create table caseconflicts"), createQuery); + } + createQuery.prepare("CREATE TABLE IF NOT EXISTS version(" "major INTEGER(8)," "minor INTEGER(8)," @@ -526,6 +541,16 @@ bool SyncJournalDb::checkConnect() return sqlFail(QStringLiteral("Create table version"), createQuery); } + // create the e2EeLockedFolders table. + createQuery.prepare( + "CREATE TABLE IF NOT EXISTS e2EeLockedFolders(" + "folderId VARCHAR(128) PRIMARY KEY," + "token VARCHAR(4096)" + ");"); + if (!createQuery.exec()) { + return sqlFail(QStringLiteral("Create table e2EeLockedFolders"), createQuery); + } + bool forceRemoteDiscovery = false; SqlQuery versionQuery("SELECT major, minor, patch FROM version;", _db); @@ -727,6 +752,9 @@ bool SyncJournalDb::updateMetadataTableStructure() addColumn(QStringLiteral("contentChecksumTypeId"), QStringLiteral("INTEGER")); addColumn(QStringLiteral("e2eMangledName"), QStringLiteral("TEXT")); addColumn(QStringLiteral("isE2eEncrypted"), QStringLiteral("INTEGER")); + addColumn(QStringLiteral("isShared"), QStringLiteral("INTEGER")); + addColumn(QStringLiteral("lastShareStateFetchedTimestmap"), QStringLiteral("INTEGER")); + addColumn(QStringLiteral("sharedByMe"), QStringLiteral("INTEGER")); auto uploadInfoColumns = tableColumns("uploadinfo"); if (uploadInfoColumns.isEmpty()) @@ -881,13 +909,18 @@ Result SyncJournalDb::setFileRecord(const SyncJournalFileRecord & } qCInfo(lcDb) << "Updating file record for path:" << record.path() << "inode:" << record._inode - << "modtime:" << record._modtime << "type:" << record._type - << "etag:" << record._etag << "fileId:" << record._fileId << "remotePerm:" << record._remotePerm.toString() + << "modtime:" << record._modtime << "type:" << record._type << "etag:" << record._etag + << "fileId:" << record._fileId << "remotePerm:" << record._remotePerm.toString() << "fileSize:" << record._fileSize << "checksum:" << record._checksumHeader << "e2eMangledName:" << record.e2eMangledName() << "isE2eEncrypted:" << record._isE2eEncrypted - << "lock:" << (record._lockstate._locked ? "true" : "false") << "lock owner type:" << record._lockstate._lockOwnerType - << "lock owner:" << record._lockstate._lockOwnerDisplayName << "lock owner id:" << record._lockstate._lockOwnerId - << "lock editor:" << record._lockstate._lockEditorApp; + << "lock:" << (record._lockstate._locked ? "true" : "false") + << "lock owner type:" << record._lockstate._lockOwnerType + << "lock owner:" << record._lockstate._lockOwnerDisplayName + << "lock owner id:" << record._lockstate._lockOwnerId + << "lock editor:" << record._lockstate._lockEditorApp + << "sharedByMe:" << record._sharedByMe + << "isShared:" << record._isShared + << "lastShareStateFetchedTimestamp:" << record._lastShareStateFetchedTimestamp; const qint64 phash = getPHash(record._path); if (!checkConnect()) { @@ -913,8 +946,8 @@ Result SyncJournalDb::setFileRecord(const SyncJournalFileRecord & const auto query = _queryManager.get(PreparedSqlQueryManager::SetFileRecordQuery, QByteArrayLiteral("INSERT OR REPLACE INTO metadata " "(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, " "contentChecksum, contentChecksumTypeId, e2eMangledName, isE2eEncrypted, lock, lockType, lockOwnerDisplayName, lockOwnerId, " - "lockOwnerEditor, lockTime, lockTimeout) " - "VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25);"), + "lockOwnerEditor, lockTime, lockTimeout, isShared, lastShareStateFetchedTimestmap, sharedByMe) " + "VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25, ?26, ?27, ?28);"), _db); if (!query) { return query->error(); @@ -945,6 +978,9 @@ Result SyncJournalDb::setFileRecord(const SyncJournalFileRecord & query->bindValue(23, record._lockstate._lockEditorApp); query->bindValue(24, record._lockstate._lockTime); query->bindValue(25, record._lockstate._lockTimeout); + query->bindValue(26, record._isShared); + query->bindValue(27, record._lastShareStateFetchedTimestamp); + query->bindValue(28, record._sharedByMe); if (!query->exec()) { return query->error(); @@ -1351,7 +1387,7 @@ bool SyncJournalDb::updateFileRecordChecksum(const QString &filename, } bool SyncJournalDb::updateLocalMetadata(const QString &filename, - qint64 modtime, qint64 size, quint64 inode) + qint64 modtime, qint64 size, quint64 inode, const SyncJournalFileLockInfo &lockInfo) { QMutexLocker locker(&_mutex); @@ -1365,7 +1401,9 @@ bool SyncJournalDb::updateLocalMetadata(const QString &filename, } const auto query = _queryManager.get(PreparedSqlQueryManager::SetFileRecordLocalMetadataQuery, QByteArrayLiteral("UPDATE metadata" - " SET inode=?2, modtime=?3, filesize=?4" + " SET inode=?2, modtime=?3, filesize=?4, lock=?5, lockType=?6," + " lockOwnerDisplayName=?7, lockOwnerId=?8, lockOwnerEditor = ?9," + " lockTime=?10, lockTimeout=?11" " WHERE phash == ?1;"), _db); if (!query) { @@ -1376,6 +1414,13 @@ bool SyncJournalDb::updateLocalMetadata(const QString &filename, query->bindValue(2, inode); query->bindValue(3, modtime); query->bindValue(4, size); + query->bindValue(5, lockInfo._locked ? 1 : 0); + query->bindValue(6, lockInfo._lockOwnerType); + query->bindValue(7, lockInfo._lockOwnerDisplayName); + query->bindValue(8, lockInfo._lockOwnerId); + query->bindValue(9, lockInfo._lockEditorApp); + query->bindValue(10, lockInfo._lockTime); + query->bindValue(11, lockInfo._lockTimeout); return query->exec(); } @@ -1721,7 +1766,9 @@ void SyncJournalDb::deleteStaleFlagsEntries() return; SqlQuery delQuery("DELETE FROM flags WHERE path != '' AND path NOT IN (SELECT path from metadata);", _db); - delQuery.exec(); + if (!delQuery.exec()) { + sqlFail(QStringLiteral("deleteStaleFlagsEntries"), delQuery); + } } int SyncJournalDb::errorBlackListEntryCount() @@ -1862,14 +1909,18 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo &info) qCDebug(lcDb) << "Deleting Poll job" << info._file; SqlQuery query("DELETE FROM async_poll WHERE path=?", _db); query.bindValue(1, info._file); - query.exec(); + if (!query.exec()) { + sqlFail(QStringLiteral("setPollInfo DELETE FROM async_poll"), query); + } } else { SqlQuery query("INSERT OR REPLACE INTO async_poll (path, modtime, filesize, pollpath) VALUES( ? , ? , ? , ? )", _db); query.bindValue(1, info._file); query.bindValue(2, info._modtime); query.bindValue(3, info._fileSize); query.bindValue(4, info._url); - query.exec(); + if (!query.exec()) { + sqlFail(QStringLiteral("setPollInfo INSERT OR REPLACE INTO async_poll"), query); + } } } @@ -1955,7 +2006,10 @@ void SyncJournalDb::avoidRenamesOnNextSync(const QByteArray &path) SqlQuery query(_db); query.prepare("UPDATE metadata SET fileid = '', inode = '0' WHERE " IS_PREFIX_PATH_OR_EQUAL("?1", "path")); query.bindValue(1, path); - query.exec(); + + if (!query.exec()) { + sqlFail(QStringLiteral("avoidRenamesOnNextSync path: %1").arg(QString::fromUtf8(path)), query); + } // We also need to remove the ETags so the update phase refreshes the directory paths // on the next sync @@ -1980,7 +2034,10 @@ void SyncJournalDb::schedulePathForRemoteDiscovery(const QByteArray &fileName) // Note: CSYNC_FTW_TYPE_DIR == 2 query.prepare("UPDATE metadata SET md5='_invalid_' WHERE " IS_PREFIX_PATH_OR_EQUAL("path", "?1") " AND type == 2;"); query.bindValue(1, argument); - query.exec(); + + if (!query.exec()) { + sqlFail(QStringLiteral("schedulePathForRemoteDiscovery path: %1").arg(QString::fromUtf8(fileName)), query); + } // Prevent future overwrite of the etags of this folder and all // parent folders for this sync @@ -2009,7 +2066,10 @@ void SyncJournalDb::forceRemoteDiscoveryNextSyncLocked() qCInfo(lcDb) << "Forcing remote re-discovery by deleting folder Etags"; SqlQuery deleteRemoteFolderEtagsQuery(_db); deleteRemoteFolderEtagsQuery.prepare("UPDATE metadata SET md5='_invalid_' WHERE type=2;"); - deleteRemoteFolderEtagsQuery.exec(); + + if (!deleteRemoteFolderEtagsQuery.exec()) { + sqlFail(QStringLiteral("forceRemoteDiscoveryNextSyncLocked"), deleteRemoteFolderEtagsQuery); + } } @@ -2163,6 +2223,101 @@ ConflictRecord SyncJournalDb::conflictRecord(const QByteArray &path) return entry; } +void SyncJournalDb::setCaseConflictRecord(const ConflictRecord &record) +{ + QMutexLocker locker(&_mutex); + if (!checkConnect()) + return; + + const auto query = _queryManager.get(PreparedSqlQueryManager::SetCaseClashConflictRecordQuery, QByteArrayLiteral("INSERT OR REPLACE INTO caseconflicts " + "(path, baseFileId, baseModtime, baseEtag, basePath) " + "VALUES (?1, ?2, ?3, ?4, ?5);"), + _db); + ASSERT(query) + 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()) +} + +ConflictRecord SyncJournalDb::caseConflictRecordByBasePath(const QString &baseNamePath) +{ + ConflictRecord entry; + + QMutexLocker locker(&_mutex); + if (!checkConnect()) { + return entry; + } + const auto query = _queryManager.get(PreparedSqlQueryManager::GetCaseClashConflictRecordQuery, QByteArrayLiteral("SELECT path, baseFileId, baseModtime, baseEtag, basePath FROM caseconflicts WHERE basePath=?1;"), _db); + ASSERT(query) + query->bindValue(1, baseNamePath); + ASSERT(query->exec()) + if (!query->next().hasData) + return entry; + + entry.path = query->baValue(0); + entry.baseFileId = query->baValue(1); + entry.baseModtime = query->int64Value(2); + entry.baseEtag = query->baValue(3); + entry.initialBasePath = query->baValue(4); + return entry; +} + +ConflictRecord SyncJournalDb::caseConflictRecordByPath(const QString &path) +{ + ConflictRecord entry; + + QMutexLocker locker(&_mutex); + if (!checkConnect()) { + return entry; + } + const auto query = _queryManager.get(PreparedSqlQueryManager::GetCaseClashConflictRecordByPathQuery, QByteArrayLiteral("SELECT path, baseFileId, baseModtime, baseEtag, basePath FROM caseconflicts WHERE path=?1;"), _db); + ASSERT(query) + query->bindValue(1, path); + ASSERT(query->exec()) + if (!query->next().hasData) + return entry; + + entry.path = query->baValue(0); + entry.baseFileId = query->baValue(1); + entry.baseModtime = query->int64Value(2); + entry.baseEtag = query->baValue(3); + entry.initialBasePath = query->baValue(4); + return entry; +} + +void SyncJournalDb::deleteCaseClashConflictByPathRecord(const QString &path) +{ + QMutexLocker locker(&_mutex); + if (!checkConnect()) + return; + + const auto query = _queryManager.get(PreparedSqlQueryManager::DeleteCaseClashConflictRecordQuery, QByteArrayLiteral("DELETE FROM caseconflicts WHERE path=?1;"), _db); + ASSERT(query) + query->bindValue(1, path); + ASSERT(query->exec()) +} + +QByteArrayList SyncJournalDb::caseClashConflictRecordPaths() +{ + QMutexLocker locker(&_mutex); + if (!checkConnect()) { + return {}; + } + + const auto query = _queryManager.get(PreparedSqlQueryManager::GetAllCaseClashConflictPathQuery, QByteArrayLiteral("SELECT path FROM caseconflicts;"), _db); + ASSERT(query) + ASSERT(query->exec()) + + QByteArrayList paths; + while (query->next().hasData) + paths.append(query->baValue(0)); + + return paths; +} + void SyncJournalDb::deleteConflictRecord(const QByteArray &path) { QMutexLocker locker(&_mutex); @@ -2197,10 +2352,12 @@ QByteArray SyncJournalDb::conflictFileBaseName(const QByteArray &conflictName) auto conflict = conflictRecord(conflictName); QByteArray result; if (conflict.isValid()) { - getFileRecordsByFileId(conflict.baseFileId, [&result](const SyncJournalFileRecord &record) { + if (!getFileRecordsByFileId(conflict.baseFileId, [&result](const SyncJournalFileRecord &record) { if (!record._path.isEmpty()) result = record._path; - }); + })) { + qCWarning(lcDb) << "conflictFileBaseName failed to getFileRecordsByFileId: " << conflictName; + } } if (result.isEmpty()) { @@ -2214,7 +2371,10 @@ void SyncJournalDb::clearFileTable() QMutexLocker lock(&_mutex); SqlQuery query(_db); query.prepare("DELETE FROM metadata;"); - query.exec(); + + if (!query.exec()) { + sqlFail(QStringLiteral("clearFileTable"), query); + } } void SyncJournalDb::markVirtualFileForDownloadRecursively(const QByteArray &path) @@ -2228,7 +2388,10 @@ void SyncJournalDb::markVirtualFileForDownloadRecursively(const QByteArray &path "(" IS_PREFIX_PATH_OF("?1", "path") " OR ?1 == '') " "AND type=4;", _db); query.bindValue(1, path); - query.exec(); + + if (!query.exec()) { + sqlFail(QStringLiteral("markVirtualFileForDownloadRecursively UPDATE metadata SET type=5 path: %1").arg(QString::fromUtf8(path)), query); + } // We also must make sure we do not read the files from the database (same logic as in schedulePathForRemoteDiscovery) // This includes all the parents up to the root, but also all the directory within the selected dir. @@ -2236,7 +2399,83 @@ void SyncJournalDb::markVirtualFileForDownloadRecursively(const QByteArray &path query.prepare("UPDATE metadata SET md5='_invalid_' WHERE " "(" IS_PREFIX_PATH_OF("?1", "path") " OR ?1 == '' OR " IS_PREFIX_PATH_OR_EQUAL("path", "?1") ") AND type == 2;"); query.bindValue(1, path); - query.exec(); + + if (!query.exec()) { + sqlFail(QStringLiteral("markVirtualFileForDownloadRecursively UPDATE metadata SET md5='_invalid_' path: %1").arg(QString::fromUtf8(path)), query); + } +} + +void SyncJournalDb::setE2EeLockedFolder(const QByteArray &folderId, const QByteArray &folderToken) +{ + QMutexLocker locker(&_mutex); + if (!checkConnect()) { + return; + } + + const auto query = _queryManager.get(PreparedSqlQueryManager::SetE2EeLockedFolderQuery, + QByteArrayLiteral("INSERT OR REPLACE INTO e2EeLockedFolders " + "(folderId, token) " + "VALUES (?1, ?2);"), + _db); + ASSERT(query) + query->bindValue(1, folderId); + query->bindValue(2, folderToken); + ASSERT(query->exec()) +} + +QByteArray SyncJournalDb::e2EeLockedFolder(const QByteArray &folderId) +{ + QMutexLocker locker(&_mutex); + if (!checkConnect()) { + return {}; + } + const auto query = _queryManager.get(PreparedSqlQueryManager::GetE2EeLockedFolderQuery, + QByteArrayLiteral("SELECT token FROM e2EeLockedFolders WHERE folderId=?1;"), + _db); + ASSERT(query) + query->bindValue(1, folderId); + ASSERT(query->exec()) + if (!query->next().hasData) { + return {}; + } + + return query->baValue(0); +} + +QList> SyncJournalDb::e2EeLockedFolders() +{ + QMutexLocker locker(&_mutex); + + QList> res; + + if (!checkConnect()) { + return res; + } + + const auto query = _queryManager.get(PreparedSqlQueryManager::GetE2EeLockedFoldersQuery, QByteArrayLiteral("SELECT * FROM e2EeLockedFolders"), _db); + ASSERT(query) + + if (!query->exec()) { + return res; + } + + while (query->next().hasData) { + res.append({query->baValue(0), query->baValue(1)}); + } + return res; +} + +void SyncJournalDb::deleteE2EeLockedFolder(const QByteArray &folderId) +{ + QMutexLocker locker(&_mutex); + if (!checkConnect()) { + return; + } + + const auto query = _queryManager.get(PreparedSqlQueryManager::DeleteE2EeLockedFolderQuery, QByteArrayLiteral("DELETE FROM e2EeLockedFolders WHERE folderId=?1;"), _db); + ASSERT(query) + query->bindValue(1, folderId); + ASSERT(query->exec()) } Optional SyncJournalDb::PinStateInterface::rawForPath(const QByteArray &path) @@ -2366,7 +2605,12 @@ SyncJournalDb::PinStateInterface::rawList() return {}; SqlQuery query("SELECT path, pinState FROM flags;", _db->_db); - query.exec(); + + if (!query.exec()) { + qCWarning(lcDb) << "SQL Error" << "PinStateInterface::rawList" << query.error(); + _db->close(); + ASSERT(false); + } QVector> result; forever { diff --git a/src/common/syncjournaldb.h b/src/common/syncjournaldb.h index d51919f49..4a0d3f54d 100644 --- a/src/common/syncjournaldb.h +++ b/src/common/syncjournaldb.h @@ -59,25 +59,26 @@ public: static bool maybeMigrateDb(const QString &localPath, const QString &absoluteJournalPath); // To verify that the record could be found check with SyncJournalFileRecord::isValid() - bool getFileRecord(const QString &filename, SyncJournalFileRecord *rec) { return getFileRecord(filename.toUtf8(), rec); } - bool getFileRecord(const QByteArray &filename, SyncJournalFileRecord *rec); - bool getFileRecordByE2eMangledName(const QString &mangledName, SyncJournalFileRecord *rec); - bool getFileRecordByInode(quint64 inode, SyncJournalFileRecord *rec); - bool getFileRecordsByFileId(const QByteArray &fileId, const std::function &rowCallback); - bool getFilesBelowPath(const QByteArray &path, const std::function &rowCallback); - bool listFilesInPath(const QByteArray &path, const std::function &rowCallback); - Result setFileRecord(const SyncJournalFileRecord &record); + [[nodiscard]] bool getFileRecord(const QString &filename, SyncJournalFileRecord *rec) { return getFileRecord(filename.toUtf8(), rec); } + [[nodiscard]] bool getFileRecord(const QByteArray &filename, SyncJournalFileRecord *rec); + [[nodiscard]] bool getFileRecordByE2eMangledName(const QString &mangledName, SyncJournalFileRecord *rec); + [[nodiscard]] bool getFileRecordByInode(quint64 inode, SyncJournalFileRecord *rec); + [[nodiscard]] bool getFileRecordsByFileId(const QByteArray &fileId, const std::function &rowCallback); + [[nodiscard]] bool getFilesBelowPath(const QByteArray &path, const std::function &rowCallback); + [[nodiscard]] bool listFilesInPath(const QByteArray &path, const std::function &rowCallback); + [[nodiscard]] Result setFileRecord(const SyncJournalFileRecord &record); void keyValueStoreSet(const QString &key, QVariant value); - qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue); + [[nodiscard]] qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue); void keyValueStoreDelete(const QString &key); - bool deleteFileRecord(const QString &filename, bool recursively = false); - bool updateFileRecordChecksum(const QString &filename, + [[nodiscard]] bool deleteFileRecord(const QString &filename, bool recursively = false); + [[nodiscard]] bool updateFileRecordChecksum( + const QString &filename, const QByteArray &contentChecksum, const QByteArray &contentChecksumType); - bool updateLocalMetadata(const QString &filename, - qint64 modtime, qint64 size, quint64 inode); + [[nodiscard]] bool updateLocalMetadata(const QString &filename, + qint64 modtime, qint64 size, quint64 inode, const SyncJournalFileLockInfo &lockInfo); /// Return value for hasHydratedOrDehydratedFiles() struct HasHydratedDehydrated @@ -92,14 +93,14 @@ public: bool exists(); void walCheckpoint(); - QString databaseFilePath() const; + [[nodiscard]] QString databaseFilePath() const; static qint64 getPHash(const QByteArray &); void setErrorBlacklistEntry(const SyncJournalErrorBlacklistRecord &item); void wipeErrorBlacklistEntry(const QString &file); void wipeErrorBlacklistCategory(SyncJournalErrorBlacklistRecord::Category category); - int wipeErrorBlacklist(); + [[nodiscard]] int wipeErrorBlacklist(); int errorBlackListEntryCount(); struct DownloadInfo @@ -123,7 +124,7 @@ public: * (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; } + [[nodiscard]] bool isChunked() const { return _transferid != 0; } }; struct PollInfo @@ -145,7 +146,7 @@ public: QVector deleteStaleUploadInfos(const QSet &keep); SyncJournalErrorBlacklistRecord errorBlacklistEntry(const QString &); - bool deleteStaleErrorBlacklistEntries(const QSet &keep); + [[nodiscard]] bool deleteStaleErrorBlacklistEntries(const QSet &keep); /// Delete flags table entries that have no metadata correspondent void deleteStaleFlagsEntries(); @@ -167,7 +168,9 @@ public: SelectiveSyncWhiteList = 2, /** List of big sync folders that have not been confirmed by the user yet and that the UI * should notify about */ - SelectiveSyncUndecidedList = 3 + SelectiveSyncUndecidedList = 3, + /** List of encrypted folders that will need to be removed from the blacklist when E2EE gets set up*/ + SelectiveSyncE2eFoldersToRemoveFromBlacklist = 4, }; /* return the specified list from the database */ QStringList getSelectiveSyncList(SelectiveSyncListType type, bool *ok); @@ -246,6 +249,15 @@ public: /// Retrieve a conflict record by path of the file with the conflict tag ConflictRecord conflictRecord(const QByteArray &path); + /// Retrieve a conflict record by path of the file with the conflict tag + ConflictRecord caseConflictRecordByBasePath(const QString &baseNamePath); + + /// Retrieve a conflict record by path of the file with the conflict tag + ConflictRecord caseConflictRecordByPath(const QString &path); + + /// Return all paths of files with a conflict tag in the name and records in the db + QByteArrayList caseClashConflictRecordPaths(); + /// Delete a conflict record by path of the file with the conflict tag void deleteConflictRecord(const QByteArray &path); @@ -275,6 +287,11 @@ public: */ void markVirtualFileForDownloadRecursively(const QByteArray &path); + void setE2EeLockedFolder(const QByteArray &folderId, const QByteArray &folderToken); + QByteArray e2EeLockedFolder(const QByteArray &folderId); + QList> e2EeLockedFolders(); + void deleteE2EeLockedFolder(const QByteArray &folderId); + /** Grouping for all functions relating to pin states, * * Use internalPinStates() to get at them. @@ -370,11 +387,18 @@ public: */ int autotestFailCounter = -1; +public slots: + /// Store a new or updated record in the database + void setCaseConflictRecord(const ConflictRecord &record); + + /// Delete a case clash conflict record by path of the file with the conflict tag + void deleteCaseClashConflictByPathRecord(const QString &path); + private: int getFileRecordCount(); - bool updateDatabaseStructure(); - bool updateMetadataTableStructure(); - bool updateErrorBlacklistTableStructure(); + [[nodiscard]] bool updateDatabaseStructure(); + [[nodiscard]] bool updateMetadataTableStructure(); + [[nodiscard]] bool updateErrorBlacklistTableStructure(); bool sqlFail(const QString &log, const SqlQuery &query); void commitInternal(const QString &context, bool startTrans = true); void startTransaction(); @@ -388,7 +412,7 @@ private: // Returns the integer id of the checksum type // // Returns 0 on failure and for empty checksum types. - int mapChecksumType(const QByteArray &checksumType); + [[nodiscard]] int mapChecksumType(const QByteArray &checksumType); SqlDatabase _db; QString _dbFile; diff --git a/src/common/syncjournalfilerecord.h b/src/common/syncjournalfilerecord.h index 9f3e0b518..a846aeeb1 100644 --- a/src/common/syncjournalfilerecord.h +++ b/src/common/syncjournalfilerecord.h @@ -48,7 +48,7 @@ struct SyncJournalFileLockInfo { class OCSYNC_EXPORT SyncJournalFileRecord { public: - bool isValid() const + [[nodiscard]] bool isValid() const { return !_path.isEmpty(); } @@ -59,14 +59,14 @@ public: * * It is used in the construction of private links. */ - QByteArray numericFileId() const; - QDateTime modDateTime() const { return Utility::qDateTimeFromTime_t(_modtime); } + [[nodiscard]] QByteArray numericFileId() const; + [[nodiscard]] QDateTime modDateTime() const { return Utility::qDateTimeFromTime_t(_modtime); } - bool isDirectory() const { return _type == ItemTypeDirectory; } - bool isFile() const { return _type == ItemTypeFile || _type == ItemTypeVirtualFileDehydration; } - bool isVirtualFile() const { return _type == ItemTypeVirtualFile || _type == ItemTypeVirtualFileDownload; } - QString path() const { return QString::fromUtf8(_path); } - QString e2eMangledName() const { return QString::fromUtf8(_e2eMangledName); } + [[nodiscard]] bool isDirectory() const { return _type == ItemTypeDirectory; } + [[nodiscard]] bool isFile() const { return _type == ItemTypeFile || _type == ItemTypeVirtualFileDehydration; } + [[nodiscard]] bool isVirtualFile() const { return _type == ItemTypeVirtualFile || _type == ItemTypeVirtualFileDownload; } + [[nodiscard]] QString path() const { return QString::fromUtf8(_path); } + [[nodiscard]] QString e2eMangledName() const { return QString::fromUtf8(_e2eMangledName); } QByteArray _path; quint64 _inode = 0; @@ -81,6 +81,9 @@ public: QByteArray _e2eMangledName; bool _isE2eEncrypted = false; SyncJournalFileLockInfo _lockstate; + bool _isShared = false; + qint64 _lastShareStateFetchedTimestamp = 0; + bool _sharedByMe = false; }; bool OCSYNC_EXPORT @@ -120,7 +123,7 @@ public: /// The last X-Request-ID of the request that failled QByteArray _requestId; - bool isValid() const; + [[nodiscard]] bool isValid() const; }; /** Represents a conflict in the conflicts table. @@ -165,7 +168,7 @@ public: QByteArray initialBasePath; - bool isValid() const { return !path.isEmpty(); } + [[nodiscard]] bool isValid() const { return !path.isEmpty(); } }; } diff --git a/src/common/utility.cpp b/src/common/utility.cpp index 3adb9a4de..6613f0986 100644 --- a/src/common/utility.cpp +++ b/src/common/utility.cpp @@ -321,7 +321,7 @@ namespace { const char *name; quint64 msec; - QString description(quint64 value) const + [[nodiscard]] QString description(quint64 value) const { return QCoreApplication::translate("Utility", name, nullptr, value); } @@ -624,35 +624,21 @@ QString Utility::makeConflictFileName( return conflictFileName; } -bool Utility::isConflictFile(const char *name) -{ - const char *bname = std::strrchr(name, '/'); - if (bname) { - bname += 1; - } else { - bname = name; - } - - // 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(QLatin1Char('/')) + 1); - if (bname.contains(QStringLiteral("_conflict-"))) + if (bname.contains(QStringLiteral("_conflict-"))) { + return true; + } + + if (bname.contains(QStringLiteral("(conflicted copy"))) { return true; + } - if (bname.contains(QStringLiteral("(conflicted copy"))) + if (isCaseClashConflictFile(name)) { return true; + } return false; } @@ -722,4 +708,28 @@ QString Utility::sanitizeForFileName(const QString &name) return result; } +QString Utility::makeCaseClashConflictFileName(const QString &filename, const QDateTime &datetime) +{ + auto conflictFileName(filename); + // Add conflict tag before the extension. + auto dotLocation = conflictFileName.lastIndexOf(QLatin1Char('.')); + // If no extension, add it at the end (take care of cases like foo/.hidden or foo.bar/file) + if (dotLocation <= conflictFileName.lastIndexOf(QLatin1Char('/')) + 1) { + dotLocation = conflictFileName.size(); + } + + auto conflictMarker = QStringLiteral(" (case clash from "); + conflictMarker += datetime.toString(QStringLiteral("yyyy-MM-dd hhmmss")) + QLatin1Char(')'); + + conflictFileName.insert(dotLocation, conflictMarker); + return conflictFileName; +} + +bool Utility::isCaseClashConflictFile(const QString &name) +{ + const auto bname = name.midRef(name.lastIndexOf(QLatin1Char('/')) + 1); + + return bname.contains(QStringLiteral("(case clash from")); +} + } // namespace OCC diff --git a/src/common/utility.h b/src/common/utility.h index 6179be9d5..5853f480d 100644 --- a/src/common/utility.h +++ b/src/common/utility.h @@ -185,9 +185,9 @@ namespace Utility { void reset(); // out helpers, return the measured times. - QDateTime startTime() const; - QDateTime timeOfLap(const QString &lapName) const; - quint64 durationOfLap(const QString &lapName) const; + [[nodiscard]] QDateTime startTime() const; + [[nodiscard]] QDateTime timeOfLap(const QString &lapName) const; + [[nodiscard]] quint64 durationOfLap(const QString &lapName) const; }; /** @@ -223,10 +223,13 @@ namespace Utility { OCSYNC_EXPORT QString makeConflictFileName( const QString &fn, const QDateTime &dt, const QString &user); + OCSYNC_EXPORT QString makeCaseClashConflictFileName(const QString &filename, const QDateTime &datetime); + /** Returns whether a file name indicates a conflict file */ - OCSYNC_EXPORT bool isConflictFile(const char *name); + bool isConflictFile(const char *name) = delete; OCSYNC_EXPORT bool isConflictFile(const QString &name); + OCSYNC_EXPORT bool isCaseClashConflictFile(const QString &name); /** Find the base name for a conflict file name, using name pattern only * diff --git a/src/common/vfs.cpp b/src/common/vfs.cpp index 593c4c3bc..e887937f0 100644 --- a/src/common/vfs.cpp +++ b/src/common/vfs.cpp @@ -238,7 +238,7 @@ std::unique_ptr OCC::createVfsFromPlugin(Vfs::Mode mode) const auto pluginPath = pluginFileName(QStringLiteral("vfs"), name); if (!isVfsPluginAvailable(mode)) { - qCCritical(lcPlugin) << "Could not load plugin: not existant or bad metadata" << pluginPath; + qCCritical(lcPlugin) << "Could not load plugin: not existent or bad metadata" << pluginPath; return nullptr; } diff --git a/src/common/vfs.h b/src/common/vfs.h index 572c297a4..39bf0c03a 100644 --- a/src/common/vfs.h +++ b/src/common/vfs.h @@ -131,13 +131,13 @@ public: explicit Vfs(QObject* parent = nullptr); ~Vfs() override; - virtual Mode mode() const = 0; + [[nodiscard]] virtual Mode mode() const = 0; /// For WithSuffix modes: the suffix (including the dot) - virtual QString fileSuffix() const = 0; + [[nodiscard]] virtual QString fileSuffix() const = 0; /// Access to the parameters the instance was start()ed with. - const VfsSetupParams ¶ms() const { return _setupParams; } + [[nodiscard]] const VfsSetupParams ¶ms() const { return _setupParams; } /** Initializes interaction with the VFS provider. @@ -158,13 +158,13 @@ public: * Some plugins might provide alternate shell integration, making the normal * context menu actions redundant. */ - virtual bool socketApiPinStateActionsShown() const = 0; + [[nodiscard]] virtual bool socketApiPinStateActionsShown() const = 0; /** Return true when download of a file's data is currently ongoing. * * See also the beginHydrating() and doneHydrating() signals. */ - virtual bool isHydrating() const = 0; + [[nodiscard]] virtual bool isHydrating() const = 0; /** Update placeholder metadata during discovery. * @@ -258,7 +258,7 @@ public slots: * via the vfs plugin. The connection to SyncFileStatusTracker allows both to be based * on the same data. */ - virtual void fileStatusChanged(const QString &systemFileName, SyncFileStatus fileStatus) = 0; + virtual void fileStatusChanged(const QString &systemFileName, OCC::SyncFileStatus fileStatus) = 0; signals: /// Emitted when a user-initiated hydration starts @@ -296,15 +296,15 @@ public: VfsOff(QObject* parent = nullptr); ~VfsOff() override; - Mode mode() const override { return Vfs::Off; } + [[nodiscard]] Mode mode() const override { return Vfs::Off; } - QString fileSuffix() const override { return QString(); } + [[nodiscard]] QString fileSuffix() const override { return QString(); } void stop() override {} void unregisterFolder() override {} - bool socketApiPinStateActionsShown() const override { return false; } - bool isHydrating() const override { return false; } + [[nodiscard]] bool socketApiPinStateActionsShown() const override { return false; } + [[nodiscard]] bool isHydrating() const override { return false; } Result updateMetadata(const QString &, time_t, qint64, const QByteArray &) override { return {}; } Result createPlaceholder(const SyncFileItem &) override { return {}; } @@ -320,7 +320,7 @@ public: AvailabilityResult availability(const QString &) override { return VfsItemAvailability::AlwaysLocal; } public slots: - void fileStatusChanged(const QString &, SyncFileStatus) override {} + void fileStatusChanged(const QString &, OCC::SyncFileStatus) override {} protected: void startImpl(const VfsSetupParams &) override {} diff --git a/src/csync/csync.h b/src/csync/csync.h index 0c418f9ad..9c4b2580c 100644 --- a/src/csync/csync.h +++ b/src/csync/csync.h @@ -104,22 +104,23 @@ Q_ENUM_NS(csync_status_codes_e) * the csync state of a file. */ enum SyncInstructions { - CSYNC_INSTRUCTION_NONE = 0, /* Nothing to do (UPDATE|RECONCILE) */ - CSYNC_INSTRUCTION_EVAL = 1 << 0, /* There was changed compared to the DB (UPDATE) */ - CSYNC_INSTRUCTION_REMOVE = 1 << 1, /* The file need to be removed (RECONCILE) */ - CSYNC_INSTRUCTION_RENAME = 1 << 2, /* The file need to be renamed (RECONCILE) */ - CSYNC_INSTRUCTION_EVAL_RENAME = 1 << 11, /* The file is new, it is the destination of a rename (UPDATE) */ - CSYNC_INSTRUCTION_NEW = 1 << 3, /* The file is new compared to the db (UPDATE) */ - CSYNC_INSTRUCTION_CONFLICT = 1 << 4, /* The file need to be downloaded because it is a conflict (RECONCILE) */ - CSYNC_INSTRUCTION_IGNORE = 1 << 5, /* The file is ignored (UPDATE|RECONCILE) */ - CSYNC_INSTRUCTION_SYNC = 1 << 6, /* The file need to be pushed to the other remote (RECONCILE) */ - CSYNC_INSTRUCTION_STAT_ERROR = 1 << 7, - CSYNC_INSTRUCTION_ERROR = 1 << 8, - CSYNC_INSTRUCTION_TYPE_CHANGE = 1 << 9, /* Like NEW, but deletes the old entity first (RECONCILE) - Used when the type of something changes from directory to file - or back. */ - CSYNC_INSTRUCTION_UPDATE_METADATA = 1 << 10, /* If the etag has been updated and need to be writen to the db, - but without any propagation (UPDATE|RECONCILE) */ + CSYNC_INSTRUCTION_NONE = 0, /* Nothing to do (UPDATE|RECONCILE) */ + CSYNC_INSTRUCTION_EVAL = 1 << 0, /* There was changed compared to the DB (UPDATE) */ + CSYNC_INSTRUCTION_REMOVE = 1 << 1, /* The file need to be removed (RECONCILE) */ + CSYNC_INSTRUCTION_RENAME = 1 << 2, /* The file need to be renamed (RECONCILE) */ + CSYNC_INSTRUCTION_EVAL_RENAME = 1 << 11, /* The file is new, it is the destination of a rename (UPDATE) */ + CSYNC_INSTRUCTION_NEW = 1 << 3, /* The file is new compared to the db (UPDATE) */ + CSYNC_INSTRUCTION_CONFLICT = 1 << 4, /* The file need to be downloaded because it is a conflict (RECONCILE) */ + CSYNC_INSTRUCTION_IGNORE = 1 << 5, /* The file is ignored (UPDATE|RECONCILE) */ + CSYNC_INSTRUCTION_SYNC = 1 << 6, /* The file need to be pushed to the other remote (RECONCILE) */ + CSYNC_INSTRUCTION_STAT_ERROR = 1 << 7, + CSYNC_INSTRUCTION_ERROR = 1 << 8, + CSYNC_INSTRUCTION_TYPE_CHANGE = 1 << 9, /* Like NEW, but deletes the old entity first (RECONCILE) + Used when the type of something changes from directory to file + or back. */ + CSYNC_INSTRUCTION_UPDATE_METADATA = 1 << 10, /* If the etag has been updated and need to be writen to the db, + but without any propagation (UPDATE|RECONCILE) */ + CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT = 1 << 12, /* The file need to be downloaded because it is a case clash conflict (RECONCILE) */ }; Q_ENUM_NS(SyncInstructions) @@ -165,7 +166,7 @@ Q_ENUM_NS(ItemType) using namespace CSyncEnums; using CSYNC_STATUS = CSyncEnums::csync_status_codes_e; -typedef struct csync_file_stat_s csync_file_stat_t; +using csync_file_stat_t = struct csync_file_stat_s; struct OCSYNC_EXPORT csync_file_stat_s { time_t modtime = 0; diff --git a/src/csync/csync_exclude.cpp b/src/csync/csync_exclude.cpp index 4e9c9660d..bddb3047e 100644 --- a/src/csync/csync_exclude.cpp +++ b/src/csync/csync_exclude.cpp @@ -151,6 +151,9 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const QString &path, bool exclu if (bname.startsWith(QLatin1String(".owncloudsync.log"), Qt::CaseInsensitive)) { // ".owncloudsync.log*" return CSYNC_FILE_SILENTLY_EXCLUDED; } + if (bname.startsWith(QLatin1String(".nextcloudsync.log"), Qt::CaseInsensitive)) { // ".nextcloudsync.log*" + return CSYNC_FILE_SILENTLY_EXCLUDED; + } } // check the strlen and ignore the file if its name is longer than 254 chars. @@ -202,10 +205,14 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const QString &path, bool exclu return CSYNC_FILE_SILENTLY_EXCLUDED; } - - if (excludeConflictFiles && OCC::Utility::isConflictFile(path)) { - return CSYNC_FILE_EXCLUDE_CONFLICT; + if (excludeConflictFiles) { + if (OCC::Utility::isCaseClashConflictFile(path)) { + return CSYNC_FILE_EXCLUDE_CASE_CLASH_CONFLICT; + } else if (OCC::Utility::isConflictFile(path)) { + return CSYNC_FILE_EXCLUDE_CONFLICT; + } } + return CSYNC_NOT_EXCLUDED; } diff --git a/src/csync/csync_exclude.h b/src/csync/csync_exclude.h index 558dea30b..34c9f4b23 100644 --- a/src/csync/csync_exclude.h +++ b/src/csync/csync_exclude.h @@ -43,6 +43,7 @@ enum CSYNC_EXCLUDE_TYPE { CSYNC_FILE_EXCLUDE_HIDDEN, CSYNC_FILE_EXCLUDE_STAT_FAILED, CSYNC_FILE_EXCLUDE_CONFLICT, + CSYNC_FILE_EXCLUDE_CASE_CLASH_CONFLICT, CSYNC_FILE_EXCLUDE_CANNOT_ENCODE, CSYNC_FILE_EXCLUDE_SERVER_BLACKLISTED, CSYNC_FILE_EXCLUDE_LEADING_SPACE, @@ -94,7 +95,7 @@ public: * @param filePath the absolute path to the file * @param basePath folder path from which to apply exclude rules, ends with a / */ - bool isExcluded( + [[nodiscard]] bool isExcluded( const QString &filePath, const QString &basePath, bool excludeHidden) const; @@ -168,7 +169,7 @@ private: * * Would enable the "myexclude" pattern only for versions before 2.5.0. */ - bool versionDirectiveKeepNextLine(const QByteArray &directive) const; + [[nodiscard]] bool versionDirectiveKeepNextLine(const QByteArray &directive) const; /** * @brief Match the exclude pattern against the full path. @@ -178,7 +179,7 @@ private: * Note that this only matches patterns. It does not check whether the file * or directory pointed to is hidden (or whether it even exists). */ - CSYNC_EXCLUDE_TYPE fullPatternMatch(const QString &path, ItemType filetype) const; + [[nodiscard]] CSYNC_EXCLUDE_TYPE fullPatternMatch(const QString &path, ItemType filetype) const; // Our BasePath need to end with '/' class BasePathString : public QString diff --git a/src/csync/std/c_private.h b/src/csync/std/c_private.h index aaa41417f..8307859ac 100644 --- a/src/csync/std/c_private.h +++ b/src/csync/std/c_private.h @@ -67,7 +67,7 @@ #define getuid() 0 #define geteuid() 0 #elif defined(_WIN32) -#define mode_t int +typedef int mode_t; #else #include #endif diff --git a/src/gui/BasicComboBox.qml b/src/gui/BasicComboBox.qml index b844ad1f7..1c184c9e9 100644 --- a/src/gui/BasicComboBox.qml +++ b/src/gui/BasicComboBox.qml @@ -13,7 +13,6 @@ */ import QtQuick 2.15 -import QtQuick.Dialogs 1.3 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 import QtGraphicalEffects 1.0 @@ -24,7 +23,10 @@ import "./tray" ComboBox { id: clearComboBox - padding: Style.standardSpacing + topPadding: Style.smallSpacing + topInset + leftPadding: Style.smallSpacing + leftInset + rightPadding: Style.smallSpacing + rightInset + bottomPadding: Style.smallSpacing + bottomInset background: Rectangle { radius: Style.slightlyRoundedButtonRadius @@ -33,7 +35,7 @@ ComboBox { } contentItem: EnforcedPlainTextLabel { - leftPadding: 0 + leftPadding: clearComboBox.leftPadding rightPadding: clearComboBox.indicator.width + clearComboBox.spacing text: clearComboBox.displayText @@ -43,8 +45,10 @@ ComboBox { } indicator: ColorOverlay { - x: clearComboBox.width - clearComboBox.rightPadding - y: clearComboBox.topPadding + (clearComboBox.availableHeight - height) / 2 + anchors.right: clearComboBox.right + anchors.rightMargin: clearComboBox.rightPadding + anchors.verticalCenter: clearComboBox.verticalCenter + cached: true color: Style.ncTextColor width: source.width diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index b9a177807..7639f95ab 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -1,5 +1,6 @@ project(gui) find_package(Qt5 REQUIRED COMPONENTS Widgets Svg Qml Quick QuickControls2 Xml Network) +find_package(KF5Archive REQUIRED) if(QUICK_COMPILER) find_package(Qt5QuickCompiler) @@ -27,8 +28,8 @@ set(theme_dir ${CMAKE_SOURCE_DIR}/theme) set(client_UI_SRCS accountsettings.ui conflictdialog.ui - internallinkwidget.ui invalidfilenamedialog.ui + caseclashfilenamedialog.ui foldercreationdialog.ui folderwizardsourcepage.ui folderwizardtargetpage.ui @@ -38,9 +39,6 @@ set(client_UI_SRCS ignorelisttablewidget.ui networksettings.ui settingsdialog.ui - sharedialog.ui - sharelinkwidget.ui - shareusergroupwidget.ui shareuserline.ui sslerrordialog.ui addcertificatedialog.ui @@ -68,10 +66,16 @@ set(client_SRCS accountmanager.cpp accountsettings.h accountsettings.cpp + accountsetupfromcommandlinejob.h + accountsetupfromcommandlinejob.cpp + accountsetupcommandlinemanager.h + accountsetupcommandlinemanager.cpp application.h application.cpp invalidfilenamedialog.h invalidfilenamedialog.cpp + caseclashfilenamedialog.h + caseclashfilenamedialog.cpp callstatechecker.h callstatechecker.cpp conflictdialog.h @@ -104,8 +108,6 @@ set(client_SRCS generalsettings.cpp legalnotice.h legalnotice.cpp - internallinkwidget.h - internallinkwidget.cpp ignorelisteditor.h ignorelisteditor.cpp ignorelisttablewidget.h @@ -138,14 +140,8 @@ set(client_SRCS selectivesyncdialog.cpp settingsdialog.h settingsdialog.cpp - sharedialog.h - sharedialog.cpp - sharelinkwidget.h - sharelinkwidget.cpp sharemanager.h sharemanager.cpp - shareusergroupwidget.h - shareusergroupwidget.cpp profilepagewidget.h profilepagewidget.cpp sharee.h @@ -180,8 +176,6 @@ set(client_SRCS guiutility.cpp elidedlabel.h elidedlabel.cpp - headerbanner.h - headerbanner.cpp iconutils.h iconutils.cpp remotewipe.h @@ -192,6 +186,14 @@ set(client_SRCS emojimodel.cpp fileactivitylistmodel.h fileactivitylistmodel.cpp + filedetails/filedetails.h + filedetails/filedetails.cpp + filedetails/sharemodel.h + filedetails/sharemodel.cpp + filedetails/shareemodel.h + filedetails/shareemodel.cpp + filedetails/sortedsharemodel.h + filedetails/sortedsharemodel.cpp tray/svgimageprovider.h tray/svgimageprovider.cpp tray/syncstatussummary.h @@ -210,6 +212,8 @@ set(client_SRCS tray/usermodel.cpp tray/notificationhandler.h tray/notificationhandler.cpp + tray/sortedactivitylistmodel.h + tray/sortedactivitylistmodel.cpp creds/credentialsfactory.h tray/talkreply.cpp creds/credentialsfactory.cpp @@ -318,10 +322,15 @@ set(3rdparty_SRC ../3rdparty/kirigami/wheelhandler.cpp ) +set_property(SOURCE ../3rdparty/kmessagewidget/kmessagewidget.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) +set_property(SOURCE ../3rdparty/kirigami/wheelhandler.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) + if(NOT WIN32) list(APPEND 3rdparty_SRC ../3rdparty/qtlockedfile/qtlockedfile_unix.cpp) + set_property(SOURCE ../3rdparty/qtlockedfile/qtlockedfile_unix.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) else() list(APPEND 3rdparty_SRC ../3rdparty/qtlockedfile/qtlockedfile_win.cpp ) + set_property(SOURCE ../3rdparty/qtlockedfile/qtlockedfile_win.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) endif() find_package(Qt5LinguistTools) @@ -354,11 +363,7 @@ if(Qt5Keychain_FOUND) endif() # add executable icon on windows and osx - -# UPSTREAM our ECMAddAppIcon.cmake then require that version here -# find_package(ECM 1.7.0 REQUIRED NO_MODULE) -# list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) -include(ECMAddAppIcon) +include(GenerateIconsUtils) # For historical reasons we can not use the application_shortname # for ownCloud but must rather set it manually. @@ -370,61 +375,6 @@ if(NOT DEFINED APPLICATION_FOLDER_ICON_INDEX) set(APPLICATION_FOLDER_ICON_INDEX 0) endif() -# Generate png icons from svg -find_program(SVG_CONVERTER - NAMES inkscape inkscape.exe rsvg-convert - REQUIRED - HINTS "C:\\Program Files\\Inkscape\\bin" "/usr/bin" ENV SVG_CONVERTER_DIR) -# REQUIRED keyword is only supported on CMake 3.18 and above -if (NOT SVG_CONVERTER) - message(FATAL_ERROR "Could not find a suitable svg converter. Set SVG_CONVERTER_DIR to the path of either the inkscape or rsvg-convert executable.") -endif() - -function(generate_sized_png_from_svg icon_path size) - set(options) - set(oneValueArgs OUTPUT_ICON_NAME OUTPUT_ICON_FULL_NAME_WLE OUTPUT_ICON_PATH) - set(multiValueArgs) - - cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - get_filename_component(icon_name_dir ${icon_path} DIRECTORY) - get_filename_component(icon_name_wle ${icon_path} NAME_WLE) - - if (ARG_OUTPUT_ICON_NAME) - set(icon_name_wle ${ARG_OUTPUT_ICON_NAME}) - endif () - - if (ARG_OUTPUT_ICON_PATH) - set(icon_name_dir ${ARG_OUTPUT_ICON_PATH}) - endif () - - set(output_icon_full_name_wle "${size}-${icon_name_wle}") - - if (ARG_OUTPUT_ICON_FULL_NAME_WLE) - set(output_icon_full_name_wle ${ARG_OUTPUT_ICON_FULL_NAME_WLE}) - endif () - - if (EXISTS "${icon_name_dir}/${output_icon_full_name_wle}.png") - return() - endif() - - set(icon_output_name "${output_icon_full_name_wle}.png") - message(STATUS "Generate ${icon_output_name}") - execute_process(COMMAND - "${SVG_CONVERTER}" -w ${size} -h ${size} "${icon_path}" -o "${icon_output_name}" - WORKING_DIRECTORY "${icon_name_dir}" - RESULT_VARIABLE - SVG_CONVERTER_SIDEBAR_ERROR - OUTPUT_QUIET - ERROR_QUIET) - - if (SVG_CONVERTER_SIDEBAR_ERROR) - message(FATAL_ERROR - "${SVG_CONVERTER} could not generate icon: ${SVG_CONVERTER_SIDEBAR_ERROR}") - else() - endif() -endfunction() - set(STATE_ICONS_COLORS colored black white) foreach(state_icons_color ${STATE_ICONS_COLORS}) @@ -570,10 +520,21 @@ target_link_libraries(nextcloudCore Qt5::Qml Qt5::Quick Qt5::QuickControls2 + KF5::Archive ) add_subdirectory(socketapi) +# skip unity inclusion for files which cause problems with a CMake unity build +set_property(SOURCE + ${CMAKE_CURRENT_SOURCE_DIR}/socketapi/socketapi.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/socketapi/socketuploadjob.cpp + PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) + +foreach(FILE IN LISTS client_UI_SRCS) + set_property(SOURCE ${FILE} PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) +endforeach() + if(Qt5WebEngine_FOUND AND Qt5WebEngineWidgets_FOUND) target_link_libraries(nextcloudCore PUBLIC Qt5::WebEngineWidgets) endif() diff --git a/src/gui/ErrorBox.qml b/src/gui/ErrorBox.qml index 6adffae1f..2a84c130e 100644 --- a/src/gui/ErrorBox.qml +++ b/src/gui/ErrorBox.qml @@ -1,4 +1,5 @@ import QtQuick 2.15 +import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 import Style 1.0 @@ -6,29 +7,74 @@ import "./tray" Item { id: errorBox + + signal closeButtonClicked - property var text: "" + property string text: "" - property color color: Style.errorBoxTextColor property color backgroundColor: Style.errorBoxBackgroundColor - property color borderColor: Style.errorBoxBorderColor + property bool showCloseButton: false - implicitHeight: errorMessage.implicitHeight + 2 * 8 + implicitHeight: errorMessageLayout.implicitHeight + (2 * Style.standardSpacing) + + Rectangle { + id: solidStripe + + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + + width: Style.errorBoxStripeWidth + color: errorBox.backgroundColor + } Rectangle { anchors.fill: parent color: errorBox.backgroundColor - border.color: errorBox.borderColor + opacity: 0.2 } - EnforcedPlainTextLabel { - id: errorMessage - + GridLayout { + id: errorMessageLayout + anchors.fill: parent - anchors.margins: 8 - width: parent.width - color: errorBox.color - wrapMode: Text.WordWrap - text: errorBox.text + anchors.margins: Style.standardSpacing + anchors.leftMargin: Style.standardSpacing + solidStripe.width + + columns: 2 + + EnforcedPlainTextLabel { + Layout.fillWidth: true + color: Style.ncTextColor + font.bold: true + text: qsTr("Error") + visible: errorBox.showCloseButton + } + + Button { + Layout.preferredWidth: Style.iconButtonWidth + Layout.preferredHeight: Style.iconButtonWidth + + background: null + icon.color: Style.ncTextColor + icon.source: "qrc:///client/theme/close.svg" + + visible: errorBox.showCloseButton + enabled: visible + + onClicked: errorBox.closeButtonClicked() + } + + EnforcedPlainTextLabel { + id: errorMessage + + Layout.fillWidth: true + Layout.fillHeight: true + Layout.columnSpan: 2 + + color: Style.ncTextColor + wrapMode: Text.WordWrap + text: errorBox.text + } } } diff --git a/src/gui/PredefinedStatusButton.qml b/src/gui/PredefinedStatusButton.qml index dcd52df37..488249e0c 100644 --- a/src/gui/PredefinedStatusButton.qml +++ b/src/gui/PredefinedStatusButton.qml @@ -13,7 +13,6 @@ */ import QtQuick 2.15 -import QtQuick.Dialogs 1.3 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 diff --git a/src/gui/UserStatusSelector.qml b/src/gui/UserStatusSelector.qml index 51d80718c..6b532b8a1 100644 --- a/src/gui/UserStatusSelector.qml +++ b/src/gui/UserStatusSelector.qml @@ -13,7 +13,6 @@ */ import QtQuick 2.6 -import QtQuick.Dialogs 1.3 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 import QtQuick.Window 2.15 @@ -206,16 +205,20 @@ ColumnLayout { TextField { id: userStatusMessageTextField + + property color borderColor: activeFocus ? Style.ncBlue : Style.menuBorder + Layout.fillWidth: true + Layout.preferredHeight: contentHeight + (Style.smallSpacing * 2) + placeholderText: qsTr("What is your status?") placeholderTextColor: Style.ncSecondaryTextColor text: userStatusSelectorModel.userStatusMessage color: Style.ncTextColor + verticalAlignment: TextInput.AlignVCenter selectByMouse: true onEditingFinished: userStatusSelectorModel.userStatusMessage = text - property color borderColor: activeFocus ? Style.ncBlue : Style.menuBorder - background: Rectangle { radius: Style.slightlyRoundedButtonRadius color: Style.backgroundColor diff --git a/src/gui/UserStatusSelectorButton.qml b/src/gui/UserStatusSelectorButton.qml index 717774b97..e2d700c35 100644 --- a/src/gui/UserStatusSelectorButton.qml +++ b/src/gui/UserStatusSelectorButton.qml @@ -13,7 +13,6 @@ */ import QtQuick 2.6 -import QtQuick.Dialogs 1.3 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 diff --git a/src/gui/accountmanager.cpp b/src/gui/accountmanager.cpp index 56c194a7b..a2cfd8d1b 100644 --- a/src/gui/accountmanager.cpp +++ b/src/gui/accountmanager.cpp @@ -13,34 +13,49 @@ */ #include "accountmanager.h" -#include "configfile.h" + #include "sslerrordialog.h" #include "proxyauthhandler.h" #include "common/asserts.h" -#include -#include -#include -#include +#include "creds/credentialsfactory.h" +#include "creds/abstractcredentials.h" +#include "libsync/clientsideencryption.h" +#include "libsync/configfile.h" +#include "libsync/cookiejar.h" +#include "libsync/theme.h" + #include #include #include #include -#include "clientsideencryption.h" namespace { -static const char urlC[] = "url"; -static const char authTypeC[] = "authType"; -static const char userC[] = "user"; -static const char httpUserC[] = "http_user"; -static const char davUserC[] = "dav_user"; -static const char caCertsKeyC[] = "CaCertificates"; -static const char accountsC[] = "Accounts"; -static const char versionC[] = "version"; -static const char serverVersionC[] = "serverVersion"; +constexpr auto urlC = "url"; +constexpr auto authTypeC = "authType"; +constexpr auto userC = "user"; +constexpr auto displayNameC = "displayName"; +constexpr auto httpUserC = "http_user"; +constexpr auto davUserC = "dav_user"; +constexpr auto shibbolethUserC = "shibboleth_shib_user"; +constexpr auto caCertsKeyC = "CaCertificates"; +constexpr auto accountsC = "Accounts"; +constexpr auto versionC = "version"; +constexpr auto serverVersionC = "serverVersion"; +constexpr auto generalC = "General"; + +constexpr auto dummyAuthTypeC = "dummy"; +constexpr auto httpAuthTypeC = "http"; +constexpr auto webflowAuthTypeC = "webflow"; +constexpr auto shibbolethAuthTypeC = "shibboleth"; +constexpr auto httpAuthPrefix = "http_"; +constexpr auto webflowAuthPrefix = "webflow_"; + +constexpr auto legacyRelativeConfigLocationC = "/ownCloud/owncloud.cfg"; +constexpr auto legacyCfgFileNameC = "owncloud.cfg"; // The maximum versions that this client can read -static const int maxAccountsVersion = 2; -static const int maxAccountVersion = 1; +constexpr auto maxAccountsVersion = 2; +constexpr auto maxAccountVersion = 1; } @@ -54,12 +69,12 @@ AccountManager *AccountManager::instance() return &instance; } -bool AccountManager::restore() +bool AccountManager::restore(bool alsoRestoreLegacySettings) { QStringList skipSettingsKeys; backwardMigrationSettingsKeys(&skipSettingsKeys, &skipSettingsKeys); - auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); + const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); if (settings->status() != QSettings::NoError || !settings->isWritable()) { qCWarning(lcAccountManager) << "Could not read settings from" << settings->fileName() << settings->status(); @@ -73,16 +88,16 @@ bool AccountManager::restore() } // If there are no accounts, check the old format. - if (settings->childGroups().isEmpty() - && !settings->contains(QLatin1String(versionC))) { + if (settings->childGroups().isEmpty() && !settings->contains(QLatin1String(versionC)) && alsoRestoreLegacySettings) { restoreFromLegacySettings(); return true; } - for (const auto &accountId : settings->childGroups()) { + const auto settingsChildGroups = settings->childGroups(); + for (const auto &accountId : settingsChildGroups) { settings->beginGroup(accountId); if (!skipSettingsKeys.contains(settings->group())) { - if (auto acc = loadAccountHelper(*settings)) { + if (const auto acc = loadAccountHelper(*settings)) { acc->_id = accountId; if (auto accState = AccountState::loadFromSettings(acc, *settings)) { auto jar = qobject_cast(acc->_am->cookieJar()); @@ -104,12 +119,15 @@ bool AccountManager::restore() void AccountManager::backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys) { - auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); - const int accountsVersion = settings->value(QLatin1String(versionC)).toInt(); + const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); + const auto accountsVersion = settings->value(QLatin1String(versionC)).toInt(); + if (accountsVersion <= maxAccountsVersion) { - foreach (const auto &accountId, settings->childGroups()) { + const auto settingsChildGroups = settings->childGroups(); + for (const auto &accountId : settingsChildGroups) { settings->beginGroup(accountId); - const int accountVersion = settings->value(QLatin1String(versionC), 1).toInt(); + const auto accountVersion = settings->value(QLatin1String(versionC), 1).toInt(); + if (accountVersion > maxAccountVersion) { ignoreKeys->append(settings->group()); } @@ -131,47 +149,94 @@ bool AccountManager::restoreFromLegacySettings() // if the settings file could not be opened, the childKeys list is empty // then try to load settings from a very old place if (settings->childKeys().isEmpty()) { - // Now try to open the original ownCloud settings to see if they exist. - QString oCCfgFile = QDir::fromNativeSeparators(settings->fileName()); - // replace the last two segments with ownCloud/owncloud.cfg - oCCfgFile = oCCfgFile.left(oCCfgFile.lastIndexOf('/')); - oCCfgFile = oCCfgFile.left(oCCfgFile.lastIndexOf('/')); - oCCfgFile += QLatin1String("/ownCloud/owncloud.cfg"); - - qCInfo(lcAccountManager) << "Migrate: checking old config " << oCCfgFile; - - QFileInfo fi(oCCfgFile); - if (fi.isReadable()) { - std::unique_ptr oCSettings(new QSettings(oCCfgFile, QSettings::IniFormat)); - oCSettings->beginGroup(QLatin1String("ownCloud")); - - // Check the theme url to see if it is the same url that the oC config was for - QString overrideUrl = Theme::instance()->overrideServerUrl(); - if (!overrideUrl.isEmpty()) { - if (overrideUrl.endsWith('/')) { - overrideUrl.chop(1); - } - QString oCUrl = oCSettings->value(QLatin1String(urlC)).toString(); - if (oCUrl.endsWith('/')) { - oCUrl.chop(1); + // Legacy settings used QDesktopServices to get the location for the config folder in 2.4 and before + const auto legacy2_4CfgSettingsLocation = QString(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/data")); + const auto legacy2_4CfgFileParentFolder = legacy2_4CfgSettingsLocation.left(legacy2_4CfgSettingsLocation.lastIndexOf('/')); + + // 2.5+ (rest of 2.x series) + const auto legacy2_5CfgSettingsLocation = QStandardPaths::writableLocation(Utility::isWindows() ? QStandardPaths::AppDataLocation : QStandardPaths::AppConfigLocation); + const auto legacy2_5CfgFileParentFolder = legacy2_5CfgSettingsLocation.left(legacy2_5CfgSettingsLocation.lastIndexOf('/')); + + // Now try the locations we use today + const auto fullLegacyCfgFile = QDir::fromNativeSeparators(settings->fileName()); + const auto legacyCfgFileParentFolder = fullLegacyCfgFile.left(fullLegacyCfgFile.lastIndexOf('/')); + const auto legacyCfgFileGrandParentFolder = legacyCfgFileParentFolder.left(legacyCfgFileParentFolder.lastIndexOf('/')); + + const auto legacyCfgFileNamePath = QString(QStringLiteral("/") + legacyCfgFileNameC); + const auto legacyCfgFileRelativePath = QString(legacyRelativeConfigLocationC); + + const auto legacyLocations = QVector{legacy2_4CfgFileParentFolder + legacyCfgFileRelativePath, + legacy2_5CfgFileParentFolder + legacyCfgFileRelativePath, + legacyCfgFileParentFolder + legacyCfgFileNamePath, + legacyCfgFileGrandParentFolder + legacyCfgFileRelativePath}; + + for (const auto &configFile : legacyLocations) { + if (const QFileInfo configFileInfo(configFile); + configFileInfo.exists() && configFileInfo.isReadable()) { + + qCInfo(lcAccountManager) << "Migrate: checking old config " << configFile; + + auto oCSettings = std::make_unique(configFile, QSettings::IniFormat); + if (oCSettings->status() != QSettings::Status::NoError) { + qCInfo(lcAccountManager) << "Error reading legacy configuration file" << oCSettings->status(); + break; } - // in case the urls are equal reset the settings object to read from - // the ownCloud settings object - qCInfo(lcAccountManager) << "Migrate oC config if " << oCUrl << " == " << overrideUrl << ":" - << (oCUrl == overrideUrl ? "Yes" : "No"); - if (oCUrl == overrideUrl) { + // Check the theme url to see if it is the same url that the oC config was for + const auto overrideUrl = Theme::instance()->overrideServerUrl(); + const auto cleanOverrideUrl = overrideUrl.endsWith('/') ? overrideUrl.chopped(1) : overrideUrl; + qCInfo(lcAccountManager) << "Migrate: overrideUrl" << cleanOverrideUrl; + + if (!cleanOverrideUrl.isEmpty()) { + oCSettings->beginGroup(QLatin1String(accountsC)); + const auto accountsChildGroups = oCSettings->childGroups(); + + for (const auto &accountId : accountsChildGroups) { + oCSettings->beginGroup(accountId); + const auto oCUrl = oCSettings->value(QLatin1String(urlC)).toString(); + const auto cleanOCUrl = oCUrl.endsWith('/') ? oCUrl.chopped(1) : oCUrl; + + // in case the urls are equal reset the settings object to read from + // the ownCloud settings object + qCInfo(lcAccountManager) << "Migrate oC config if " << cleanOCUrl << " == " << cleanOverrideUrl << ":" + << (cleanOCUrl == cleanOverrideUrl ? "Yes" : "No"); + if (cleanOCUrl == cleanOverrideUrl) { + qCInfo(lcAccountManager) << "Copy settings" << oCSettings->allKeys().join(", "); + oCSettings->endGroup(); // current accountID group + oCSettings->endGroup(); // accounts group + settings = std::move(oCSettings); + break; + } + + oCSettings->endGroup(); + } + + if (oCSettings) { + oCSettings->endGroup(); + } + } else { + qCInfo(lcAccountManager) << "Copy settings" << oCSettings->allKeys().join(", "); settings = std::move(oCSettings); } + + break; + } else { + qCInfo(lcAccountManager) << "Migrate: could not read old config " << configFile; } } } // Try to load the single account. if (!settings->childKeys().isEmpty()) { - if (auto acc = loadAccountHelper(*settings)) { - addAccount(acc); - return true; + settings->beginGroup(accountsC); + const auto childGroups = settings->childGroups(); + for (const auto &accountId : childGroups) { + settings->beginGroup(accountId); + if (const auto acc = loadAccountHelper(*settings)) { + addAccount(acc); + + return true; + } } } return false; @@ -179,7 +244,7 @@ bool AccountManager::restoreFromLegacySettings() void AccountManager::save(bool saveCredentials) { - auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); + const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); settings->setValue(QLatin1String(versionC), maxAccountsVersion); for (const auto &acc : qAsConst(_accounts)) { settings->beginGroup(acc->account()->id()); @@ -195,7 +260,7 @@ void AccountManager::save(bool saveCredentials) void AccountManager::saveAccount(Account *a) { qCDebug(lcAccountManager) << "Saving account" << a->url().toString(); - auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); + const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); settings->beginGroup(a->id()); saveAccountHelper(a, *settings, false); // don't save credentials they might not have been loaded yet settings->endGroup(); @@ -207,7 +272,7 @@ void AccountManager::saveAccount(Account *a) void AccountManager::saveAccountState(AccountState *a) { qCDebug(lcAccountManager) << "Saving account state" << a->account()->url().toString(); - auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); + const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); settings->beginGroup(a->account()->id()); a->writeToSettings(*settings); settings->endGroup(); @@ -221,7 +286,9 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s settings.setValue(QLatin1String(versionC), maxAccountVersion); settings.setValue(QLatin1String(urlC), acc->_url.toString()); settings.setValue(QLatin1String(davUserC), acc->_davUser); + settings.setValue(QLatin1String(displayNameC), acc->_displayName); settings.setValue(QLatin1String(serverVersionC), acc->_serverVersion); + if (acc->_credentials) { if (saveCredentials) { // Only persist the credentials if the parameter is set, on migration from 1.8.x @@ -230,7 +297,9 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s // re-persisting them) acc->_credentials->persist(); } - for (const auto &key : acc->_settingsMap.keys()) { + + const auto settingsMapKeys = acc->_settingsMap.keys(); + for (const auto &key : settingsMapKeys) { settings.setValue(key, acc->_settingsMap.value(key)); } settings.setValue(QLatin1String(authTypeC), acc->_credentials->authType()); @@ -241,10 +310,11 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s } // Save accepted certificates. - settings.beginGroup(QLatin1String("General")); + settings.beginGroup(QLatin1String(generalC)); qCInfo(lcAccountManager) << "Saving " << acc->approvedCerts().count() << " unknown certs."; QByteArray certs; - for (const auto &cert : acc->approvedCerts()) { + const auto approvedCerts = acc->approvedCerts(); + for (const auto &cert : approvedCerts) { certs += cert.toPem() + '\n'; } if (!certs.isEmpty()) { @@ -267,29 +337,29 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s AccountPtr AccountManager::loadAccountHelper(QSettings &settings) { - auto urlConfig = settings.value(QLatin1String(urlC)); + const auto urlConfig = settings.value(QLatin1String(urlC)); if (!urlConfig.isValid()) { // No URL probably means a corrupted entry in the account settings qCWarning(lcAccountManager) << "No URL for account " << settings.group(); return AccountPtr(); } - auto acc = createAccount(); + const auto acc = createAccount(); - QString authType = settings.value(QLatin1String(authTypeC)).toString(); + auto authType = settings.value(QLatin1String(authTypeC)).toString(); // There was an account-type saving bug when 'skip folder config' was used // See #5408. This attempts to fix up the "dummy" authType - if (authType == QLatin1String("dummy")) { - if (settings.contains(QLatin1String("http_user"))) { - authType = "http"; - } else if (settings.contains(QLatin1String("shibboleth_shib_user"))) { - authType = "shibboleth"; + if (authType == QLatin1String(dummyAuthTypeC)) { + if (settings.contains(QLatin1String(httpUserC))) { + authType = httpAuthTypeC; + } else if (settings.contains(QLatin1String(shibbolethUserC))) { + authType = shibbolethAuthTypeC; } } - QString overrideUrl = Theme::instance()->overrideServerUrl(); - QString forceAuth = Theme::instance()->forceConfigAuthType(); + const auto overrideUrl = Theme::instance()->overrideServerUrl(); + const auto forceAuth = Theme::instance()->forceConfigAuthType(); if (!forceAuth.isEmpty() && !overrideUrl.isEmpty()) { // If forceAuth is set, this might also mean the overrideURL has changed. // See enterprise issues #1126 @@ -300,14 +370,15 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings) } // Migrate to webflow - if (authType == QLatin1String("http")) { - authType = "webflow"; + if (authType == QLatin1String(httpAuthTypeC)) { + authType = webflowAuthTypeC; settings.setValue(QLatin1String(authTypeC), authType); - for (const QString &key : settings.childKeys()) { - if (!key.startsWith("http_")) + const auto settingsChildKeys = settings.childKeys(); + for (const auto &key : settingsChildKeys) { + if (!key.startsWith(httpAuthPrefix)) continue; - auto newkey = QString::fromLatin1("webflow_").append(key.mid(5)); + const auto newkey = QString::fromLatin1(webflowAuthPrefix).append(key.mid(5)); settings.setValue(newkey, settings.value((key))); settings.remove(key); } @@ -320,8 +391,10 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings) // We want to only restore settings for that auth type and the user value acc->_settingsMap.insert(QLatin1String(userC), settings.value(userC)); + acc->_displayName = settings.value(QLatin1String(displayNameC), "").toString(); QString authTypePrefix = authType + "_"; - for (const auto &key : settings.childKeys()) { + const auto settingsChildKeys = settings.childKeys(); + for (const auto &key : settingsChildKeys) { if (!key.startsWith(authTypePrefix)) continue; acc->_settingsMap.insert(key, settings.value(key)); @@ -330,7 +403,7 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings) acc->setCredentials(CredentialsFactory::create(authType)); // now the server cert, it is in the general group - settings.beginGroup(QLatin1String("General")); + settings.beginGroup(QLatin1String(generalC)); const auto certs = QSslCertificate::fromData(settings.value(caCertsKeyC).toByteArray()); qCInfo(lcAccountManager) << "Restored: " << certs.count() << " unknown certs."; acc->setApprovedCerts(certs); @@ -349,7 +422,8 @@ AccountStatePtr AccountManager::account(const QString &name) AccountStatePtr AccountManager::accountFromUserId(const QString &id) const { - for (const auto &account : accounts()) { + const auto accountsList = accounts(); + for (const auto &account : accountsList) { const auto isUserIdWithPort = id.split(QLatin1Char(':')).size() > 1; const auto port = isUserIdWithPort ? account->account()->url().port() : -1; const auto portString = (port > 0 && port != 80 && port != 443) ? QStringLiteral(":%1").arg(port) : QStringLiteral(""); @@ -370,25 +444,25 @@ AccountState *AccountManager::addAccount(const AccountPtr &newAccount) } newAccount->_id = id; - auto newAccountState = new AccountState(newAccount); + const auto newAccountState = new AccountState(newAccount); addAccountState(newAccountState); return newAccountState; } void AccountManager::deleteAccount(AccountState *account) { - auto it = std::find(_accounts.begin(), _accounts.end(), account); + const auto it = std::find(_accounts.begin(), _accounts.end(), account); if (it == _accounts.end()) { return; } - auto copy = *it; // keep a reference to the shared pointer so it does not delete it just yet + const auto copy = *it; // keep a reference to the shared pointer so it does not delete it just yet _accounts.erase(it); // Forget account credentials, cookies account->account()->credentials()->forgetSensitiveData(); QFile::remove(account->account()->cookieJarPath()); - auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); + const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); settings->remove(account->account()->id()); // Forget E2E keys @@ -402,7 +476,7 @@ void AccountManager::deleteAccount(AccountState *account) AccountPtr AccountManager::createAccount() { - AccountPtr acc = Account::create(); + const auto acc = Account::create(); acc->setSslErrorHandler(new SslDialogErrorHandler); connect(acc.data(), &Account::proxyAuthenticationRequired, ProxyAuthHandler::instance(), &ProxyAuthHandler::handleProxyAuthenticationRequired); @@ -439,9 +513,9 @@ bool AccountManager::isAccountIdAvailable(const QString &id) const QString AccountManager::generateFreeAccountId() const { - int i = 0; + auto i = 0; forever { - QString id = QString::number(i); + const auto id = QString::number(i); if (isAccountIdAvailable(id)) { return id; } diff --git a/src/gui/accountmanager.h b/src/gui/accountmanager.h index dd06c4991..c1c56c7cc 100644 --- a/src/gui/accountmanager.h +++ b/src/gui/accountmanager.h @@ -41,7 +41,7 @@ public: * Returns false if there was an error reading the settings, * but note that settings not existing is not an error. */ - bool restore(); + bool restore(bool alsoRestoreLegacySettings = true); /** * Add this account in the list of saved accounts. @@ -58,7 +58,7 @@ public: * Return a list of all accounts. * (this is a list of QSharedPointer for internal reasons, one should normally not keep a copy of them) */ - QList accounts() const; + [[nodiscard]] QList accounts() const; /** * Return the account state pointer for an account identified by its display name @@ -69,7 +69,7 @@ public: * Return the account state pointer for an account from its id */ - AccountStatePtr accountFromUserId(const QString &id) const; + [[nodiscard]] AccountStatePtr accountFromUserId(const QString &id) const; /** * Delete the AccountState @@ -95,8 +95,8 @@ private: bool restoreFromLegacySettings(); - bool isAccountIdAvailable(const QString &id) const; - QString generateFreeAccountId() const; + [[nodiscard]] bool isAccountIdAvailable(const QString &id) const; + [[nodiscard]] QString generateFreeAccountId() const; // Adds an account to the tracked list, emitting accountAdded() void addAccountState(AccountState *accountState); @@ -108,16 +108,16 @@ private: public slots: /// Saves account data, not including the credentials - void saveAccount(Account *a); + void saveAccount(OCC::Account *a); /// Saves account state data, not including the account - void saveAccountState(AccountState *a); + void saveAccountState(OCC::AccountState *a); Q_SIGNALS: - void accountAdded(AccountState *account); - void accountRemoved(AccountState *account); - void accountSyncConnectionRemoved(AccountState *account); - void removeAccountFolders(AccountState *account); + void accountAdded(OCC::AccountState *account); + void accountRemoved(OCC::AccountState *account); + void accountSyncConnectionRemoved(OCC::AccountState *account); + void removeAccountFolders(OCC::AccountState *account); }; } diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 0d8ea92cf..02a218e05 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -66,6 +66,7 @@ constexpr auto propertyFolder = "folder"; constexpr auto propertyPath = "path"; constexpr auto e2eUiActionIdKey = "id"; constexpr auto e2EeUiActionEnableEncryptionId = "enable_encryption"; +constexpr auto e2EeUiActionDisableEncryptionId = "disable_encryption"; constexpr auto e2EeUiActionDisplayMnemonicId = "display_mnemonic"; } @@ -89,11 +90,11 @@ void showEnableE2eeWithVirtualFilesWarningDialog(std::function onAcc { const auto messageBox = new QMessageBox; messageBox->setAttribute(Qt::WA_DeleteOnClose); - messageBox->setText(AccountSettings::tr("End-to-End Encryption with Virtual Files")); + messageBox->setText(AccountSettings::tr("End-to-end Encryption with Virtual Files")); messageBox->setInformativeText(AccountSettings::tr("You seem to have the Virtual Files feature enabled on this folder. " "At the moment, it is not possible to implicitly download virtual files that are " - "End-to-End encrypted. To get the best experience with Virtual Files and " - "End-to-End Encryption, make sure the encrypted folder is marked with " + "end-to-end encrypted. To get the best experience with virtual files and " + "end-to-end encryption, make sure the encrypted folder is marked with " "\"Make always available locally\".")); messageBox->setIcon(QMessageBox::Warning); const auto dontEncryptButton = messageBox->addButton(QMessageBox::StandardButton::Cancel); @@ -130,11 +131,11 @@ protected: { if (event->type() == QEvent::HoverMove) { Qt::CursorShape shape = Qt::ArrowCursor; - 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::optionsButtonRect(folderList->visualRect(index),folderList->layoutDirection()).contains(pos))) { + const auto pos = folderList->mapFromGlobal(QCursor::pos()); + const auto index = folderList->indexAt(pos); + if (model->classify(index) == FolderStatusModel::RootFolder && + (FolderStatusDelegate::errorsListRect(folderList->visualRect(index)).contains(pos) || + FolderStatusDelegate::optionsButtonRect(folderList->visualRect(index),folderList->layoutDirection()).contains(pos))) { shape = Qt::PointingHandCursor; } folderList->setCursor(shape); @@ -156,7 +157,7 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) _model = new FolderStatusModel; _model->setAccountState(_accountState); _model->setParent(this); - auto *delegate = new FolderStatusDelegate; + const auto delegate = new FolderStatusDelegate; delegate->setParent(this); // Connect styleChanged events to our widgets, so they can adapt (Dark-/Light-Mode switching) @@ -172,7 +173,7 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) #endif new ToolTipUpdater(_ui->_folderList); - auto mouseCursorChanger = new MouseCursorChanger(this); + const auto mouseCursorChanger = new MouseCursorChanger(this); mouseCursorChanger->folderList = _ui->_folderList; mouseCursorChanger->model = _model; _ui->_folderList->setMouseTracking(true); @@ -228,6 +229,7 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) // Connect E2E stuff initializeE2eEncryption(); + _ui->encryptionMessage->setCloseButtonVisible(false); _ui->connectLabel->setText(tr("No account configured.")); @@ -242,19 +244,27 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) void AccountSettings::slotE2eEncryptionMnemonicReady() { - auto *const actionDisplayMnemonic = addActionToEncryptionMessage(tr("Display mnemonic"), e2EeUiActionDisplayMnemonicId); + const auto actionDisableEncryption = addActionToEncryptionMessage(tr("Disable encryption"), e2EeUiActionDisableEncryptionId); + connect(actionDisableEncryption, &QAction::triggered, this, [this] { + disableEncryptionForAccount(_accountState->account()); + }); + + const auto actionDisplayMnemonic = addActionToEncryptionMessage(tr("Display mnemonic"), e2EeUiActionDisplayMnemonicId); connect(actionDisplayMnemonic, &QAction::triggered, this, [this]() { displayMnemonic(_accountState->account()->e2e()->_mnemonic); }); - _ui->encryptionMessage->setText(tr("This account supports End-to-End encryption")); + + _ui->encryptionMessage->setMessageType(KMessageWidget::Positive); + _ui->encryptionMessage->setText(tr("End-to-end encryption has been enabled for this account")); + _ui->encryptionMessage->setIcon(Theme::createColorAwareIcon(QStringLiteral(":/client/theme/lock.svg"))); _ui->encryptionMessage->show(); - } void AccountSettings::slotE2eEncryptionGenerateKeys() { connect(_accountState->account()->e2e(), &ClientSideEncryption::initializationFinished, this, &AccountSettings::slotE2eEncryptionInitializationFinished); _accountState->account()->setE2eEncryptionKeysGenerationAllowed(true); + _accountState->account()->setAskUserForMnemonic(true); _accountState->account()->e2e()->initialize(_accountState->account()); } @@ -268,6 +278,7 @@ void AccountSettings::slotE2eEncryptionInitializationFinished(bool isNewMnemonic displayMnemonic(_accountState->account()->e2e()->_mnemonic); } } + _accountState->account()->setAskUserForMnemonic(false); } void AccountSettings::slotEncryptFolderFinished(int status) @@ -281,7 +292,7 @@ void AccountSettings::slotEncryptFolderFinished(int status) const auto folder = job->property(propertyFolder).value(); Q_ASSERT(folder); - const auto path = job->property(propertyPath).value(); + const auto path = job->property(propertyPath).toString(); const auto index = _model->indexForPath(folder, path); Q_ASSERT(index.isValid()); _model->resetAndFetch(index.parent()); @@ -291,9 +302,10 @@ void AccountSettings::slotEncryptFolderFinished(int status) QString AccountSettings::selectedFolderAlias() const { - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); - if (!selected.isValid()) + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); + if (!selected.isValid()) { return ""; + } return _model->data(selected, FolderStatusDelegate::FolderAliasRole).toString(); } @@ -311,9 +323,10 @@ void AccountSettings::doExpand() { // Make sure at least the root items are expanded for (int i = 0; i < _model->rowCount(); ++i) { - auto idx = _model->index(i); - if (!_ui->_folderList->isExpanded(idx)) + const auto idx = _model->index(i); + if (!_ui->_folderList->isExpanded(idx)) { _ui->_folderList->setExpanded(idx, true); + } } } @@ -391,8 +404,7 @@ void AccountSettings::slotMarkSubfolderEncrypted(FolderStatusModel::SubFolderInf job->start(); }; - if (folder->virtualFilesEnabled() - && folder->vfs().mode() == Vfs::WindowsCfApi) { + if (folder->virtualFilesEnabled() && folder->vfs().mode() == Vfs::WindowsCfApi) { showEnableE2eeWithVirtualFilesWarningDialog(encryptFolder); return; } @@ -401,10 +413,11 @@ void AccountSettings::slotMarkSubfolderEncrypted(FolderStatusModel::SubFolderInf void AccountSettings::slotEditCurrentIgnoredFiles() { - Folder *f = FolderMan::instance()->folder(selectedFolderAlias()); - if (!f) + const auto folder = FolderMan::instance()->folder(selectedFolderAlias()); + if (!folder) { return; - openIgnoredFilesDialog(f->path()); + } + openIgnoredFilesDialog(folder->path()); } void AccountSettings::slotOpenMakeFolderDialog() @@ -422,7 +435,7 @@ void AccountSettings::slotOpenMakeFolderDialog() return; } - const QString fileName = [this, &selected, &classification] { + const auto fileName = [this, &selected, &classification] { QString result; if (classification == FolderStatusModel::RootFolder) { const auto alias = _model->data(selected, FolderStatusDelegate::FolderAliasRole).toString(); @@ -441,7 +454,7 @@ void AccountSettings::slotOpenMakeFolderDialog() }(); if (!fileName.isEmpty()) { - const auto folderCreationDialog = new FolderCreationDialog(fileName, this); + const auto folderCreationDialog = new FolderCreationDialog(fileName, this); folderCreationDialog->setAttribute(Qt::WA_DeleteOnClose); folderCreationDialog->open(); } @@ -449,10 +462,11 @@ void AccountSettings::slotOpenMakeFolderDialog() void AccountSettings::slotEditCurrentLocalIgnoredFiles() { - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); - if (!selected.isValid() || _model->classify(selected) != FolderStatusModel::SubFolder) + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); + if (!selected.isValid() || _model->classify(selected) != FolderStatusModel::SubFolder) { return; - QString fileName = _model->data(selected, FolderStatusDelegate::FolderPathRole).toString(); + } + const auto fileName = _model->data(selected, FolderStatusDelegate::FolderPathRole).toString(); openIgnoredFilesDialog(fileName); } @@ -460,25 +474,25 @@ void AccountSettings::openIgnoredFilesDialog(const QString & absFolderPath) { Q_ASSERT(QFileInfo(absFolderPath).isAbsolute()); - const QString ignoreFile = absFolderPath + ".sync-exclude.lst"; - auto layout = new QVBoxLayout(); - auto ignoreListWidget = new IgnoreListTableWidget(this); + const QString ignoreFile{absFolderPath + ".sync-exclude.lst"}; + const auto layout = new QVBoxLayout(); + const auto ignoreListWidget = new IgnoreListTableWidget(this); ignoreListWidget->readIgnoreFile(ignoreFile); layout->addWidget(ignoreListWidget); - auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + const auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(buttonBox); - auto dialog = new QDialog(); + const auto dialog = new QDialog(); dialog->setLayout(layout); connect(buttonBox, &QDialogButtonBox::clicked, [=](QAbstractButton * button) { - if (buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) + if (buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) { ignoreListWidget->slotWriteIgnoreFile(ignoreFile); + } dialog->close(); }); - connect(buttonBox, &QDialogButtonBox::rejected, - dialog, &QDialog::close); + connect(buttonBox, &QDialogButtonBox::rejected, dialog, &QDialog::close); dialog->open(); } @@ -491,18 +505,18 @@ void AccountSettings::slotSubfolderContextMenuRequested(const QModelIndex& index auto ac = menu.addAction(tr("Open folder")); connect(ac, &QAction::triggered, this, &AccountSettings::slotOpenCurrentLocalSubFolder); - auto fileName = _model->data(index, FolderStatusDelegate::FolderPathRole).toString(); + const auto fileName = _model->data(index, FolderStatusDelegate::FolderPathRole).toString(); if (!QFile::exists(fileName)) { ac->setEnabled(false); } - auto info = _model->infoForIndex(index); - auto acc = _accountState->account(); + const auto info = _model->infoForIndex(index); + const auto acc = _accountState->account(); if (acc->capabilities().clientSideEncryptionAvailable()) { // Verify if the folder is empty before attempting to encrypt. - bool isEncrypted = info->_isEncrypted; - bool isParentEncrypted = _model->isAnyAncestorEncrypted(index); + const auto isEncrypted = info->_isEncrypted; + const auto isParentEncrypted = _model->isAnyAncestorEncrypted(index); if (!isEncrypted && !isParentEncrypted) { ac = menu.addAction(tr("Encrypt")); @@ -532,7 +546,9 @@ void AccountSettings::slotSubfolderContextMenuRequested(const QModelIndex& index // It might be an E2EE mangled path, so let's try to demangle it const auto journal = folder->journalDb(); SyncJournalFileRecord rec; - journal->getFileRecordByE2eMangledName(remotePath, &rec); + if (!journal->getFileRecordByE2eMangledName(remotePath, &rec)) { + qCWarning(lcFolderStatus) << "Could not get file record by E2E Mangled Name from local DB" << remotePath; + } const auto path = rec.isValid() ? rec._path : remotePath; @@ -548,8 +564,8 @@ void AccountSettings::slotSubfolderContextMenuRequested(const QModelIndex& index void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) { - QTreeView *tv = _ui->_folderList; - QModelIndex index = tv->indexAt(pos); + const auto treeView = _ui->_folderList; + const auto index = treeView->indexAt(pos); if (!index.isValid()) { return; } @@ -563,20 +579,22 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) return; } - tv->setCurrentIndex(index); - QString alias = _model->data(index, FolderStatusDelegate::FolderAliasRole).toString(); - bool folderPaused = _model->data(index, FolderStatusDelegate::FolderSyncPaused).toBool(); - bool folderConnected = _model->data(index, FolderStatusDelegate::FolderAccountConnected).toBool(); - auto folderMan = FolderMan::instance(); - QPointer folder = folderMan->folder(alias); - if (!folder) + treeView->setCurrentIndex(index); + const auto alias = _model->data(index, FolderStatusDelegate::FolderAliasRole).toString(); + const auto folderPaused = _model->data(index, FolderStatusDelegate::FolderSyncPaused).toBool(); + const auto folderConnected = _model->data(index, FolderStatusDelegate::FolderAccountConnected).toBool(); + const auto folderMan = FolderMan::instance(); + const auto folder = folderMan->folder(alias); + + if (!folder) { return; + } - auto *menu = new QMenu(tv); + const auto menu = new QMenu(treeView); menu->setAttribute(Qt::WA_DeleteOnClose); - QAction *ac = menu->addAction(tr("Open folder")); + auto ac = menu->addAction(tr("Open folder")); connect(ac, &QAction::triggered, this, &AccountSettings::slotOpenCurrentFolder); ac = menu->addAction(tr("Edit Ignored Files")); @@ -622,8 +640,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) ac->setDisabled(Theme::instance()->enforceVirtualFilesSyncFolder()); } - if (Theme::instance()->showVirtualFilesOption() - && !folder->virtualFilesEnabled() && Vfs::checkAvailability(folder->path())) { + if (Theme::instance()->showVirtualFilesOption() && !folder->virtualFilesEnabled() && Vfs::checkAvailability(folder->path())) { const auto mode = bestAvailableVfsMode(); if (mode == Vfs::WindowsCfApi || ConfigFile().showExperimentalOptions()) { ac = menu->addAction(tr("Enable virtual file support %1 …").arg(mode == Vfs::WindowsCfApi ? QString() : tr("(experimental)"))); @@ -635,22 +652,23 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos) } - menu->popup(tv->mapToGlobal(pos)); + menu->popup(treeView->mapToGlobal(pos)); } void AccountSettings::slotFolderListClicked(const QModelIndex &indx) { if (indx.data(FolderStatusDelegate::AddButton).toBool()) { // "Add Folder Sync Connection" - QTreeView *tv = _ui->_folderList; - auto pos = tv->mapFromGlobal(QCursor::pos()); + const auto treeView = _ui->_folderList; + const auto pos = treeView->mapFromGlobal(QCursor::pos()); QStyleOptionViewItem opt; - opt.initFrom(tv); - auto btnRect = tv->visualRect(indx); - auto btnSize = tv->itemDelegate(indx)->sizeHint(opt, indx); - auto actual = QStyle::visualRect(opt.direction, btnRect, QRect(btnRect.topLeft(), btnSize)); - if (!actual.contains(pos)) + opt.initFrom(treeView); + const auto btnRect = treeView->visualRect(indx); + const auto btnSize = treeView->itemDelegate(indx)->sizeHint(opt, indx); + const auto actual = QStyle::visualRect(opt.direction, btnRect, QRect(btnRect.topLeft(), btnSize)); + if (!actual.contains(pos)) { return; + } if (indx.flags() & Qt::ItemIsEnabled) { slotAddFolder(); @@ -664,20 +682,20 @@ void AccountSettings::slotFolderListClicked(const QModelIndex &indx) } if (_model->classify(indx) == FolderStatusModel::RootFolder) { // tries to find if we clicked on the '...' button. - QTreeView *tv = _ui->_folderList; - auto pos = tv->mapFromGlobal(QCursor::pos()); - if (FolderStatusDelegate::optionsButtonRect(tv->visualRect(indx), layoutDirection()).contains(pos)) { + const auto treeView = _ui->_folderList; + const auto pos = treeView->mapFromGlobal(QCursor::pos()); + if (FolderStatusDelegate::optionsButtonRect(treeView->visualRect(indx), layoutDirection()).contains(pos)) { slotCustomContextMenuRequested(pos); return; } - if (FolderStatusDelegate::errorsListRect(tv->visualRect(indx)).contains(pos)) { + if (FolderStatusDelegate::errorsListRect(treeView->visualRect(indx)).contains(pos)) { emit showIssuesList(_accountState); return; } // Expand root items on single click if (_accountState && _accountState->state() == AccountState::Connected) { - bool expanded = !(_ui->_folderList->isExpanded(indx)); + const auto expanded = !(_ui->_folderList->isExpanded(indx)); _ui->_folderList->setExpanded(indx, expanded); } } @@ -685,10 +703,10 @@ void AccountSettings::slotFolderListClicked(const QModelIndex &indx) void AccountSettings::slotAddFolder() { - FolderMan *folderMan = FolderMan::instance(); + const auto folderMan = FolderMan::instance(); folderMan->setSyncEnabled(false); // do not start more syncs. - auto *folderWizard = new FolderWizard(_accountState->account(), this); + const auto folderWizard = new FolderWizard(_accountState->account(), this); folderWizard->setAttribute(Qt::WA_DeleteOnClose); connect(folderWizard, &QDialog::accepted, this, &AccountSettings::slotFolderWizardAccepted); @@ -699,8 +717,8 @@ void AccountSettings::slotAddFolder() void AccountSettings::slotFolderWizardAccepted() { - auto *folderWizard = qobject_cast(sender()); - FolderMan *folderMan = FolderMan::instance(); + const auto folderWizard = qobject_cast(sender()); + const auto folderMan = FolderMan::instance(); qCInfo(lcAccountSettings) << "Folder wizard completed"; @@ -735,22 +753,24 @@ void AccountSettings::slotFolderWizardAccepted() */ definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles(); - if (folderMan->navigationPaneHelper().showInExplorerNavigationPane()) + if (folderMan->navigationPaneHelper().showInExplorerNavigationPane()) { definition.navigationPaneClsid = QUuid::createUuid(); + } - auto selectiveSyncBlackList = folderWizard->property("selectiveSyncBlackList").toStringList(); + const auto selectiveSyncBlackList = folderWizard->property("selectiveSyncBlackList").toStringList(); folderMan->setSyncEnabled(true); - Folder *f = folderMan->addFolder(_accountState, definition); - if (f) { - if (definition.virtualFilesMode != Vfs::Off && folderWizard->property("useVirtualFiles").toBool()) - f->setRootPinState(PinState::OnlineOnly); + const auto folder = folderMan->addFolder(_accountState, definition); + if (folder) { + if (definition.virtualFilesMode != Vfs::Off && folderWizard->property("useVirtualFiles").toBool()) { + folder->setRootPinState(PinState::OnlineOnly); + } - f->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, selectiveSyncBlackList); + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, selectiveSyncBlackList); // The user already accepted the selective sync dialog. everything is in the white list - f->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList() << QLatin1String("/")); folderMan->scheduleAllFolders(); emit folderChanged(); @@ -760,19 +780,19 @@ void AccountSettings::slotFolderWizardAccepted() void AccountSettings::slotFolderWizardRejected() { qCInfo(lcAccountSettings) << "Folder wizard cancelled"; - FolderMan *folderMan = FolderMan::instance(); + const auto folderMan = FolderMan::instance(); folderMan->setSyncEnabled(true); } void AccountSettings::slotRemoveCurrentFolder() { - auto folder = FolderMan::instance()->folder(selectedFolderAlias()); - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); + const auto folder = FolderMan::instance()->folder(selectedFolderAlias()); + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); if (selected.isValid() && folder) { - int row = selected.row(); + const auto row = selected.row(); qCInfo(lcAccountSettings) << "Remove Folder alias " << folder->alias(); - QString shortGuiLocalPath = folder->shortGuiLocalPath(); + const auto shortGuiLocalPath = folder->shortGuiLocalPath(); auto messageBox = new QMessageBox(QMessageBox::Question, tr("Confirm Folder Sync Connection Removal"), @@ -782,8 +802,7 @@ void AccountSettings::slotRemoveCurrentFolder() QMessageBox::NoButton, this); messageBox->setAttribute(Qt::WA_DeleteOnClose); - QPushButton *yesButton = - messageBox->addButton(tr("Remove Folder Sync Connection"), QMessageBox::YesRole); + const auto yesButton = messageBox->addButton(tr("Remove Folder Sync Connection"), QMessageBox::YesRole); messageBox->addButton(tr("Cancel"), QMessageBox::NoRole); connect(messageBox, &QMessageBox::finished, this, [messageBox, yesButton, folder, row, this]{ if (messageBox->clickedButton() == yesButton) { @@ -801,7 +820,7 @@ void AccountSettings::slotRemoveCurrentFolder() void AccountSettings::slotOpenCurrentFolder() { - auto alias = selectedFolderAlias(); + const auto alias = selectedFolderAlias(); if (!alias.isEmpty()) { emit openFolderAlias(alias); } @@ -809,39 +828,44 @@ void AccountSettings::slotOpenCurrentFolder() void AccountSettings::slotOpenCurrentLocalSubFolder() { - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); - if (!selected.isValid() || _model->classify(selected) != FolderStatusModel::SubFolder) + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); + if (!selected.isValid() || _model->classify(selected) != FolderStatusModel::SubFolder) { return; - QString fileName = _model->data(selected, FolderStatusDelegate::FolderPathRole).toString(); - QUrl url = QUrl::fromLocalFile(fileName); + } + const auto fileName = _model->data(selected, FolderStatusDelegate::FolderPathRole).toString(); + const auto url = QUrl::fromLocalFile(fileName); QDesktopServices::openUrl(url); } void AccountSettings::slotEnableVfsCurrentFolder() { - FolderMan *folderMan = FolderMan::instance(); - QPointer folder = folderMan->folder(selectedFolderAlias()); - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); - if (!selected.isValid() || !folder) + const auto folderMan = FolderMan::instance(); + const auto folder = folderMan->folder(selectedFolderAlias()); + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); + + if (!selected.isValid() || !folder) { return; + } OwncloudWizard::askExperimentalVirtualFilesFeature(this, [folder, this](bool enable) { - if (!enable || !folder) + if (!enable || !folder) { return; + } // we might need to add or remove the panel entry as cfapi brings this feature out of the box FolderMan::instance()->navigationPaneHelper().scheduleUpdateCloudStorageRegistry(); // It is unsafe to switch on vfs while a sync is running - wait if necessary. - auto connection = std::make_shared(); - auto switchVfsOn = [folder, connection, this]() { - if (*connection) + const auto connection = std::make_shared(); + const auto switchVfsOn = [folder, connection, this]() { + if (*connection) { QObject::disconnect(*connection); + } qCInfo(lcAccountSettings) << "Enabling vfs support for folder" << folder->path(); // Wipe selective sync blacklist - bool ok = false; + auto ok = false; const auto oldBlacklist = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok); folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, {}); @@ -879,13 +903,15 @@ void AccountSettings::slotEnableVfsCurrentFolder() void AccountSettings::slotDisableVfsCurrentFolder() { - FolderMan *folderMan = FolderMan::instance(); - QPointer folder = folderMan->folder(selectedFolderAlias()); - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); - if (!selected.isValid() || !folder) + const auto folderMan = FolderMan::instance(); + const auto folder = folderMan->folder(selectedFolderAlias()); + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); + + if (!selected.isValid() || !folder) { return; + } - auto msgBox = new QMessageBox( + const auto msgBox = new QMessageBox( QMessageBox::Question, tr("Disable virtual file support?"), tr("This action will disable virtual file support. As a consequence contents of folders that " @@ -895,21 +921,23 @@ void AccountSettings::slotDisableVfsCurrentFolder() "will become available again." "\n\n" "This action will abort any currently running synchronization.")); - auto acceptButton = msgBox->addButton(tr("Disable support"), QMessageBox::AcceptRole); + const auto acceptButton = msgBox->addButton(tr("Disable support"), QMessageBox::AcceptRole); msgBox->addButton(tr("Cancel"), QMessageBox::RejectRole); connect(msgBox, &QMessageBox::finished, msgBox, [this, msgBox, folder, acceptButton] { msgBox->deleteLater(); - if (msgBox->clickedButton() != acceptButton|| !folder) + if (msgBox->clickedButton() != acceptButton|| !folder) { return; + } // we might need to add or remove the panel entry as cfapi brings this feature out of the box FolderMan::instance()->navigationPaneHelper().scheduleUpdateCloudStorageRegistry(); // It is unsafe to switch off vfs while a sync is running - wait if necessary. - auto connection = std::make_shared(); - auto switchVfsOff = [folder, connection, this]() { - if (*connection) + const auto connection = std::make_shared(); + const auto switchVfsOff = [folder, connection, this]() { + if (*connection) { QObject::disconnect(*connection); + } qCInfo(lcAccountSettings) << "Disabling vfs support for folder" << folder->path(); @@ -945,11 +973,13 @@ void AccountSettings::slotSetCurrentFolderAvailability(PinState state) { ASSERT(state == PinState::OnlineOnly || state == PinState::AlwaysLocal); - FolderMan *folderMan = FolderMan::instance(); - QPointer folder = folderMan->folder(selectedFolderAlias()); - QModelIndex selected = _ui->_folderList->selectionModel()->currentIndex(); - if (!selected.isValid() || !folder) + const auto folderMan = FolderMan::instance(); + const auto folder = folderMan->folder(selectedFolderAlias()); + const auto selected = _ui->_folderList->selectionModel()->currentIndex(); + + if (!selected.isValid() || !folder) { return; + } // similar to socket api: sets pin state recursively and sync folder->setRootPinState(state); @@ -976,7 +1006,7 @@ void AccountSettings::displayMnemonic(const QString &mnemonic) QDialog widget; Ui_Dialog ui; ui.setupUi(&widget); - widget.setWindowTitle(tr("End-to-End encryption mnemonic")); + widget.setWindowTitle(tr("End-to-end encryption mnemonic")); ui.label->setText( tr("To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. " "Please note these down and keep them safe. " @@ -1000,24 +1030,49 @@ void AccountSettings::displayMnemonic(const QString &mnemonic) widget.exec(); } +void AccountSettings::disableEncryptionForAccount(const AccountPtr &account) const +{ + QMessageBox dialog; + dialog.setWindowTitle(tr("Disable end-to-end encryption")); + dialog.setText(tr("Disable end-to-end encryption for %1?").arg(account->davUser())); + dialog.setInformativeText(tr("Removing end-to-end encryption will remove locally-synced files that are encrypted." + "
" + "Encrypted files will remain on the server.")); + dialog.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + dialog.setDefaultButton(QMessageBox::Ok); + dialog.adjustSize(); + + const auto ret = dialog.exec(); + switch(ret) { + case QMessageBox::Ok: + connect(account->e2e(), &ClientSideEncryption::sensitiveDataForgotten, + this, &AccountSettings::resetE2eEncryption); + account->e2e()->forgetSensitiveData(account); + break; + case QMessageBox::Cancel: + break; + Q_UNREACHABLE(); + } +} + void AccountSettings::showConnectionLabel(const QString &message, QStringList errors) { - const QString errStyle = QLatin1String("color:#ffffff; background-color:#bb4d4d;padding:5px;" - "border-width: 1px; border-style: solid; border-color: #aaaaaa;" - "border-radius:5px;"); + const auto errStyle = QLatin1String("color:#ffffff; background-color:#bb4d4d;padding:5px;" + "border-width: 1px; border-style: solid; border-color: #aaaaaa;" + "border-radius:5px;"); if (errors.isEmpty()) { - QString msg = message; + auto msg = message; Theme::replaceLinkColorStringBackgroundAware(msg); _ui->connectLabel->setText(msg); - _ui->connectLabel->setToolTip(QString()); - _ui->connectLabel->setStyleSheet(QString()); + _ui->connectLabel->setToolTip({}); + _ui->connectLabel->setStyleSheet({}); } else { errors.prepend(message); - QString msg = errors.join(QLatin1String("\n")); + auto msg = errors.join(QLatin1String("\n")); qCDebug(lcAccountSettings) << msg; Theme::replaceLinkColorString(msg, QColor("#c1c8e6")); _ui->connectLabel->setText(msg); - _ui->connectLabel->setToolTip(QString()); + _ui->connectLabel->setToolTip({}); _ui->connectLabel->setStyleSheet(errStyle); } _ui->accountStatus->setVisible(!message.isEmpty()); @@ -1025,24 +1080,24 @@ void AccountSettings::showConnectionLabel(const QString &message, QStringList er void AccountSettings::slotEnableCurrentFolder(bool terminate) { - auto alias = selectedFolderAlias(); + const auto alias = selectedFolderAlias(); if (!alias.isEmpty()) { - FolderMan *folderMan = FolderMan::instance(); + const auto folderMan = FolderMan::instance(); qCInfo(lcAccountSettings) << "Application: enable folder with alias " << alias; - bool currentlyPaused = false; + auto currentlyPaused = false; // this sets the folder status to disabled but does not interrupt it. - Folder *f = folderMan->folder(alias); - if (!f) { + const auto folder = folderMan->folder(alias); + if (!folder) { return; } - currentlyPaused = f->syncPaused(); + currentlyPaused = folder->syncPaused(); if (!currentlyPaused && !terminate) { // check if a sync is still running and if so, ask if we should terminate. - if (f->isBusy()) { // its still running - auto msgbox = new QMessageBox(QMessageBox::Question, tr("Sync Running"), + if (folder->isBusy()) { // its still running + const auto msgbox = new QMessageBox(QMessageBox::Question, tr("Sync Running"), tr("The syncing operation is running.
Do you want to terminate it?"), QMessageBox::Yes | QMessageBox::No, this); msgbox->setAttribute(Qt::WA_DeleteOnClose); @@ -1057,22 +1112,23 @@ void AccountSettings::slotEnableCurrentFolder(bool terminate) // message box can return at any time while the thread keeps running, // so better check again after the user has responded. - if (f->isBusy() && terminate) { - f->slotTerminateSync(); + if (folder->isBusy() && terminate) { + folder->slotTerminateSync(); } - f->setSyncPaused(!currentlyPaused); + folder->setSyncPaused(!currentlyPaused); // keep state for the icon setting. - if (currentlyPaused) + if (currentlyPaused) { _wasDisabledBefore = true; + } - _model->slotUpdateFolderState(f); + _model->slotUpdateFolderState(folder); } } void AccountSettings::slotScheduleCurrentFolder() { - FolderMan *folderMan = FolderMan::instance(); + const auto folderMan = FolderMan::instance(); if (auto folder = folderMan->folder(selectedFolderAlias())) { folderMan->scheduleFolder(folder); } @@ -1080,7 +1136,7 @@ void AccountSettings::slotScheduleCurrentFolder() void AccountSettings::slotScheduleCurrentFolderForceRemoteDiscovery() { - FolderMan *folderMan = FolderMan::instance(); + const auto folderMan = FolderMan::instance(); if (auto folder = folderMan->folder(selectedFolderAlias())) { folder->slotWipeErrorBlacklist(); folder->journalDb()->forceRemoteDiscoveryNextSync(); @@ -1108,25 +1164,25 @@ void AccountSettings::slotUpdateQuota(qint64 total, qint64 used) _ui->quotaProgressBar->setVisible(true); _ui->quotaProgressBar->setEnabled(true); // workaround the label only accepting ints (which may be only 32 bit wide) - const double percent = used / (double)total * 100; - const int percentInt = qMin(qRound(percent), 100); + const auto percent = used / (double)total * 100; + const auto percentInt = qMin(qRound(percent), 100); _ui->quotaProgressBar->setValue(percentInt); - QString usedStr = Utility::octetsToString(used); - QString totalStr = Utility::octetsToString(total); - QString percentStr = Utility::compactFormatDouble(percent, 1); - QString toolTip = tr("%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.").arg(usedStr, totalStr, percentStr); + const auto usedStr = Utility::octetsToString(used); + const auto totalStr = Utility::octetsToString(total); + const auto percentStr = Utility::compactFormatDouble(percent, 1); + const auto toolTip = tr("%1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits.").arg(usedStr, totalStr, percentStr); _ui->quotaInfoLabel->setText(tr("%1 of %2 in use").arg(usedStr, totalStr)); _ui->quotaInfoLabel->setToolTip(toolTip); _ui->quotaProgressBar->setToolTip(toolTip); } else { _ui->quotaProgressBar->setVisible(false); - _ui->quotaInfoLabel->setToolTip(QString()); + _ui->quotaInfoLabel->setToolTip({}); /* -1 means not computed; -2 means unknown; -3 means unlimited (#owncloud/client/issues/3940)*/ if (total == 0 || total == -1) { _ui->quotaInfoLabel->setText(tr("Currently there is no storage usage information available.")); } else { - QString usedStr = Utility::octetsToString(used); + const auto usedStr = Utility::octetsToString(used); _ui->quotaInfoLabel->setText(tr("%1 in use").arg(usedStr)); } } @@ -1134,23 +1190,23 @@ void AccountSettings::slotUpdateQuota(qint64 total, qint64 used) void AccountSettings::slotAccountStateChanged() { - const AccountState::State state = _accountState ? _accountState->state() : AccountState::Disconnected; + const auto state = _accountState ? _accountState->state() : AccountState::Disconnected; if (state != AccountState::Disconnected) { _ui->sslButton->updateAccountState(_accountState); - AccountPtr account = _accountState->account(); - QUrl safeUrl(account->url()); - safeUrl.setPassword(QString()); // Remove the password from the URL to avoid showing it in the UI + const auto account = _accountState->account(); + auto safeUrl = account->url(); + safeUrl.setPassword({}); // Remove the password from the URL to avoid showing it in the UI const auto folders = FolderMan::instance()->map().values(); - for (Folder *folder : folders) { + for (const auto folder : folders) { _model->slotUpdateFolderState(folder); } - const QString server = QString::fromLatin1("%2") - .arg(Utility::escape(account->url().toString()), - Utility::escape(safeUrl.toString())); - QString serverWithUser = server; - if (AbstractCredentials *cred = account->credentials()) { - QString user = account->davDisplayName(); + const auto server = QString::fromLatin1("%2") + .arg(Utility::escape(account->url().toString()), + Utility::escape(safeUrl.toString())); + auto serverWithUser = server; + if (const auto cred = account->credentials()) { + auto user = account->davDisplayName(); if (user.isEmpty()) { user = cred->user(); } @@ -1177,7 +1233,7 @@ void AccountSettings::slotAccountStateChanged() break; case AccountState::AskingCredentials: { QUrl url; - if (auto cred = qobject_cast(account->credentials())) { + if (const auto cred = qobject_cast(account->credentials())) { connect(cred, &HttpCredentialsGui::authorisationLinkChanged, this, &AccountSettings::slotAccountStateChanged, Qt::UniqueConnection); url = cred->authorisationLink(); @@ -1217,10 +1273,10 @@ void AccountSettings::slotAccountStateChanged() if (state != AccountState::Connected) { /* check if there are expanded root items, if so, close them */ - int i = 0; - for (i = 0; i < _model->rowCount(); ++i) { - if (_ui->_folderList->isExpanded(_model->index(i))) + for (auto i = 0; i < _model->rowCount(); ++i) { + if (_ui->_folderList->isExpanded(_model->index(i))) { _ui->_folderList->setExpanded(_model->index(i), false); + } } } else if (_model->isDirty()) { // If we connect and have pending changes, show the list. @@ -1232,16 +1288,21 @@ void AccountSettings::slotAccountStateChanged() refreshSelectiveSyncStatus(); if (state == AccountState::State::Connected) { - /* TODO: We should probably do something better here. - * Verify if the user has a private key already uploaded to the server, - * if it has, do not offer to create one. - */ - qCInfo(lcAccountSettings) << "Account" << accountsState()->account()->displayName() - << "Client Side Encryption" << accountsState()->account()->capabilities().clientSideEncryptionAvailable(); - - if (_accountState->account()->capabilities().clientSideEncryptionAvailable()) { - _ui->encryptionMessage->show(); - } + checkClientSideEncryptionState(); + } +} + +void AccountSettings::checkClientSideEncryptionState() +{ + /* TODO: We should probably do something better here. + * Verify if the user has a private key already uploaded to the server, + * if it has, do not offer to create one. + */ + qCInfo(lcAccountSettings) << "Account" << accountsState()->account()->displayName() + << "Client Side Encryption" << accountsState()->account()->capabilities().clientSideEncryptionAvailable(); + + if (_accountState->account()->capabilities().clientSideEncryptionAvailable()) { + _ui->encryptionMessage->show(); } } @@ -1249,21 +1310,22 @@ void AccountSettings::slotLinkActivated(const QString &link) { // Parse folder alias and filename from the link, calculate the index // and select it if it exists. - const QStringList li = link.split(QLatin1String("?folder=")); + const auto li = link.split(QLatin1String("?folder=")); if (li.count() > 1) { - QString myFolder = li[0]; - const QString alias = li[1]; - if (myFolder.endsWith(QLatin1Char('/'))) + auto myFolder = li[0]; + const auto alias = li[1]; + if (myFolder.endsWith(QLatin1Char('/'))) { myFolder.chop(1); + } // Make sure the folder itself is expanded - Folder *f = FolderMan::instance()->folder(alias); - QModelIndex folderIndx = _model->indexForPath(f, QString()); + const auto folder = FolderMan::instance()->folder(alias); + const auto folderIndx = _model->indexForPath(folder, {}); if (!_ui->_folderList->isExpanded(folderIndx)) { _ui->_folderList->setExpanded(folderIndx, true); } - QModelIndex indx = _model->indexForPath(f, myFolder); + const auto indx = _model->indexForPath(folder, myFolder); if (indx.isValid()) { // make sure all the parents are expanded for (auto i = indx.parent(); i.isValid(); i = i.parent()) { @@ -1307,7 +1369,7 @@ void AccountSettings::slotSelectiveSyncChanged(const QModelIndex &topLeft, return; } - const bool showWarning = _model->isDirty() && _accountState->isConnected() && info->_checked == Qt::Unchecked; + const auto showWarning = _model->isDirty() && _accountState->isConnected() && info->_checked == Qt::Unchecked; // FIXME: the model is not precise enough to handle extra cases // e.g. the user clicked on the same checkbox 2x without applying the change in between. @@ -1316,8 +1378,8 @@ void AccountSettings::slotSelectiveSyncChanged(const QModelIndex &topLeft, _ui->selectiveSyncLabel->show(); } - const bool shouldBeVisible = _model->isDirty(); - const bool wasVisible = _ui->selectiveSyncStatus->isVisible(); + const auto shouldBeVisible = _model->isDirty(); + const auto wasVisible = _ui->selectiveSyncStatus->isVisible(); if (shouldBeVisible) { _ui->selectiveSyncStatus->setVisible(true); } @@ -1344,18 +1406,82 @@ void AccountSettings::slotSelectiveSyncChanged(const QModelIndex &topLeft, } } +void AccountSettings::slotPossiblyUnblacklistE2EeFoldersAndRestartSync() +{ + if (_accountState->account()->e2e()->_mnemonic.isEmpty()) { + return; + } + + disconnect(_accountState->account()->e2e(), &ClientSideEncryption::initializationFinished, this, &AccountSettings::slotPossiblyUnblacklistE2EeFoldersAndRestartSync); + + for (const auto folder : FolderMan::instance()->map()) { + if (folder->accountState() != _accountState) { + continue; + } + bool ok = false; + const auto foldersToRemoveFromBlacklist = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok); + if (foldersToRemoveFromBlacklist.isEmpty()) { + continue; + } + auto blackList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok); + const auto blackListSize = blackList.size(); + if (blackListSize == 0) { + continue; + } + for (const auto &pathToRemoveFromBlackList : foldersToRemoveFromBlacklist) { + blackList.removeAll(pathToRemoveFromBlackList); + } + if (blackList.size() != blackListSize) { + if (folder->isSyncRunning()) { + folderTerminateSyncAndUpdateBlackList(blackList, folder, foldersToRemoveFromBlacklist); + return; + } + updateBlackListAndScheduleFolderSync(blackList, folder, foldersToRemoveFromBlacklist); + } + } +} + +void AccountSettings::updateBlackListAndScheduleFolderSync(const QStringList &blackList, OCC::Folder *folder, const QStringList &foldersToRemoveFromBlacklist) const +{ + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList); + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {}); + for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) { + folder->journalDb()->schedulePathForRemoteDiscovery(pathToRemoteDiscover); + } + FolderMan::instance()->scheduleFolder(folder); +} + +void AccountSettings::folderTerminateSyncAndUpdateBlackList(const QStringList &blackList, OCC::Folder *folder, const QStringList &foldersToRemoveFromBlacklist) +{ + if (_folderConnections.contains(folder->alias())) { + qCWarning(lcAccountSettings) << "Folder " << folder->alias() << "is already terminating the sync."; + return; + } + // in case sync is already running - terminate it and start a new one + const QMetaObject::Connection syncTerminatedConnection = connect(folder, &Folder::syncFinished, this, [this, blackList, folder, foldersToRemoveFromBlacklist]() { + const auto foundConnectionIt = _folderConnections.find(folder->alias()); + if (foundConnectionIt != _folderConnections.end()) { + disconnect(*foundConnectionIt); + _folderConnections.erase(foundConnectionIt); + } + updateBlackListAndScheduleFolderSync(blackList, folder, foldersToRemoveFromBlacklist); + }); + _folderConnections.insert(folder->alias(), syncTerminatedConnection); + folder->slotTerminateSync(); +} + void AccountSettings::refreshSelectiveSyncStatus() { QString msg; - int cnt = 0; + auto cnt = 0; const auto folders = FolderMan::instance()->map().values(); _ui->bigFolderUi->setVisible(false); - for (Folder *folder : folders) { + for (const auto folder : folders) { if (folder->accountState() != _accountState) { continue; } - bool ok = false; + auto ok = false; const auto undecidedList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok); for (const auto &it : undecidedList) { // FIXME: add the folder alias in a hoover hint. @@ -1363,11 +1489,11 @@ void AccountSettings::refreshSelectiveSyncStatus() if (cnt++) { msg += QLatin1String(", "); } - QString myFolder = (it); + auto myFolder = (it); if (myFolder.endsWith('/')) { myFolder.chop(1); } - QModelIndex theIndx = _model->indexForPath(folder, myFolder); + const auto theIndx = _model->indexForPath(folder, myFolder); if (theIndx.isValid()) { msg += QString::fromLatin1("%1") .arg(Utility::escape(myFolder), Utility::escape(folder->alias())); @@ -1379,11 +1505,11 @@ void AccountSettings::refreshSelectiveSyncStatus() if (!msg.isEmpty()) { ConfigFile cfg; - QString info = !cfg.confirmExternalStorage() - ? tr("There are folders that were not synchronized because they are too big: ") - : !cfg.newBigFolderSizeLimit().first - ? tr("There are folders that were not synchronized because they are external storages: ") - : tr("There are folders that were not synchronized because they are too big or external storages: "); + const auto info = !cfg.confirmExternalStorage() ? + tr("There are folders that were not synchronized because they are too big: ") : + !cfg.newBigFolderSizeLimit().first ? + tr("There are folders that were not synchronized because they are external storages: ") : + tr("There are folders that were not synchronized because they are too big or external storages: "); _ui->selectiveSyncNotification->setText(info + msg); _ui->bigFolderUi->setVisible(true); @@ -1394,14 +1520,14 @@ void AccountSettings::slotDeleteAccount() { // Deleting the account potentially deletes 'this', so // the QMessageBox should be destroyed before that happens. - auto messageBox = new QMessageBox(QMessageBox::Question, - tr("Confirm Account Removal"), - tr("

Do you really want to remove the connection to the account %1?

" - "

Note: This will not delete any files.

") - .arg(_accountState->account()->displayName()), - QMessageBox::NoButton, - this); - auto yesButton = messageBox->addButton(tr("Remove connection"), QMessageBox::YesRole); + const auto messageBox = new QMessageBox(QMessageBox::Question, + tr("Confirm Account Removal"), + tr("

Do you really want to remove the connection to the account %1?

" + "

Note: This will not delete any files.

") + .arg(_accountState->account()->displayName()), + QMessageBox::NoButton, + this); + const auto yesButton = messageBox->addButton(tr("Remove connection"), QMessageBox::YesRole); messageBox->addButton(tr("Cancel"), QMessageBox::NoRole); messageBox->setAttribute(Qt::WA_DeleteOnClose); connect(messageBox, &QMessageBox::finished, this, [this, messageBox, yesButton]{ @@ -1409,7 +1535,7 @@ void AccountSettings::slotDeleteAccount() // Else it might access during destruction. This should be better handled by it having a QSharedPointer _model->setAccountState(nullptr); - auto manager = AccountManager::instance(); + const auto manager = AccountManager::instance(); manager->deleteAccount(_accountState); manager->save(); } @@ -1442,24 +1568,56 @@ void AccountSettings::slotStyleChanged() void AccountSettings::customizeStyle() { - QString msg = _ui->connectLabel->text(); + auto msg = _ui->connectLabel->text(); Theme::replaceLinkColorStringBackgroundAware(msg); _ui->connectLabel->setText(msg); - QColor color = palette().highlight().color(); + const auto color = palette().highlight().color(); _ui->quotaProgressBar->setStyleSheet(QString::fromLatin1(progressBarStyleC).arg(color.name())); } void AccountSettings::initializeE2eEncryption() { + connect(_accountState->account()->e2e(), &ClientSideEncryption::initializationFinished, this, &AccountSettings::slotPossiblyUnblacklistE2EeFoldersAndRestartSync); + if (!_accountState->account()->e2e()->_mnemonic.isEmpty()) { slotE2eEncryptionMnemonicReady(); } else { - _ui->encryptionMessage->setText(tr("This account supports End-to-End encryption")); + _ui->encryptionMessage->setMessageType(KMessageWidget::Information); + _ui->encryptionMessage->setText(tr("This account supports end-to-end encryption")); + _ui->encryptionMessage->setIcon(Theme::createColorAwareIcon(QStringLiteral(":/client/theme/black/state-info.svg"))); _ui->encryptionMessage->hide(); - auto *const actionEnableE2e = addActionToEncryptionMessage(tr("Enable encryption"), e2EeUiActionEnableEncryptionId); + auto *const actionEnableE2e = addActionToEncryptionMessage(tr("Set up encryption"), e2EeUiActionEnableEncryptionId); connect(actionEnableE2e, &QAction::triggered, this, &AccountSettings::slotE2eEncryptionGenerateKeys); + + connect(_accountState->account()->e2e(), &ClientSideEncryption::initializationFinished, this, [this] { + if (!_accountState->account()->e2e()->_publicKey.isNull()) { + _ui->encryptionMessage->setText(tr("End-to-end encryption has been enabled on this account with another device." + "
" + "It can be enabled on this device by entering your mnemonic." + "
" + "This will enable synchronisation of existing encrypted folders.")); + } + }); + _accountState->account()->setE2eEncryptionKeysGenerationAllowed(false); + _accountState->account()->e2e()->initialize(_accountState->account()); + } +} + +void AccountSettings::resetE2eEncryption() +{ + for (const auto action : _ui->encryptionMessage->actions()) { + _ui->encryptionMessage->removeAction(action); + } + _ui->encryptionMessage->setText({}); + _ui->encryptionMessage->setIcon({}); + initializeE2eEncryption(); + checkClientSideEncryptionState(); + + const auto account = _accountState->account(); + if (account->e2e()->_mnemonic.isEmpty()) { + FolderMan::instance()->removeE2eFiles(account); } } @@ -1476,7 +1634,8 @@ void AccountSettings::removeActionFromEncryptionMessage(const QString &actionId) QAction *AccountSettings::addActionToEncryptionMessage(const QString &actionTitle, const QString &actionId) { - for (const auto &action : _ui->encryptionMessage->actions()) { + const auto encryptionActions = _ui->encryptionMessage->actions(); + for (const auto &action : encryptionActions) { if (action->property(e2eUiActionIdKey) == actionId) { return action; } diff --git a/src/gui/accountsettings.h b/src/gui/accountsettings.h index f80740392..f3384ef76 100644 --- a/src/gui/accountsettings.h +++ b/src/gui/accountsettings.h @@ -56,15 +56,15 @@ class AccountSettings : public QWidget public: explicit AccountSettings(AccountState *accountState, QWidget *parent = nullptr); ~AccountSettings() override; - QSize sizeHint() const override { return ownCloudGui::settingsDialogSize(); } + [[nodiscard]] QSize sizeHint() const override { return ownCloudGui::settingsDialogSize(); } bool canEncryptOrDecrypt(const FolderStatusModel::SubFolderInfo* folderInfo); signals: void folderChanged(); void openFolderAlias(const QString &); - void showIssuesList(AccountState *account); + void showIssuesList(OCC::AccountState *account); void requestMnemonic(); - void removeAccountFolders(AccountState *account); + void removeAccountFolders(OCC::AccountState *account); void styleChanged(); public slots: @@ -72,7 +72,7 @@ public slots: void slotUpdateQuota(qint64 total, qint64 used); void slotAccountStateChanged(); void slotStyleChanged(); - AccountState *accountsState() { return _accountState; } + OCC::AccountState *accountsState() { return _accountState; } void slotHideSelectiveSyncWidget(); protected slots: @@ -89,14 +89,14 @@ protected slots: void slotEditCurrentLocalIgnoredFiles(); void slotEnableVfsCurrentFolder(); void slotDisableVfsCurrentFolder(); - void slotSetCurrentFolderAvailability(PinState state); - void slotSetSubFolderAvailability(Folder *folder, const QString &path, PinState state); + void slotSetCurrentFolderAvailability(OCC::PinState state); + void slotSetSubFolderAvailability(OCC::Folder *folder, const QString &path, OCC::PinState state); void slotFolderWizardAccepted(); void slotFolderWizardRejected(); void slotDeleteAccount(); void slotToggleSignInState(); void refreshSelectiveSyncStatus(); - void slotMarkSubfolderEncrypted(FolderStatusModel::SubFolderInfo *folderInfo); + void slotMarkSubfolderEncrypted(OCC::FolderStatusModel::SubFolderInfo *folderInfo); void slotSubfolderContextMenuRequested(const QModelIndex& idx, const QPoint& point); void slotCustomContextMenuRequested(const QPoint &); void slotFolderListClicked(const QModelIndex &indx); @@ -111,22 +111,30 @@ protected slots: void slotSelectiveSyncChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles); + void slotPossiblyUnblacklistE2EeFoldersAndRestartSync(); -private: +private slots: + void updateBlackListAndScheduleFolderSync(const QStringList &blackList, OCC::Folder *folder, const QStringList &foldersToRemoveFromBlacklist) const; + void folderTerminateSyncAndUpdateBlackList(const QStringList &blackList, OCC::Folder *folder, const QStringList &foldersToRemoveFromBlacklist); + +private slots: void displayMnemonic(const QString &mnemonic); - void showConnectionLabel(const QString &message, - QStringList errors = QStringList()); - bool event(QEvent *) override; - void createAccountToolbox(); + void disableEncryptionForAccount(const AccountPtr &account) const; + void showConnectionLabel(const QString &message, QStringList errors = QStringList()); void openIgnoredFilesDialog(const QString & absFolderPath); void customizeStyle(); void initializeE2eEncryption(); + void resetE2eEncryption(); + void checkClientSideEncryptionState(); void removeActionFromEncryptionMessage(const QString &actionId); + +private: + bool event(QEvent *) override; QAction *addActionToEncryptionMessage(const QString &actionTitle, const QString &actionId); /// Returns the alias of the selected folder, empty string if none - QString selectedFolderAlias() const; + [[nodiscard]] QString selectedFolderAlias() const; Ui::AccountSettings *_ui; @@ -139,6 +147,8 @@ private: QAction *_addAccountAction; bool _menuShown; + + QHash _folderConnections; }; } // namespace OCC diff --git a/src/gui/accountsetupcommandlinemanager.cpp b/src/gui/accountsetupcommandlinemanager.cpp new file mode 100644 index 000000000..a604cb53b --- /dev/null +++ b/src/gui/accountsetupcommandlinemanager.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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 "accountsetupcommandlinemanager.h" +#include "accountsetupfromcommandlinejob.h" + +namespace OCC +{ +Q_LOGGING_CATEGORY(lcAccountSetupCommandLineManager, "nextcloud.gui.accountsetupcommandlinemanager", QtInfoMsg) + +AccountSetupCommandLineManager *AccountSetupCommandLineManager::_instance = nullptr; + +AccountSetupCommandLineManager::AccountSetupCommandLineManager(QObject *parent) + : QObject{parent} +{ +} + +AccountSetupCommandLineManager *AccountSetupCommandLineManager::instance() +{ + if (!_instance) { + _instance = new AccountSetupCommandLineManager(); + } + return _instance; +} + +void AccountSetupCommandLineManager::destroy() +{ + if (_instance) { + _instance->deleteLater(); + _instance = nullptr; + } +} + +bool AccountSetupCommandLineManager::parseCommandlineOption(const QString &option, QStringListIterator &optionsIterator, QString &errorMessage) +{ + if (option == QStringLiteral("--apppassword")) { + if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) { + _appPassword = optionsIterator.next(); + return true; + } else { + errorMessage = QStringLiteral("apppassword not specified"); + } + } else if (option == QStringLiteral("--localdirpath")) { + if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) { + _localDirPath = optionsIterator.next(); + return true; + } else { + errorMessage = QStringLiteral("basedir not specified"); + } + } else if (option == QStringLiteral("--remotedirpath")) { + if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) { + _remoteDirPath = optionsIterator.next(); + return true; + } else { + errorMessage = QStringLiteral("remotedir not specified"); + } + } else if (option == QStringLiteral("--serverurl")) { + if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) { + _serverUrl = optionsIterator.next(); + return true; + } else { + errorMessage = QStringLiteral("serverurl not specified"); + } + } else if (option == QStringLiteral("--userid")) { + if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) { + _userId = optionsIterator.next(); + return true; + } else { + errorMessage = QStringLiteral("userid not specified"); + } + } else if (option == QLatin1String("--isvfsenabled")) { + if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) { + _isVfsEnabled = optionsIterator.next().toInt() != 0; + return true; + } else { + errorMessage = QStringLiteral("isvfsenabled not specified"); + } + } + return false; +} + +bool AccountSetupCommandLineManager::isCommandLineParsed() const +{ + return !_appPassword.isEmpty() && !_userId.isEmpty() && _serverUrl.isValid(); +} + +void AccountSetupCommandLineManager::setupAccountFromCommandLine() +{ + if (isCommandLineParsed()) { + qCInfo(lcAccountSetupCommandLineManager) << QStringLiteral("Command line has been parsed and account setup parameters have been found. Attempting setup a new account %1...").arg(_userId); + const auto accountSetupJob = new AccountSetupFromCommandLineJob(_appPassword, _userId, _serverUrl, _localDirPath, _isVfsEnabled, _remoteDirPath, parent()); + accountSetupJob->handleAccountSetupFromCommandLine(); + } else { + qCInfo(lcAccountSetupCommandLineManager) << QStringLiteral("No account setup parameters have been found, or they are invalid. Proceed with normal startup..."); + } + _appPassword.clear(); + _userId.clear(); + _serverUrl.clear(); + _remoteDirPath.clear(); + _localDirPath.clear(); + _isVfsEnabled = true; +} +} diff --git a/src/gui/accountsetupcommandlinemanager.h b/src/gui/accountsetupcommandlinemanager.h new file mode 100644 index 000000000..585627e85 --- /dev/null +++ b/src/gui/accountsetupcommandlinemanager.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include +#include +#include + +namespace OCC { +class AccountSetupCommandLineManager : public QObject +{ + Q_OBJECT + +public: + [[nodiscard]] static AccountSetupCommandLineManager *instance(); + static void destroy(); + + [[nodiscard]] bool parseCommandlineOption(const QString &option, QStringListIterator &optionsIterator, QString &errorMessage); + + [[nodiscard]] bool isCommandLineParsed() const; + +public slots: + void setupAccountFromCommandLine(); + +private: + explicit AccountSetupCommandLineManager(QObject *parent = nullptr); + + static AccountSetupCommandLineManager *_instance; + + QString _appPassword; + QString _userId; + QUrl _serverUrl; + QString _remoteDirPath; + QString _localDirPath; + bool _isVfsEnabled; +}; + +} diff --git a/src/gui/accountsetupfromcommandlinejob.cpp b/src/gui/accountsetupfromcommandlinejob.cpp new file mode 100644 index 000000000..eeff0cfb0 --- /dev/null +++ b/src/gui/accountsetupfromcommandlinejob.cpp @@ -0,0 +1,238 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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 "accountsetupfromcommandlinejob.h" + +#include "accountmanager.h" +#include "accountstate.h" +#include "creds/webflowcredentials.h" +#include "filesystem.h" +#include "folder.h" +#include "folderman.h" +#include "networkjobs.h" + +#include +#include +#include +#include + +namespace OCC +{ +Q_LOGGING_CATEGORY(lcAccountSetupCommandLineJob, "nextcloud.gui.accountsetupcommandlinejob", QtInfoMsg) + +AccountSetupFromCommandLineJob::AccountSetupFromCommandLineJob(QString appPassword, + QString userId, + QUrl serverUrl, + QString localDirPath, + bool isVfsEnabled, + QString remoteDirPath, + QObject *parent) + : QObject(parent) + , _appPassword(appPassword) + , _userId(userId) + , _serverUrl(serverUrl) + , _localDirPath(localDirPath) + , _isVfsEnabled(isVfsEnabled) + , _remoteDirPath(remoteDirPath) +{ +} + +void AccountSetupFromCommandLineJob::handleAccountSetupFromCommandLine() +{ + if (AccountManager::instance()->accountFromUserId(QStringLiteral("%1@%2").arg(_userId).arg(_serverUrl.host()))) { + printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 already exists!").arg(QDir::toNativeSeparators(_userId)), true); + return; + } + + if (!_localDirPath.isEmpty()) { + QDir dir(_localDirPath); + if (dir.exists() && !dir.isEmpty()) { + printAccountSetupFromCommandLineStatusAndExit( + QStringLiteral("Local folder %1 already exists and is non-empty!").arg(QDir::toNativeSeparators(_localDirPath)), + true); + return; + } + + qCInfo(lcAccountSetupCommandLineJob) << "Creating folder" << _localDirPath; + if (!dir.exists() && !dir.mkpath(".")) { + printAccountSetupFromCommandLineStatusAndExit( + QStringLiteral("Folder creation failed. Could not create local folder %1").arg(QDir::toNativeSeparators(_localDirPath)), + true); + return; + } + + FileSystem::setFolderMinimumPermissions(_localDirPath); + Utility::setupFavLink(_localDirPath); + } + + const auto credentials = new WebFlowCredentials(_userId, _appPassword); + _account = AccountManager::createAccount(); + _account->setCredentials(credentials); + _account->setUrl(_serverUrl); + + fetchUserName(); +} + +void AccountSetupFromCommandLineJob::checkLastModifiedWithPropfind() +{ + const auto job = new PropfindJob(_account, "/", this); + job->setIgnoreCredentialFailure(true); + // There is custom redirect handling in the error handler, + // so don't automatically follow redirects. + job->setFollowRedirects(false); + job->setProperties(QList() << QByteArrayLiteral("getlastmodified")); + connect(job, &PropfindJob::result, this, &AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleSuccess); + connect(job, &PropfindJob::finishedWithError, this, &AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleFailure); + job->start(); +} + +void AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleSuccess() +{ + const auto accountManager = AccountManager::instance(); + const auto accountState = accountManager->addAccount(_account); + accountManager->save(); + + if (!_localDirPath.isEmpty()) { + setupLocalSyncFolder(accountState); + } else { + qCInfo(lcAccountSetupCommandLineJob) << QStringLiteral("Set up a new account without a folder."); + printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 setup from command line success.").arg(_account->displayName()), false); + } +} + +void AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleFailure() +{ + const auto job = qobject_cast(sender()); + if (!job) { + printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Cannot check for authed redirects. This slot should be invoked from PropfindJob!"), true); + return; + } + const auto reply = job->reply(); + + QString errorMsg; + + // If there were redirects on the *authed* requests, also store + // the updated server URL, similar to redirects on status.php. + QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); + if (!redirectUrl.isEmpty()) { + qCInfo(lcAccountSetupCommandLineJob) << "Authed request was redirected to" << redirectUrl.toString(); + + // strip the expected path + auto path = redirectUrl.path(); + static QString expectedPath = "/" + _account->davPath(); + if (path.endsWith(expectedPath)) { + path.chop(expectedPath.size()); + redirectUrl.setPath(path); + + qCInfo(lcAccountSetupCommandLineJob) << "Setting account url to" << redirectUrl.toString(); + _account->setUrl(redirectUrl); + checkLastModifiedWithPropfind(); + } + errorMsg = tr("The authenticated request to the server was redirected to " + "\"%1\". The URL is bad, the server is misconfigured.") + .arg(Utility::escape(redirectUrl.toString())); + + // A 404 is actually a success: we were authorized to know that the folder does + // not exist. It will be created later... + } else if (reply->error() == QNetworkReply::ContentNotFoundError) { + accountSetupFromCommandLinePropfindHandleSuccess(); + } else if (reply->error() != QNetworkReply::NoError) { + if (!_account->credentials()->stillValid(reply)) { + errorMsg = tr("Access forbidden by server. To verify that you have proper access, " + "click here to access the service with your browser.") + .arg(Utility::escape(_account->url().toString())); + } else { + errorMsg = job->errorStringParsingBody(); + } + // Something else went wrong, maybe the response was 200 but with invalid data. + } else { + errorMsg = tr("There was an invalid response to an authenticated WebDAV request"); + } + printAccountSetupFromCommandLineStatusAndExit( + QStringLiteral("Account %1 setup from command line failed with error: %2.").arg(_account->displayName()).arg(errorMsg), + true); +} + +void AccountSetupFromCommandLineJob::setupLocalSyncFolder(AccountState *accountState) +{ + FolderDefinition definition; + definition.localPath = _localDirPath; + definition.targetPath = FolderDefinition::prepareTargetPath(!_remoteDirPath.isEmpty() ? _remoteDirPath : QStringLiteral("/")); + definition.virtualFilesMode = _isVfsEnabled ? bestAvailableVfsMode() : Vfs::Off; + + const auto folderMan = FolderMan::instance(); + + definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles(); + definition.alias = folderMan->map().size() > 0 ? QString::number(folderMan->map().size()) : QString::number(0); + + if (folderMan->navigationPaneHelper().showInExplorerNavigationPane()) { + definition.navigationPaneClsid = QUuid::createUuid(); + } + + folderMan->setSyncEnabled(false); + + if (const auto folder = folderMan->addFolder(accountState, definition)) { + if (definition.virtualFilesMode != Vfs::Off) { + folder->setRootPinState(PinState::OnlineOnly); + } + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList() << QLatin1String("/")); + qCInfo(lcAccountSetupCommandLineJob) << QStringLiteral("Folder %1 setup from command line success.").arg(definition.localPath); + printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 setup from command line success.").arg(_account->displayName()), false); + } else { + AccountManager::instance()->deleteAccount(accountState); + printAccountSetupFromCommandLineStatusAndExit( + QStringLiteral("Account %1 setup from command line failed, due to folder creation failure.").arg(_account->displayName()), + false); + } +} + +void AccountSetupFromCommandLineJob::printAccountSetupFromCommandLineStatusAndExit(const QString &status, bool isFailure) +{ + if (isFailure) { + qCWarning(lcAccountSetupCommandLineJob) << status; + } else { + qCInfo(lcAccountSetupCommandLineJob) << status; + } + QTimer::singleShot(0, this, [this, isFailure]() { + this->deleteLater(); + if (!isFailure) { + qApp->quit(); + } else { + qApp->exit(1); + } + }); +} + +void AccountSetupFromCommandLineJob::fetchUserName() +{ + const auto fetchUserNameJob = new JsonApiJob(_account, QStringLiteral("/ocs/v1.php/cloud/user")); + connect(fetchUserNameJob, &JsonApiJob::jsonReceived, this, [this](const QJsonDocument &json, int statusCode) { + sender()->deleteLater(); + + if (statusCode != 100) { + printAccountSetupFromCommandLineStatusAndExit("Could not fetch username.", true); + return; + } + + const auto objData = json.object().value("ocs").toObject().value("data").toObject(); + const auto userId = objData.value("id").toString(""); + const auto displayName = objData.value("display-name").toString(""); + _account->setDavUser(userId); + _account->setDavDisplayName(displayName); + + checkLastModifiedWithPropfind(); + }); + fetchUserNameJob->start(); +} +} diff --git a/src/gui/accountsetupfromcommandlinejob.h b/src/gui/accountsetupfromcommandlinejob.h new file mode 100644 index 000000000..8485c72a1 --- /dev/null +++ b/src/gui/accountsetupfromcommandlinejob.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include "account.h" + +#include +#include +#include + +namespace OCC +{ +class AccountState; + +class AccountSetupFromCommandLineJob : public QObject +{ + Q_OBJECT + +public: + AccountSetupFromCommandLineJob(QString appPassword, + QString userId, + QUrl serverUrl, + QString localDirPath = {}, + bool nonVfsMode = false, + QString remoteDirPath = QStringLiteral("/"), + QObject *parent = nullptr); + +public slots: + void handleAccountSetupFromCommandLine(); + +private slots: + void checkLastModifiedWithPropfind(); + + void accountSetupFromCommandLinePropfindHandleSuccess(); + + void accountSetupFromCommandLinePropfindHandleFailure(); + + void setupLocalSyncFolder(AccountState *accountState); + + void printAccountSetupFromCommandLineStatusAndExit(const QString &status, bool isFailure); + + void fetchUserName(); + +private: + QString _appPassword; + QString _userId; + QUrl _serverUrl; + QString _localDirPath; + bool _isVfsEnabled = true; + QString _remoteDirPath; + + AccountPtr _account; +}; +} diff --git a/src/gui/accountstate.h b/src/gui/accountstate.h index 2e47fcf6e..2f46f9a86 100644 --- a/src/gui/accountstate.h +++ b/src/gui/accountstate.h @@ -27,6 +27,7 @@ #include class QSettings; +class FakeAccountState; namespace OCC { @@ -182,10 +183,10 @@ public: public slots: /// Triggers a ping to the server to update state and /// connection status and errors. - void checkConnectivity(); + virtual void checkConnectivity(); private: - void setState(State state); + virtual void setState(State state); void fetchNavigationApps(); int retryCount() const; @@ -193,21 +194,21 @@ private: void resetRetryCount(); signals: - void stateChanged(State state); + void stateChanged(OCC::AccountState::State state); void isConnectedChanged(); void hasFetchedNavigationApps(); void statusChanged(); void desktopNotificationsAllowedChanged(); protected Q_SLOTS: - void slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList &errors); + void slotConnectionValidatorResult(OCC::ConnectionValidator::Status status, const QStringList &errors); /// When client gets a 401 or 403 checks if server requested remote wipe /// before asking for user credentials again void slotHandleRemoteWipeCheck(); - void slotCredentialsFetched(AbstractCredentials *creds); - void slotCredentialsAsked(AbstractCredentials *creds); + void slotCredentialsFetched(OCC::AbstractCredentials *creds); + void slotCredentialsAsked(OCC::AbstractCredentials *creds); void slotNavigationAppsFetched(const QJsonDocument &reply, int statusCode); void slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode); @@ -261,6 +262,9 @@ private: QTimer _checkConnectionTimer; QElapsedTimer _lastCheckConnectionTimer; + explicit AccountState() = default; + + friend class ::FakeAccountState; }; class AccountApp : public QObject @@ -271,10 +275,10 @@ public: const QString &id, const QUrl &iconUrl, QObject* parent = nullptr); - QString name() const; - QUrl url() const; - QString id() const; - QUrl iconUrl() const; + [[nodiscard]] QString name() const; + [[nodiscard]] QUrl url() const; + [[nodiscard]] QString id() const; + [[nodiscard]] QUrl iconUrl() const; private: QString _name; diff --git a/src/gui/application.cpp b/src/gui/application.cpp index 1f2ab6eb6..45a806230 100644 --- a/src/gui/application.cpp +++ b/src/gui/application.cpp @@ -21,6 +21,7 @@ #include "config.h" #include "account.h" +#include "accountsetupcommandlinemanager.h" #include "accountstate.h" #include "editlocallymanager.h" #include "connectionvalidator.h" @@ -32,7 +33,6 @@ #include "sslerrordialog.h" #include "theme.h" #include "clientproxy.h" -#include "sharedialog.h" #include "accountmanager.h" #include "creds/abstractcredentials.h" #include "pushnotifications.h" @@ -63,6 +63,7 @@ #include #include #include +#include class QSocket; @@ -86,7 +87,15 @@ namespace { " --logflush : flush the log file after every write.\n" " --logdebug : also output debug-level messages in the log.\n" " --confdir : Use the given configuration folder.\n" - " --background : launch the application in the background.\n"; + " --background : launch the application in the background.\n" + " --overrideserverurl : specify a server URL to use for the force override to be used in the account setup wizard.\n" + " --overridelocaldir : specify a local dir to be used in the account setup wizard.\n" + " --userid : userId (username as on the server) to pass when creating an account via command-line.\n" + " --apppassword : appPassword to pass when creating an account via command-line.\n" + " --localdirpath : (optional) path where to create a local sync folder when creating an account via command-line.\n" + " --isvfsenabled : whether to set a VFS or non-VFS folder (1 for 'yes' or 0 for 'no') when creating an account via command-line.\n" + " --remotedirpath : (optional) path to a remote subfolder when creating an account via command-line.\n" + " --serverurl : a server URL to use when creating an account via command-line.\n"; QString applicationTrPath() { @@ -133,35 +142,46 @@ bool Application::configVersionMigration() // Did the client version change? // (The client version is adjusted further down) - bool versionChanged = configFile.clientVersionString() != MIRALL_VERSION_STRING; + const auto currentVersion = QVersionNumber::fromString(MIRALL_VERSION_STRING); + const auto previousVersion = QVersionNumber::fromString(configFile.clientVersionString()); + const auto versionChanged = previousVersion != currentVersion; + const auto downgrading = previousVersion > currentVersion; - // 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) + if (!versionChanged && !(!deleteKeys.isEmpty() || (!ignoreKeys.isEmpty() && versionChanged))) { return true; + } - const auto backupFile = configFile.backup(); - - if (warningMessage) { - QString boldMessage; - if (!deleteKeys.isEmpty()) { - boldMessage = tr("Continuing will mean deleting these settings."); - } else { - boldMessage = tr("Continuing will mean ignoring these settings."); + // back up all old config files + QStringList backupFilesList; + QDir configDir(configFile.configPath()); + const auto anyConfigFileNameList = configDir.entryInfoList({"*.cfg"}, QDir::Files); + for (const auto &oldConfig : anyConfigFileNameList) { + const auto oldConfigFileName = oldConfig.fileName(); + const auto oldConfigFilePath = oldConfig.filePath(); + const auto newConfigFileName = configFile.configFile(); + backupFilesList.append(configFile.backup(oldConfigFileName)); + if (oldConfigFilePath != newConfigFileName) { + if (!QFile::rename(oldConfigFilePath, newConfigFileName)) { + qCWarning(lcApplication) << "Failed to rename configuration file from" << oldConfigFilePath << "to" << newConfigFileName; + } } + } + // We want to message the user either for destructive changes, + // or if we're ignoring something and the client version changed. + if (configFile.showConfigBackupWarning() && backupFilesList.count() > 0) { QMessageBox box( QMessageBox::Warning, APPLICATION_SHORTNAME, - tr("Some settings were configured in newer versions of this client and " + tr("Some settings were configured in %1 versions of this client and " "use features that are not available in this version.
" "
" - "%1
" + "Continuing will mean %2 these settings
" "
" - "The current configuration file was already backed up to %2.") - .arg(boldMessage, backupFile)); + "The current configuration file was already backed up to %3.") + .arg((downgrading ? tr("newer", "newer software version") : tr("older", "older software version")), + deleteKeys.isEmpty()? tr("ignoring") : tr("deleting"), + backupFilesList.join("
"))); box.addButton(tr("Quit"), QMessageBox::AcceptRole); auto continueBtn = box.addButton(tr("Continue"), QMessageBox::DestructiveRole); @@ -175,8 +195,9 @@ bool Application::configVersionMigration() settings->endGroup(); // Wipe confusing keys from the future, ignore the others - for (const auto &badKey : deleteKeys) + for (const auto &badKey : qAsConst(deleteKeys)) { settings->remove(badKey); + } } configFile.setClientVersionString(MIRALL_VERSION_STRING); @@ -238,15 +259,23 @@ Application::Application(int &argc, char **argv) #endif QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED - // 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. + QString oldDir = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + + // macOS 10.11.x does not like trailing slash for rename/move. + if (oldDir.endsWith('/')) { + oldDir.chop(1); + } + QT_WARNING_POP setApplicationName(_theme->appName()); if (QFileInfo(oldDir).isDir()) { auto confDir = ConfigFile().configPath(); - if (confDir.endsWith('/')) confDir.chop(1); // macOS 10.11.x does not like trailing slash for rename/move. + + // macOS 10.11.x does not like trailing slash for rename/move. + if (confDir.endsWith('/')) { + confDir.chop(1); + } + qCInfo(lcApplication) << "Migrating old config from" << oldDir << "to" << confDir; if (!QFile::rename(oldDir, confDir)) { @@ -277,16 +306,18 @@ Application::Application(int &argc, char **argv) parseOptions(arguments()); //no need to waste time; - if (_helpOnly || _versionOnly) + if (_helpOnly || _versionOnly) { return; + } if (_quitInstance) { QTimer::singleShot(0, qApp, &QApplication::quit); return; } - if (isRunning()) + if (isRunning()) { return; + } #if defined(WITH_CRASHREPORTER) if (ConfigFile().crashReporter()) { @@ -308,6 +339,19 @@ Application::Application(int &argc, char **argv) } ConfigFile cfg; + + { + // these config values will always be empty after the first client run + if (!_overrideServerUrl.isEmpty()) { + cfg.setOverrideServerUrl(_overrideServerUrl); + } + + if (!_overrideLocalDir.isEmpty()) { + cfg.setOverrideLocalDir(_overrideLocalDir); + } + } + + // The timeout is initialized with an environment variable, if not, override with the value from the config if (!AbstractNetworkJob::httpTimeout) AbstractNetworkJob::httpTimeout = cfg.timeout(); @@ -316,10 +360,12 @@ Application::Application(int &argc, char **argv) if (Theme::instance()->showVirtualFilesOption() && bestAvailableVfsMode() == Vfs::Off) { qCWarning(lcApplication) << "Theme wants to show vfs mode, but no vfs plugins are available"; } - if (isVfsPluginAvailable(Vfs::WindowsCfApi)) + if (isVfsPluginAvailable(Vfs::WindowsCfApi)) { qCInfo(lcApplication) << "VFS windows plugin is available"; - if (isVfsPluginAvailable(Vfs::WithSuffix)) + } + if (isVfsPluginAvailable(Vfs::WithSuffix)) { qCInfo(lcApplication) << "VFS suffix plugin is available"; + } _folderManager.reset(new FolderMan); #ifdef Q_OS_WIN @@ -328,12 +374,12 @@ Application::Application(int &argc, char **argv) connect(this, &SharedTools::QtSingleApplication::messageReceived, this, &Application::slotParseMessage); - if (!AccountManager::instance()->restore()) { + if (!AccountManager::instance()->restore(cfg.overrideServerUrl().isEmpty())) { // If there is an error reading the account settings, try again // after a couple of seconds, if that fails, give up. // (non-existence is not an error) Utility::sleep(5); - if (!AccountManager::instance()->restore()) { + if (!AccountManager::instance()->restore(cfg.overrideServerUrl().isEmpty())) { qCCritical(lcApplication) << "Could not read the account settings, quitting"; QMessageBox::critical( nullptr, @@ -371,7 +417,8 @@ Application::Application(int &argc, char **argv) this, &Application::slotAccountStateAdded); connect(AccountManager::instance(), &AccountManager::accountRemoved, this, &Application::slotAccountStateRemoved); - for (const auto &ai : AccountManager::instance()->accounts()) { + const auto accounts = AccountManager::instance()->accounts(); + for (const auto &ai : accounts) { slotAccountStateAdded(ai.data()); } @@ -379,7 +426,7 @@ Application::Application(int &argc, char **argv) _gui.data(), &ownCloudGui::slotShowShareDialog); connect(FolderMan::instance()->socketApi(), &SocketApi::fileActivityCommandReceived, - Systray::instance(), &Systray::showFileActivityDialog); + _gui.data(), &ownCloudGui::slotShowFileActivityDialog); // startup procedure. connect(&_checkConnectionTimer, &QTimer::timeout, this, &Application::slotCheckConnection); @@ -410,6 +457,11 @@ Application::Application(int &argc, char **argv) _gui->createTray(); handleEditLocallyFromOptions(); + + if (AccountSetupCommandLineManager::instance()->isCommandLineParsed()) { + AccountSetupCommandLineManager::instance()->setupAccountFromCommandLine(); + } + AccountSetupCommandLineManager::destroy(); } Application::~Application() @@ -578,6 +630,11 @@ void Application::slotParseMessage(const QString &msg, QObject *) handleEditLocallyFromOptions(); + if (AccountSetupCommandLineManager::instance()->isCommandLineParsed()) { + AccountSetupCommandLineManager::instance()->setupAccountFromCommandLine(); + } + AccountSetupCommandLineManager::destroy(); + } else if (msg.startsWith(QLatin1String("MSG_SHOWMAINDIALOG"))) { qCInfo(lcApplication) << "Running for" << _startedAt.elapsed() / 1000.0 << "sec"; if (_startedAt.elapsed() < 10 * 1000) { @@ -599,8 +656,11 @@ void Application::parseOptions(const QStringList &options) { QStringListIterator it(options); // skip file name; - if (it.hasNext()) + if (it.hasNext()) { it.next(); + } + + bool shouldExit = false; //parse options; if help or bad option exit while (it.hasNext()) { @@ -662,11 +722,41 @@ void Application::parseOptions(const QStringList &options) qCInfo(lcApplication) << errorParsingLocalFileEditingUrl; showHint(errorParsingLocalFileEditingUrl.toStdString()); } + } else if (option == QStringLiteral("--overrideserverurl")) { + if (it.hasNext() && !it.peekNext().startsWith(QLatin1String("--"))) { + const auto overrideUrl = it.next(); + const auto isUrlValid = (overrideUrl.startsWith(QStringLiteral("http://")) || overrideUrl.startsWith(QStringLiteral("https://"))) + && QUrl::fromUserInput(overrideUrl).isValid(); + if (!isUrlValid) { + showHint("Invalid URL passed to --overrideserverurl"); + shouldExit = true; + } else { + _overrideServerUrl = overrideUrl; + } + } else { + showHint("Invalid URL passed to --overrideserverurl"); + } + } else if (option == QStringLiteral("--overridelocaldir")) { + if (it.hasNext() && !it.peekNext().startsWith(QLatin1String("--"))) { + _overrideLocalDir = it.next(); + } else { + showHint("Invalid URL passed to --overridelocaldir"); + } } else { - showHint("Unrecognized option '" + option.toStdString() + "'"); + QString errorMessage; + if (!AccountSetupCommandLineManager::instance()->parseCommandlineOption(option, it, errorMessage)) { + if (!errorMessage.isEmpty()) { + showHint(errorMessage.toStdString()); + return; + } + showHint("Unrecognized option '" + option.toStdString() + "'"); + } } } + if (shouldExit) { + std::exit(0); + } } // Helpers for displaying messages. Note that there is no console on Windows. @@ -761,11 +851,13 @@ QString substLang(const QString &lang) // transifex translation conventions. // Simplified Chinese - if (lang == QLatin1String("zh_Hans")) + if (lang == QLatin1String("zh_Hans")) { return QLatin1String("zh_CN"); + } // Traditional Chinese - if (lang == QLatin1String("zh_Hant")) + if (lang == QLatin1String("zh_Hant")) { return QLatin1String("zh_TW"); + } return lang; } @@ -781,8 +873,9 @@ void Application::setupTranslations() #endif QString enforcedLocale = Theme::instance()->enforcedLocale(); - if (!enforcedLocale.isEmpty()) + if (!enforcedLocale.isEmpty()) { uiLanguages.prepend(enforcedLocale); + } auto *translator = new QTranslator(this); auto *qtTranslator = new QTranslator(this); @@ -823,8 +916,9 @@ void Application::setupTranslations() installTranslator(qtkeychainTranslator); break; } - if (property("ui_lang").isNull()) + if (property("ui_lang").isNull()) { setProperty("ui_lang", "C"); + } } } @@ -882,7 +976,7 @@ void Application::tryTrayAgain() bool Application::event(QEvent *event) { if (event->type() == QEvent::FileOpen) { - const auto openEvent = static_cast(event); + const auto openEvent = dynamic_cast(event); qCDebug(lcApplication) << "macOS: Received a QFileOpenEvent"; if(!openEvent->file().isEmpty()) { diff --git a/src/gui/application.h b/src/gui/application.h index d00d8bc0e..8ae193264 100644 --- a/src/gui/application.h +++ b/src/gui/application.h @@ -64,13 +64,13 @@ public: void showHelp(); void showHint(std::string errorHint); bool debugMode(); - bool backgroundMode() const; + [[nodiscard]] bool backgroundMode() const; bool versionOnly(); // only display the version? void showVersion(); void showMainDialog(); - ownCloudGui *gui() const; + [[nodiscard]] ownCloudGui *gui() const; bool event(QEvent *event) override; @@ -94,7 +94,7 @@ protected: signals: void folderRemoved(); - void folderStateChanged(Folder *); + void folderStateChanged(OCC::Folder *); void isShowingSettingsDialog(); protected slots: @@ -102,8 +102,8 @@ protected slots: void slotCheckConnection(); void slotUseMonoIconsChanged(bool); void slotCleanup(); - void slotAccountStateAdded(AccountState *accountState); - void slotAccountStateRemoved(AccountState *accountState); + void slotAccountStateAdded(OCC::AccountState *accountState); + void slotAccountStateRemoved(OCC::AccountState *accountState); void slotSystemOnlineConfigurationChanged(QNetworkConfiguration); void slotGuiIsShowingSettings(); @@ -145,6 +145,9 @@ private: QNetworkConfigurationManager _networkConfigurationManager; QTimer _checkConnectionTimer; + QString _overrideServerUrl; + QString _overrideLocalDir; + #if defined(WITH_CRASHREPORTER) QScopedPointer _crashHandler; #endif diff --git a/src/gui/authenticationdialog.h b/src/gui/authenticationdialog.h index 3bd2183d7..8eb94db0e 100644 --- a/src/gui/authenticationdialog.h +++ b/src/gui/authenticationdialog.h @@ -31,8 +31,8 @@ class AuthenticationDialog : public QDialog public: AuthenticationDialog(const QString &realm, const QString &domain, QWidget *parent = nullptr); - QString user() const; - QString password() const; + [[nodiscard]] QString user() const; + [[nodiscard]] QString password() const; private: QLineEdit *_user; diff --git a/src/gui/callstatechecker.h b/src/gui/callstatechecker.h index 630099630..a599d2d6f 100644 --- a/src/gui/callstatechecker.h +++ b/src/gui/callstatechecker.h @@ -32,9 +32,9 @@ class CallStateChecker : public QObject public: explicit CallStateChecker(QObject *parent = nullptr); - QString token() const; - AccountState* accountState() const; - bool checking() const; + [[nodiscard]] QString token() const; + [[nodiscard]] AccountState* accountState() const; + [[nodiscard]] bool checking() const; signals: void tokenChanged(); @@ -57,7 +57,7 @@ private slots: private: void setup(); void startCallStateCheck(); - bool isAccountServerVersion22OrLater() const; + [[nodiscard]] bool isAccountServerVersion22OrLater() const; AccountState *_accountState = nullptr; QString _token; diff --git a/src/gui/caseclashfilenamedialog.cpp b/src/gui/caseclashfilenamedialog.cpp new file mode 100644 index 000000000..cfba3660f --- /dev/null +++ b/src/gui/caseclashfilenamedialog.cpp @@ -0,0 +1,284 @@ +/* + * Copyright 2021 (c) Felix Weilbach + * Copyright 2022 (c) Matthieu Gallien + * Copyright 2022 (c) Claudio Cambra + * + * 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 "caseclashfilenamedialog.h" +#include "ui_caseclashfilenamedialog.h" + +#include "account.h" +#include "folder.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace { +constexpr std::array caseClashIllegalCharacters({ '\\', '/', ':', '?', '*', '\"', '<', '>', '|' }); + +QVector getCaseClashIllegalCharsFromString(const QString &string) +{ + QVector result; + for (const auto &character : string) { + if (std::find(caseClashIllegalCharacters.begin(), caseClashIllegalCharacters.end(), character) + != caseClashIllegalCharacters.end()) { + result.push_back(character); + } + } + return result; +} + +QString caseClashIllegalCharacterListToString(const QVector &illegalCharacters) +{ + QString illegalCharactersString; + if (illegalCharacters.size() > 0) { + illegalCharactersString += illegalCharacters[0]; + } + + for (int i = 1; i < illegalCharacters.count(); ++i) { + if (illegalCharactersString.contains(illegalCharacters[i])) { + continue; + } + illegalCharactersString += " " + illegalCharacters[i]; + } + return illegalCharactersString; +} +} + +namespace OCC { + +Q_LOGGING_CATEGORY(lcCaseClashConflictFialog, "nextcloud.sync.caseclash.dialog", QtInfoMsg) + +CaseClashFilenameDialog::CaseClashFilenameDialog(AccountPtr account, + Folder *folder, + const QString &conflictFilePath, + const QString &conflictTaggedPath, + QWidget *parent) + : QDialog(parent) + , _ui(std::make_unique()) + , _conflictSolver(conflictFilePath, conflictTaggedPath, folder->remotePath(), folder->path(), account, folder->journalDb()) + , _account(account) + , _folder(folder) + , _filePath(std::move(conflictFilePath)) +{ + Q_ASSERT(_account); + Q_ASSERT(_folder); + + const auto filePathFileInfo = QFileInfo(_filePath); + const auto conflictFileName = filePathFileInfo.fileName(); + + _relativeFilePath = filePathFileInfo.path() + QStringLiteral("/"); + _relativeFilePath = _relativeFilePath.replace(folder->path(), QLatin1String()); + _relativeFilePath = _relativeFilePath.isEmpty() ? QString() : _relativeFilePath + QStringLiteral("/"); + + _originalFileName = _relativeFilePath + conflictFileName; + + _ui->setupUi(this); + _ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + _ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Rename file")); + + _ui->descriptionLabel->setText(tr("The file \"%1\" could not be synced because of a case clash conflict with an existing file on this system.").arg(_originalFileName)); + _ui->explanationLabel->setText(tr("%1 does not support equal file names with only letter casing differences.").arg(QSysInfo::prettyProductName())); + _ui->filenameLineEdit->setText(conflictFileName); + + const auto preexistingConflictingFile = caseClashConflictFile(_filePath); + updateFileWidgetGroup(preexistingConflictingFile, + tr("Open existing file"), + _ui->localVersionFilename, + _ui->localVersionLink, + _ui->localVersionMtime, + _ui->localVersionSize, + _ui->localVersionButton); + + updateFileWidgetGroup(conflictTaggedPath, + tr("Open clashing file"), + _ui->remoteVersionFilename, + _ui->remoteVersionLink, + _ui->remoteVersionMtime, + _ui->remoteVersionSize, + _ui->remoteVersionButton); + // Display incoming conflict filename, not conflict-tagged filename + _ui->remoteVersionFilename->setText(filePathFileInfo.fileName()); + + adjustSize(); + + connect(_ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(_ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + connect(_ui->localVersionButton, &QToolButton::clicked, this, [preexistingConflictingFile] { + QDesktopServices::openUrl(QUrl::fromLocalFile(preexistingConflictingFile)); + }); + connect(_ui->remoteVersionButton, &QToolButton::clicked, this, [conflictTaggedPath] { + QDesktopServices::openUrl(QUrl::fromLocalFile(conflictTaggedPath)); + }); + + _ui->errorLabel->setText({}/* + tr("Checking rename permissions …")*/); + _ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + _ui->filenameLineEdit->setEnabled(false); + + connect(_ui->filenameLineEdit, &QLineEdit::textChanged, this, + &CaseClashFilenameDialog::onFilenameLineEditTextChanged); + + connect(&_conflictSolver, &CaseClashConflictSolver::errorStringChanged, this, [this] () { + _ui->errorLabel->setText(_conflictSolver.errorString()); + }); + + connect(&_conflictSolver, &CaseClashConflictSolver::allowedToRenameChanged, this, [this] () { + _ui->buttonBox->setStandardButtons(_ui->buttonBox->standardButtons() &~ QDialogButtonBox::No); + if (_conflictSolver.allowedToRename()) { + _ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + _ui->filenameLineEdit->setEnabled(true); + _ui->filenameLineEdit->selectAll(); + } else { + _ui->buttonBox->setStandardButtons(_ui->buttonBox->standardButtons() | QDialogButtonBox::No); + } + }); + + connect(&_conflictSolver, &CaseClashConflictSolver::failed, this, [this] () { + _ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + }); + + connect(&_conflictSolver, &CaseClashConflictSolver::done, this, [this] () { + Q_EMIT successfulRename(_folder->remotePath() + _newFilename); + QDialog::accept(); + }); + + checkIfAllowedToRename(); +} + +CaseClashFilenameDialog::~CaseClashFilenameDialog() = default; + +QString CaseClashFilenameDialog::caseClashConflictFile(const QString &conflictFilePath) +{ + const auto filePathFileInfo = QFileInfo(conflictFilePath); + const auto conflictFileName = filePathFileInfo.fileName(); + + QDirIterator it(filePathFileInfo.path(), QDirIterator::Subdirectories); + + while(it.hasNext()) { + const auto filePath = it.next(); + qCDebug(lcCaseClashConflictFialog) << filePath; + QFileInfo fileInfo(filePath); + + if(fileInfo.isDir()) { + continue; + } + + const auto currentFileName = fileInfo.fileName(); + if (currentFileName.compare(conflictFileName, Qt::CaseInsensitive) == 0 && + currentFileName != conflictFileName) { + + return filePath; + } + } + + return {}; +} + +void CaseClashFilenameDialog::updateFileWidgetGroup(const QString &filePath, + const QString &linkText, + QLabel *filenameLabel, + QLabel *linkLabel, + QLabel *mtimeLabel, + QLabel *sizeLabel, + QToolButton *button) const +{ + const auto filePathFileInfo = QFileInfo(filePath); + const auto filename = filePathFileInfo.fileName(); + const auto lastModifiedString = filePathFileInfo.lastModified().toString(); + const auto fileSizeString = locale().formattedDataSize(filePathFileInfo.size()); + const auto fileUrl = QUrl::fromLocalFile(filePath).toString(); + const auto linkString = QStringLiteral("%2").arg(fileUrl, linkText); + const auto mime = QMimeDatabase().mimeTypeForFile(_filePath); + QIcon fileTypeIcon; + + qCDebug(lcCaseClashConflictFialog) << filePath << filePathFileInfo.exists() << filename << lastModifiedString << fileSizeString << fileUrl << linkString << mime; + + if (QIcon::hasThemeIcon(mime.iconName())) { + fileTypeIcon = QIcon::fromTheme(mime.iconName()); + } else { + fileTypeIcon = QIcon(":/qt-project.org/styles/commonstyle/images/file-128.png"); + } + + filenameLabel->setText(filename); + mtimeLabel->setText(lastModifiedString); + sizeLabel->setText(fileSizeString); + linkLabel->setText(linkString); + button->setIcon(fileTypeIcon); +} + +void CaseClashFilenameDialog::checkIfAllowedToRename() +{ + _conflictSolver.checkIfAllowedToRename(); +} + +bool CaseClashFilenameDialog::processLeadingOrTrailingSpacesError(const QString &fileName) +{ + const auto hasLeadingSpaces = fileName.startsWith(QLatin1Char(' ')); + const auto hasTrailingSpaces = fileName.endsWith(QLatin1Char(' ')); + + _ui->buttonBox->setStandardButtons(_ui->buttonBox->standardButtons() &~ QDialogButtonBox::No); + + if (hasLeadingSpaces || hasTrailingSpaces) { + if (hasLeadingSpaces && hasTrailingSpaces) { + _ui->errorLabel->setText(tr("Filename contains leading and trailing spaces.")); + } + else if (hasLeadingSpaces) { + _ui->errorLabel->setText(tr("Filename contains leading spaces.")); + } else if (hasTrailingSpaces) { + _ui->errorLabel->setText(tr("Filename contains trailing spaces.")); + } + + if (!Utility::isWindows()) { + _ui->buttonBox->setStandardButtons(_ui->buttonBox->standardButtons() | QDialogButtonBox::No); + _ui->buttonBox->button(QDialogButtonBox::No)->setText(tr("Use invalid name")); + } + + return true; + } + + return false; +} + +void CaseClashFilenameDialog::accept() +{ + _newFilename = _relativeFilePath + _ui->filenameLineEdit->text().trimmed(); + _conflictSolver.solveConflict(_newFilename); +} + +void CaseClashFilenameDialog::onFilenameLineEditTextChanged(const QString &text) +{ + const auto isNewFileNameDifferent = text != _originalFileName; + const auto illegalContainedCharacters = getCaseClashIllegalCharsFromString(text); + const auto containsIllegalChars = !illegalContainedCharacters.empty() || text.endsWith(QLatin1Char('.')); + const auto isTextValid = isNewFileNameDifferent && !containsIllegalChars; + + _ui->errorLabel->setText(""); + + if (!processLeadingOrTrailingSpacesError(text) && !isTextValid){ + _ui->errorLabel->setText(tr("Filename contains illegal characters: %1").arg(caseClashIllegalCharacterListToString(illegalContainedCharacters))); + } + + _ui->buttonBox->button(QDialogButtonBox::Ok) + ->setEnabled(isTextValid); +} +} diff --git a/src/gui/caseclashfilenamedialog.h b/src/gui/caseclashfilenamedialog.h new file mode 100644 index 000000000..6608cb801 --- /dev/null +++ b/src/gui/caseclashfilenamedialog.h @@ -0,0 +1,83 @@ +/* + * Copyright 2021 (c) Felix Weilbach + * Copyright 2022 (c) Matthieu Gallien + * Copyright 2022 (c) Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include "accountfwd.h" +#include "caseclashconflictsolver.h" + +#include +#include +#include +#include + +#include + +namespace OCC { + +class Folder; + +namespace Ui { + class CaseClashFilenameDialog; +} + + +class CaseClashFilenameDialog : public QDialog +{ + Q_OBJECT + +public: + explicit CaseClashFilenameDialog(AccountPtr account, + Folder *folder, + const QString &conflictFilePath, + const QString &conflictTaggedPath, + QWidget *parent = nullptr); + + ~CaseClashFilenameDialog() override; + + void accept() override; + +signals: + void successfulRename(const QString &filePath); + +private slots: + void updateFileWidgetGroup(const QString &filePath, + const QString &linkText, + QLabel *filenameLabel, + QLabel *linkLabel, + QLabel *mtimeLabel, + QLabel *sizeLabel, + QToolButton *button) const; + +private: + // Find the conflicting file path + static QString caseClashConflictFile(const QString &conflictFilePath); + + void onFilenameLineEditTextChanged(const QString &text); + void checkIfAllowedToRename(); + bool processLeadingOrTrailingSpacesError(const QString &fileName); + + std::unique_ptr _ui; + CaseClashConflictSolver _conflictSolver; + AccountPtr _account; + Folder *_folder = nullptr; + + QString _filePath; + QString _relativeFilePath; + QString _originalFileName; + QString _newFilename; +}; +} diff --git a/src/gui/caseclashfilenamedialog.ui b/src/gui/caseclashfilenamedialog.ui new file mode 100644 index 000000000..42d9a6754 --- /dev/null +++ b/src/gui/caseclashfilenamedialog.ui @@ -0,0 +1,340 @@ + + + OCC::CaseClashFilenameDialog + + + + 0 + 0 + 451 + 349 + + + + Case Clash Conflict + + + + QLayout::SetDefaultConstraint + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + Error + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + false + + + + + + + + + + + Existing file + + + + + + + fileA + + + + + + + + + QLayout::SetDefaultConstraint + + + + + + + + + 64 + 64 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + QLayout::SetDefaultConstraint + + + + + today + + + + + + + 0 byte + + + + + + + Open existing file + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + + + + + Case clashing file + + + + + + + fileB + + + + + + + + + + + + + + + 64 + 64 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + today + + + + + + + 0 byte + + + + + + + Open clashing file + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + Please enter a new name for the clashing file: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + false + + + + + + + New filename + + + + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + diff --git a/src/gui/cloudproviders/cloudproviderwrapper.h b/src/gui/cloudproviders/cloudproviderwrapper.h index 58d00336e..ab40e240b 100644 --- a/src/gui/cloudproviders/cloudproviderwrapper.h +++ b/src/gui/cloudproviders/cloudproviderwrapper.h @@ -49,9 +49,9 @@ public: public slots: void slotSyncStarted(); - void slotSyncFinished(const SyncResult &); - void slotUpdateProgress(const QString &folder, const ProgressInfo &progress); - void slotSyncPausedChanged(Folder*, bool); + void slotSyncFinished(const OCC::SyncResult &); + void slotUpdateProgress(const QString &folder, const OCC::ProgressInfo &progress); + void slotSyncPausedChanged(OCC::Folder*, bool); private: Folder *_folder; diff --git a/src/gui/conflictdialog.h b/src/gui/conflictdialog.h index 5c5b763b4..b102b8de7 100644 --- a/src/gui/conflictdialog.h +++ b/src/gui/conflictdialog.h @@ -32,9 +32,9 @@ public: explicit ConflictDialog(QWidget *parent = nullptr); ~ConflictDialog() override; - QString baseFilename() const; - QString localVersionFilename() const; - QString remoteVersionFilename() const; + [[nodiscard]] QString baseFilename() const; + [[nodiscard]] QString localVersionFilename() const; + [[nodiscard]] QString remoteVersionFilename() const; public slots: void setBaseFilename(const QString &baseFilename); diff --git a/src/gui/conflictsolver.h b/src/gui/conflictsolver.h index caf4f2286..b000e78dc 100644 --- a/src/gui/conflictsolver.h +++ b/src/gui/conflictsolver.h @@ -35,8 +35,8 @@ public: explicit ConflictSolver(QWidget *parent = nullptr); - QString localVersionFilename() const; - QString remoteVersionFilename() const; + [[nodiscard]] QString localVersionFilename() const; + [[nodiscard]] QString remoteVersionFilename() const; bool exec(Solution solution); diff --git a/src/gui/connectionvalidator.cpp b/src/gui/connectionvalidator.cpp index 14bc2617c..5868d72e2 100644 --- a/src/gui/connectionvalidator.cpp +++ b/src/gui/connectionvalidator.cpp @@ -114,7 +114,7 @@ void ConnectionValidator::slotStatusFound(const QUrl &url, const QJsonObject &in if (_account->url() != url) { qCInfo(lcConnectionValidator()) << "status.php was redirected to" << url.toString(); _account->setUrl(url); - _account->wantsAccountSaved(_account.data()); + emit _account->wantsAccountSaved(_account.data()); } if (!serverVersion.isEmpty() && !setAndCheckServerVersion(serverVersion)) { @@ -278,7 +278,7 @@ bool ConnectionValidator::setAndCheckServerVersion(const QString &version) if (auto job = qobject_cast(sender())) { if (auto reply = job->reply()) { _account->setHttp2Supported( - reply->attribute(QNetworkRequest::HTTP2WasUsedAttribute).toBool()); + reply->attribute(QNetworkRequest::Http2WasUsedAttribute).toBool()); } } #endif diff --git a/src/gui/connectionvalidator.h b/src/gui/connectionvalidator.h index 7915c654c..920f63175 100644 --- a/src/gui/connectionvalidator.h +++ b/src/gui/connectionvalidator.h @@ -108,7 +108,7 @@ public slots: void checkAuthentication(); signals: - void connectionResult(ConnectionValidator::Status status, const QStringList &errors); + void connectionResult(OCC::ConnectionValidator::Status status, const QStringList &errors); protected slots: void slotCheckServerAndAuth(); @@ -121,7 +121,7 @@ protected slots: void slotAuthSuccess(); void slotCapabilitiesRecieved(const QJsonDocument &); - void slotUserFetched(UserInfo *userInfo); + void slotUserFetched(OCC::UserInfo *userInfo); private: #ifndef TOKEN_AUTH_ONLY diff --git a/src/gui/creds/flow2auth.h b/src/gui/creds/flow2auth.h index 3ac1cd0cd..6b9440cfb 100644 --- a/src/gui/creds/flow2auth.h +++ b/src/gui/creds/flow2auth.h @@ -51,17 +51,17 @@ public: void start(); void openBrowser(); void copyLinkToClipboard(); - QUrl authorisationLink() const; + [[nodiscard]] QUrl authorisationLink() const; signals: /** * The state has changed. * when logged in, appPassword has the value of the app password. */ - void result(Flow2Auth::Result result, const QString &errorString = QString(), + void result(OCC::Flow2Auth::Result result, const QString &errorString = QString(), const QString &user = QString(), const QString &appPassword = QString()); - void statusChanged(const PollStatus status, int secondsLeft); + void statusChanged(const OCC::Flow2Auth::PollStatus status, int secondsLeft); public slots: void slotPollNow(); diff --git a/src/gui/creds/httpcredentialsgui.h b/src/gui/creds/httpcredentialsgui.h index fd4161dbb..df059a0a7 100644 --- a/src/gui/creds/httpcredentialsgui.h +++ b/src/gui/creds/httpcredentialsgui.h @@ -54,7 +54,7 @@ public: * In case of oauth, return an URL to the link to open the browser. * An invalid URL otherwise */ - QUrl authorisationLink() const { return _asyncAuth ? _asyncAuth->authorisationLink() : QUrl(); } + [[nodiscard]] QUrl authorisationLink() const { return _asyncAuth ? _asyncAuth->authorisationLink() : QUrl(); } static QString requestAppPasswordText(const Account *account); diff --git a/src/gui/creds/oauth.cpp b/src/gui/creds/oauth.cpp index 39534fa48..04b0e62f8 100644 --- a/src/gui/creds/oauth.cpp +++ b/src/gui/creds/oauth.cpp @@ -70,7 +70,7 @@ void OAuth::start() QByteArray peek = socket->peek(qMin(socket->bytesAvailable(), 4000LL)); //The code should always be within the first 4K if (peek.indexOf('\n') < 0) return; // wait until we find a \n - const QRegularExpression rx("^GET /\\?code=([a-zA-Z0-9]+)[& ]"); // Match a /?code=... URL + static const QRegularExpression rx("^GET /\\?code=([a-zA-Z0-9]+)[& ]"); // Match a /?code=... URL const auto rxMatch = rx.match(peek); if (!rxMatch.hasMatch()) { httpReplyAndClose(socket, "404 Not Found", "404 Not Found

404 Not Found

"); diff --git a/src/gui/creds/oauth.h b/src/gui/creds/oauth.h index 0fa543b5e..c07cdbc86 100644 --- a/src/gui/creds/oauth.h +++ b/src/gui/creds/oauth.h @@ -55,7 +55,7 @@ public: Q_ENUM(Result); void start(); bool openBrowser(); - QUrl authorisationLink() const; + [[nodiscard]] QUrl authorisationLink() const; signals: /** diff --git a/src/gui/creds/webflowcredentials.cpp b/src/gui/creds/webflowcredentials.cpp index 278d81b94..9958d1b7d 100644 --- a/src/gui/creds/webflowcredentials.cpp +++ b/src/gui/creds/webflowcredentials.cpp @@ -164,7 +164,7 @@ void WebFlowCredentials::askFromUser() { } QString msg = tr("You have been logged out of your account %1 at %2. Please login again.") - .arg(_user, _account->displayName()); + .arg(_account->prettyName(), _account->url().toDisplayString()); _askDialog->setInfo(msg); _askDialog->show(); @@ -188,7 +188,7 @@ void WebFlowCredentials::slotAskFromUserCredentialsProvided(const QString &user, qCInfo(lcWebFlowCredentials()) << "Authed with the wrong user!"; QString msg = tr("Please login with the account: %1") - .arg(_user); + .arg(_account->prettyName()); _askDialog->setError(msg); if (!_askDialog->isUsingFlow2()) { @@ -238,7 +238,7 @@ void WebFlowCredentials::persist() { } _account->setCredentialSetting(userC, _user); - _account->wantsAccountSaved(_account); + emit _account->wantsAccountSaved(_account); // write cert if there is one if (!_clientSslCertificate.isNull()) { diff --git a/src/gui/creds/webflowcredentials.h b/src/gui/creds/webflowcredentials.h index 4bdf445f2..fffc11330 100644 --- a/src/gui/creds/webflowcredentials.h +++ b/src/gui/creds/webflowcredentials.h @@ -43,12 +43,12 @@ public: const QSslKey &key = QSslKey(), const QList &caCertificates = QList()); - QString authType() const override; - QString user() const override; - QString password() const override; - QNetworkAccessManager *createQNAM() const override; + [[nodiscard]] QString authType() const override; + [[nodiscard]] QString user() const override; + [[nodiscard]] QString password() const override; + [[nodiscard]] QNetworkAccessManager *createQNAM() const override; - bool ready() const override; + [[nodiscard]] bool ready() const override; void fetchFromKeychain() override; void askFromUser() override; diff --git a/src/gui/creds/webflowcredentialsdialog.cpp b/src/gui/creds/webflowcredentialsdialog.cpp index 748d0cb65..19db3430b 100644 --- a/src/gui/creds/webflowcredentialsdialog.cpp +++ b/src/gui/creds/webflowcredentialsdialog.cpp @@ -6,7 +6,6 @@ #include "theme.h" #include "application.h" #include "owncloudgui.h" -#include "headerbanner.h" #include "wizard/owncloudwizardcommon.h" #ifdef WITH_WEBENGINE #include "wizard/webview.h" @@ -62,7 +61,7 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(Account *account, bool useFlo #endif // WITH_WEBENGINE } - auto app = static_cast(qApp); + auto app = dynamic_cast(qApp); connect(app, &Application::isShowingSettingsDialog, this, &WebFlowCredentialsDialog::slotShowSettingsDialog); _errorLabel = new QLabel(); diff --git a/src/gui/creds/webflowcredentialsdialog.h b/src/gui/creds/webflowcredentialsdialog.h index 35fb6b3bb..b684603d7 100644 --- a/src/gui/creds/webflowcredentialsdialog.h +++ b/src/gui/creds/webflowcredentialsdialog.h @@ -12,7 +12,6 @@ class QVBoxLayout; namespace OCC { -class HeaderBanner; #ifdef WITH_WEBENGINE class WebView; #endif // WITH_WEBENGINE @@ -28,7 +27,7 @@ public: void setInfo(const QString &msg); void setError(const QString &error); - bool isUsingFlow2() const { + [[nodiscard]] bool isUsingFlow2() const { return _useFlow2; } @@ -60,7 +59,6 @@ private: QLabel *_infoLabel; QVBoxLayout *_layout; QVBoxLayout *_containerLayout; - HeaderBanner *_headerBanner; }; } // namespace OCC diff --git a/src/gui/editlocallyjob.cpp b/src/gui/editlocallyjob.cpp index 69eccd62f..a95ad1375 100644 --- a/src/gui/editlocallyjob.cpp +++ b/src/gui/editlocallyjob.cpp @@ -253,7 +253,7 @@ void EditLocallyJob::startSyncBeforeOpening() { eraseBlacklistRecordForItem(); if (!checkIfFileParentSyncIsNeeded()) { - lockFile(); + processLocalItem(); return; } @@ -319,7 +319,7 @@ bool EditLocallyJob::isTokenValid(const QString &token) // Token is an alphanumeric string 128 chars long. // Ensure that is what we received and what we are sending to the server. - const QRegularExpression tokenRegex("^[a-zA-Z0-9]{128}$"); + static const QRegularExpression tokenRegex("^[a-zA-Z0-9]{128}$"); const auto regexMatch = tokenRegex.match(token); return regexMatch.hasMatch(); @@ -414,7 +414,7 @@ void EditLocallyJob::showErrorNotification(const QString &message, const QString }); if (foundFolder != folderMap.cend()) { - (*foundFolder)->syncEngine().addErrorToGui(SyncFileItem::SoftError, message, informativeText); + emit (*foundFolder)->syncEngine().addErrorToGui(SyncFileItem::SoftError, message, informativeText); } } @@ -450,6 +450,7 @@ void EditLocallyJob::startEditLocally() _syncTerminatedConnection = {}; startSyncBeforeOpening(); }); + _folderForFile->setSilenceErrorsUntilNextSync(true); _folderForFile->slotTerminateSync(); return; @@ -466,7 +467,7 @@ void EditLocallyJob::slotItemCompleted(const OCC::SyncFileItemPtr &item) if (item->_file == _relativePathToRemoteRoot) { disconnect(&_folderForFile->syncEngine(), &SyncEngine::itemCompleted, this, &EditLocallyJob::slotItemCompleted); disconnect(&_folderForFile->syncEngine(), &SyncEngine::itemDiscovered, this, &EditLocallyJob::slotItemDiscovered); - lockFile(); + processLocalItem(); } } @@ -556,6 +557,22 @@ void EditLocallyJob::openFile() }); } +void EditLocallyJob::processLocalItem() +{ + Q_ASSERT(_folderForFile); + + SyncJournalFileRecord rec; + const auto ok = _folderForFile->journalDb()->getFileRecord(_relativePathToRemoteRoot, &rec); + Q_ASSERT(ok); + + // Do not lock if it is a directory or lock is not available on the server + if (rec.isDirectory() || !_accountState->account()->capabilities().filesLockAvailable()) { + openFile(); + } else { + lockFile(); + } +} + void EditLocallyJob::lockFile() { Q_ASSERT(_accountState); diff --git a/src/gui/editlocallyjob.h b/src/gui/editlocallyjob.h index e62f420ea..582d5049f 100644 --- a/src/gui/editlocallyjob.h +++ b/src/gui/editlocallyjob.h @@ -37,11 +37,10 @@ public: const QString &token, QObject *parent = nullptr); - static bool isTokenValid(const QString &token); - static bool isRelPathValid(const QString &relPath); - static OCC::Folder *findFolderForFile(const QString &relPath, const QString &userId); - static bool isRelPathExcluded(const QString &relPath); - static QString prefixSlashToPath(const QString &path); + [[nodiscard]] static bool isTokenValid(const QString &token); + [[nodiscard]] static bool isRelPathValid(const QString &relPath); + [[nodiscard]] static OCC::Folder *findFolderForFile(const QString &relPath, const QString &userId); + [[nodiscard]] static QString prefixSlashToPath(const QString &path); signals: void setupFinished(); @@ -72,6 +71,7 @@ private slots: void slotLsColJobFinishedWithError(QNetworkReply *reply); void slotDirectoryListingIterated(const QString &name, const QMap &properties); + void processLocalItem(); void openFile(); void lockFile(); @@ -84,11 +84,11 @@ private slots: void disconnectFolderSignals(); private: - bool checkIfFileParentSyncIsNeeded(); // returns true if sync will be needed, false otherwise - const QString getRelativePathToRemoteRootForFile() const; // returns either '/' or a (relative path - Folder::remotePath()) for folders pointing to a non-root remote path e.g. '/subfolder' instead of '/' - const QString getRelativePathParent() const; + [[nodiscard]] bool checkIfFileParentSyncIsNeeded(); // returns true if sync will be needed, false otherwise + [[nodiscard]] const QString getRelativePathToRemoteRootForFile() const; // returns either '/' or a (relative path - Folder::remotePath()) for folders pointing to a non-root remote path e.g. '/subfolder' instead of '/' + [[nodiscard]] const QString getRelativePathParent() const; - static int fileLockTimeRemainingMinutes(const qint64 lockTime, const qint64 lockTimeOut); + [[nodiscard]] static int fileLockTimeRemainingMinutes(const qint64 lockTime, const qint64 lockTimeOut); bool _tokenVerified = false; diff --git a/src/gui/editlocallymanager.h b/src/gui/editlocallymanager.h index 9e4850fd4..079ba2c83 100644 --- a/src/gui/editlocallymanager.h +++ b/src/gui/editlocallymanager.h @@ -26,7 +26,7 @@ class EditLocallyManager : public QObject Q_OBJECT public: - static EditLocallyManager *instance(); + [[nodiscard]] static EditLocallyManager *instance(); public slots: void editLocally(const QUrl &url); @@ -46,7 +46,7 @@ private: QString token; }; - static EditLocallyInputData parseEditLocallyUrl(const QUrl &url); + [[nodiscard]] static EditLocallyInputData parseEditLocallyUrl(const QUrl &url); QHash _jobs; }; diff --git a/src/gui/elidedlabel.h b/src/gui/elidedlabel.h index e101a65da..7938ff525 100644 --- a/src/gui/elidedlabel.h +++ b/src/gui/elidedlabel.h @@ -28,10 +28,10 @@ public: explicit ElidedLabel(const QString &text, QWidget *parent = nullptr); void setText(const QString &text); - const QString &text() const { return _text; } + [[nodiscard]] const QString &text() const { return _text; } void setElideMode(Qt::TextElideMode elideMode); - Qt::TextElideMode elideMode() const { return _elideMode; } + [[nodiscard]] Qt::TextElideMode elideMode() const { return _elideMode; } protected: void resizeEvent(QResizeEvent *event) override; diff --git a/src/gui/emojimodel.h b/src/gui/emojimodel.h index 2d35305d4..f67d9569d 100644 --- a/src/gui/emojimodel.h +++ b/src/gui/emojimodel.h @@ -62,9 +62,9 @@ struct Emoji class EmojiCategoriesModel : public QAbstractListModel { public: - QVariant data(const QModelIndex &index, int role) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QHash roleNames() const override; + [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QHash roleNames() const override; private: enum Roles { @@ -105,11 +105,11 @@ public: { } - Q_INVOKABLE QVariantList history() const; + Q_INVOKABLE [[nodiscard]] QVariantList history() const; Q_INVOKABLE void setCategory(const QString &category); Q_INVOKABLE void emojiUsed(const QVariant &modelData); - QVariantList model() const; + [[nodiscard]] QVariantList model() const; QAbstractListModel *emojiCategoriesModel(); signals: diff --git a/src/gui/fileactivitylistmodel.cpp b/src/gui/fileactivitylistmodel.cpp index 5fadec981..4e4c3c220 100644 --- a/src/gui/fileactivitylistmodel.cpp +++ b/src/gui/fileactivitylistmodel.cpp @@ -24,23 +24,54 @@ FileActivityListModel::FileActivityListModel(QObject *parent) : ActivityListModel(nullptr, parent) { setDisplayActions(false); + connect(this, &FileActivityListModel::accountStateChanged, this, &FileActivityListModel::load); } -void FileActivityListModel::load(AccountState *accountState, const int objectId) +QString FileActivityListModel::localPath() const { - Q_ASSERT(accountState); - if (!accountState || currentlyFetching()) { + return _localPath; +} + +void FileActivityListModel::setLocalPath(const QString &localPath) +{ + if(localPath == _localPath) { + return; + } + + _localPath = localPath; + Q_EMIT localPathChanged(); + + load(); +} + +void FileActivityListModel::load() +{ + if (!accountState() || _localPath.isEmpty() || currentlyFetching()) { + return; + } + + const auto folder = FolderMan::instance()->folderForPath(_localPath); + + if (!folder) { + qCWarning(lcFileActivityListModel) << "Invalid folder for localPath:" << _localPath << "will not load activity list model."; + return; + } + + const auto folderRelativePath = _localPath.mid(folder->cleanPath().length() + 1); + SyncJournalFileRecord record; + + if (!folder->journalDb()->getFileRecord(folderRelativePath, &record) || !record.isValid()) { + qCWarning(lcFileActivityListModel) << "Invalid file record for path:" << _localPath << "will not load activity list model."; return; } - setAccountState(accountState); - _objectId = objectId; + _objectId = record.numericFileId().toInt(); slotRefreshActivity(); } void FileActivityListModel::startFetchJob() { - if (!accountState()->isConnected()) { + if (!accountState()->isConnected() || _objectId == -1) { return; } setAndRefreshCurrentlyFetching(true); diff --git a/src/gui/fileactivitylistmodel.h b/src/gui/fileactivitylistmodel.h index 2c698ddde..a11197405 100644 --- a/src/gui/fileactivitylistmodel.h +++ b/src/gui/fileactivitylistmodel.h @@ -22,17 +22,25 @@ namespace OCC { class FileActivityListModel : public ActivityListModel { Q_OBJECT + Q_PROPERTY(QString localPath READ localPath WRITE setLocalPath NOTIFY localPathChanged) public: explicit FileActivityListModel(QObject *parent = nullptr); + [[nodiscard]] QString localPath() const; + +signals: + void localPathChanged(); + public slots: - void load(AccountState *accountState, const int objectId); + void setLocalPath(const QString &localPath); + void load(); -protected: +protected slots: void startFetchJob() override; private: - int _objectId; + int _objectId = -1; + QString _localPath; }; } diff --git a/src/gui/filedetails/FileActivityView.qml b/src/gui/filedetails/FileActivityView.qml new file mode 100644 index 000000000..002654b79 --- /dev/null +++ b/src/gui/filedetails/FileActivityView.qml @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" + +ActivityList { + id: root + + property alias localPath: activityListModel.localPath + property alias accountState: activityListModel.accountState + + isFileActivityList: true + model: FileActivityListModel { + id: activityListModel + } +} diff --git a/src/gui/filedetails/FileDetailsPage.qml b/src/gui/filedetails/FileDetailsPage.qml new file mode 100644 index 000000000..ead5cd075 --- /dev/null +++ b/src/gui/filedetails/FileDetailsPage.qml @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" + +Page { + id: root + + signal closeButtonClicked + + property var accountState: ({}) + property string localPath: "" + + // We want the SwipeView to "spill" over the edges of the window to really + // make it look nice. If we apply page-wide padding, however, the swipe + // contents only go as far as the page contents, clipped by the padding. + // This property reflects the padding we intend to display, but not the real + // padding, which we have to apply selectively to achieve our desired effect. + property int intendedPadding: Style.standardSpacing * 2 + property int iconSize: 32 + property StackView rootStackView: StackView {} + property bool showCloseButton: false + property bool backgroundsVisible: true + + property FileDetails fileDetails: FileDetails { + id: fileDetails + localPath: root.localPath + } + + Connections { + target: Systray + function onShowFileDetailsPage(fileLocalPath, page) { + if(fileLocalPath === root.localPath) { + switch(page) { + case Systray.FileDetailsPage.Activity: + swipeView.currentIndex = fileActivityView.swipeIndex; + break; + case Systray.FileDetailsPage.Sharing: + swipeView.currentIndex = shareView.swipeIndex; + break; + } + } + } + } + + topPadding: intendedPadding + bottomPadding: intendedPadding + + background: Rectangle { + color: Style.backgroundColor + visible: root.backgroundsVisible + } + + header: ColumnLayout { + spacing: root.intendedPadding + + GridLayout { + id: headerGridLayout + + readonly property bool showFileLockedString: root.fileDetails.lockExpireString !== "" + readonly property int textRightMargin: root.showCloseButton ? root.intendedPadding : 0 + + Layout.fillWidth: parent + Layout.topMargin: root.topPadding + + columns: root.showCloseButton ? 3 : 2 + rows: showFileLockedString ? 3 : 2 + + rowSpacing: Style.standardSpacing / 2 + columnSpacing: Style.standardSpacing + + Image { + id: fileIcon + + Layout.rowSpan: headerGridLayout.rows + Layout.preferredWidth: Style.trayListItemIconSize + Layout.leftMargin: root.intendedPadding + Layout.fillHeight: true + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + source: root.fileDetails.iconUrl + sourceSize.width: Style.trayListItemIconSize + sourceSize.height: Style.trayListItemIconSize + fillMode: Image.PreserveAspectFit + } + + EnforcedPlainTextLabel { + id: fileNameLabel + + Layout.fillWidth: true + Layout.rightMargin: headerGridLayout.textRightMargin + + text: root.fileDetails.name + color: Style.ncTextColor + font.bold: true + wrapMode: Text.Wrap + } + + CustomButton { + id: closeButton + + Layout.rowSpan: headerGridLayout.rows + Layout.preferredWidth: Style.iconButtonWidth + Layout.preferredHeight: width + Layout.rightMargin: headerGridLayout.textRightMargin + + imageSource: "image://svgimage-custom-color/clear.svg" + "/" + Style.ncTextColor + bgColor: Style.lightHover + bgNormalOpacity: 0 + toolTipText: qsTr("Dismiss") + + visible: root.showCloseButton + + onClicked: root.closeButtonClicked() + } + + EnforcedPlainTextLabel { + id: fileDetailsLabel + + Layout.fillWidth: true + Layout.rightMargin: headerGridLayout.textRightMargin + + text: `${root.fileDetails.sizeString} · ${root.fileDetails.lastChangedString}` + color: Style.ncSecondaryTextColor + wrapMode: Text.Wrap + } + + EnforcedPlainTextLabel { + id: fileLockedLabel + + Layout.fillWidth: true + Layout.rightMargin: headerGridLayout.textRightMargin + + text: root.fileDetails.lockExpireString + color: Style.ncSecondaryTextColor + wrapMode: Text.Wrap + visible: headerGridLayout.showFileLockedString + } + } + + TabBar { + id: viewBar + + Layout.leftMargin: root.intendedPadding + Layout.rightMargin: root.intendedPadding + + padding: 0 + background: Rectangle { + color: Style.backgroundColor + } + + NCTabButton { + svgCustomColorSource: "image://svgimage-custom-color/activity.svg" + text: qsTr("Activity") + checked: swipeView.currentIndex === fileActivityView.swipeIndex + onClicked: swipeView.currentIndex = fileActivityView.swipeIndex + } + + NCTabButton { + svgCustomColorSource: "image://svgimage-custom-color/share.svg" + text: qsTr("Sharing") + checked: swipeView.currentIndex === shareView.swipeIndex + onClicked: swipeView.currentIndex = shareView.swipeIndex + } + } + } + + SwipeView { + id: swipeView + + anchors.fill: parent + clip: true + + FileActivityView { + id: fileActivityView + + property int swipeIndex: SwipeView.index + + delegateHorizontalPadding: root.intendedPadding + + accountState: root.accountState + localPath: root.localPath + iconSize: root.iconSize + } + + ShareView { + id: shareView + + property int swipeIndex: SwipeView.index + + accountState: root.accountState + localPath: root.localPath + fileDetails: root.fileDetails + horizontalPadding: root.intendedPadding + iconSize: root.iconSize + rootStackView: root.rootStackView + backgroundsVisible: root.backgroundsVisible + } + } +} diff --git a/src/gui/filedetails/FileDetailsView.qml b/src/gui/filedetails/FileDetailsView.qml new file mode 100644 index 000000000..de5fec16e --- /dev/null +++ b/src/gui/filedetails/FileDetailsView.qml @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 + +StackView { + id: root + + signal closeButtonClicked + + property alias accountState: fileDetailsPage.accountState + property alias localPath: fileDetailsPage.localPath + property alias showCloseButton: fileDetailsPage.showCloseButton + property bool backgroundsVisible: true + + background: Rectangle { + color: Style.backgroundColor + visible: root.backgroundsVisible + } + + initialItem: FileDetailsPage { + id: fileDetailsPage + width: parent.width + height: parent.height + backgroundsVisible: root.backgroundsVisible + rootStackView: root + onCloseButtonClicked: root.closeButtonClicked() + } +} diff --git a/src/gui/filedetails/FileDetailsWindow.qml b/src/gui/filedetails/FileDetailsWindow.qml new file mode 100644 index 000000000..39c9590e2 --- /dev/null +++ b/src/gui/filedetails/FileDetailsWindow.qml @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 + +ApplicationWindow { + id: root + + property var accountState + property string localPath: "" + + width: 400 + height: 500 + minimumWidth: 300 + minimumHeight: 300 + + title: qsTr("File details of %1 · %2").arg(fileDetailsPage.fileDetails.name).arg(Systray.windowTitle) + + FileDetailsView { + id: fileDetailsPage + anchors.fill: parent + accountState: root.accountState + localPath: root.localPath + } +} diff --git a/src/gui/filedetails/NCInputTextEdit.qml b/src/gui/filedetails/NCInputTextEdit.qml new file mode 100644 index 000000000..85cd39940 --- /dev/null +++ b/src/gui/filedetails/NCInputTextEdit.qml @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 + +TextEdit { + id: root + + property color accentColor: Style.ncBlue + property color secondaryColor: Style.menuBorder + property alias submitButton: submitButton + + clip: true + color: Style.ncTextColor + textMargin: Style.smallSpacing + wrapMode: TextEdit.Wrap + selectByMouse: true + height: Math.max(Style.talkReplyTextFieldPreferredHeight, contentHeight) + + Rectangle { + id: textFieldBorder + anchors.fill: parent + radius: Style.slightlyRoundedButtonRadius + border.width: Style.normalBorderWidth + border.color: root.activeFocus ? root.accentColor : root.secondaryColor + color: Style.backgroundColor + z: -1 + } + + Button { + id: submitButton + + anchors.bottom: root.bottom + anchors.right: root.right + anchors.margins: 1 + + width: height + height: parent.height + + background: Rectangle { + radius: width / 2 + color: textFieldBorder.color + } + + flat: true + icon.source: "image://svgimage-custom-color/confirm.svg" + "/" + root.secondaryColor + icon.color: hovered && enabled ? UserModel.currentUser.accentColor : root.secondaryColor + + enabled: root.text !== "" + + onClicked: root.editingFinished() + } +} + diff --git a/src/gui/filedetails/NCInputTextField.qml b/src/gui/filedetails/NCInputTextField.qml new file mode 100644 index 000000000..36dd42ee7 --- /dev/null +++ b/src/gui/filedetails/NCInputTextField.qml @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 + +TextField { + id: root + + property color accentColor: Style.ncBlue + property color secondaryColor: Style.menuBorder + property alias submitButton: submitButton + + implicitHeight: Style.talkReplyTextFieldPreferredHeight + color: Style.ncTextColor + placeholderTextColor: secondaryColor + + rightPadding: submitButton.width + + selectByMouse: true + + background: Rectangle { + id: textFieldBorder + radius: Style.slightlyRoundedButtonRadius + border.width: Style.normalBorderWidth + border.color: root.activeFocus ? root.accentColor : root.secondaryColor + color: Style.backgroundColor + } + + Button { + id: submitButton + + anchors.top: root.top + anchors.right: root.right + anchors.margins: 1 + + width: height + height: parent.height + + background: null + flat: true + icon.source: "image://svgimage-custom-color/confirm.svg" + "/" + root.secondaryColor + icon.color: hovered && enabled ? UserModel.currentUser.accentColor : root.secondaryColor + + enabled: root.text !== "" + + onClicked: root.accepted() + } +} + diff --git a/src/gui/filedetails/NCTabButton.qml b/src/gui/filedetails/NCTabButton.qml new file mode 100644 index 000000000..569569e63 --- /dev/null +++ b/src/gui/filedetails/NCTabButton.qml @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" + +TabButton { + id: tabButton + + property string svgCustomColorSource: "" + + padding: Style.smallSpacing + background: Rectangle { + radius: Style.slightlyRoundedButtonRadius + color: tabButton.pressed ? Style.lightHover : Style.backgroundColor + } + + contentItem: ColumnLayout { + id: tabButtonLayout + + property var elementColors: tabButton.checked || tabButton.hovered ? Style.ncTextColor : Style.ncSecondaryTextColor + + // We'd like to just set the height of the Image, but this causes crashing. + // So we use a wrapping Item and use anchors to adjust the size. + Item { + id: iconItem + Layout.fillWidth: true + Layout.fillHeight: true + height: 20 + + Image { + id: iconItemImage + anchors.fill: parent + anchors.margins: tabButton.checked ? 0 : 2 + horizontalAlignment: Image.AlignHCenter + verticalAlignment: Image.AlignVCenter + fillMode: Image.PreserveAspectFit + source: tabButton.svgCustomColorSource + "/" + tabButtonLayout.elementColors + sourceSize.width: 32 + sourceSize.height: 32 + } + } + + EnforcedPlainTextLabel { + id: tabButtonLabel + Layout.fillWidth: true + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + color: tabButtonLayout.elementColors + text: tabButton.text + font.bold: tabButton.checked + } + + Rectangle { + FontMetrics { + id: fontMetrics + font.family: tabButtonLabel.font.family + font.pixelSize: tabButtonLabel.font.pixelSize + font.bold: true + } + + property int textWidth: fontMetrics.boundingRect(tabButtonLabel.text).width + + Layout.fillWidth: true + implicitWidth: textWidth + Style.standardSpacing * 2 + implicitHeight: 2 + + color: tabButton.checked ? Style.ncBlue : tabButton.hovered ? Style.lightHover : "transparent" + } + } +} diff --git a/src/gui/filedetails/ShareDelegate.qml b/src/gui/filedetails/ShareDelegate.qml new file mode 100644 index 000000000..10ca1e679 --- /dev/null +++ b/src/gui/filedetails/ShareDelegate.qml @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtGraphicalEffects 1.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" +import "../" + +GridLayout { + id: root + + signal deleteShare + signal createNewLinkShare + + signal resetMenu + signal resetPasswordField + signal showPasswordSetError(string errorMessage); + + signal toggleAllowEditing(bool enable) + signal toggleAllowResharing(bool enable) + signal togglePasswordProtect(bool enable) + signal toggleExpirationDate(bool enable) + signal toggleNoteToRecipient(bool enable) + + signal setLinkShareLabel(string label) + signal setExpireDate(var milliseconds) // Since QML ints are only 32 bits, use a variant + signal setPassword(string password) + signal setNote(string note) + + property int iconSize: 32 + property FileDetails fileDetails: FileDetails {} + property StackView rootStackView: StackView {} + property bool backgroundsVisible: true + + property bool canCreateLinkShares: true + + readonly property bool isLinkShare: model.shareType === ShareModel.ShareTypeLink + readonly property bool isPlaceholderLinkShare: model.shareType === ShareModel.ShareTypePlaceholderLink + readonly property bool isInternalLinkShare: model.shareType === ShareModel.ShareTypeInternalLink + + readonly property string text: model.display ?? "" + readonly property string detailText: model.detailText ?? "" + readonly property string iconUrl: model.iconUrl ?? "" + readonly property string avatarUrl: model.avatarUrl ?? "" + readonly property string link: model.link ?? "" + + anchors.left: parent.left + anchors.right: parent.right + + columns: 3 + rows: linkDetailLabel.visible ? 1 : 2 + + columnSpacing: Style.standardSpacing / 2 + rowSpacing: Style.standardSpacing / 2 + + Item { + id: imageItem + + property bool isAvatar: root.avatarUrl !== "" + + Layout.row: 0 + Layout.column: 0 + Layout.rowSpan: root.rows + Layout.preferredWidth: root.iconSize + Layout.preferredHeight: root.iconSize + + Rectangle { + id: backgroundOrMask + anchors.fill: parent + radius: width / 2 + color: Style.ncBlue + visible: !imageItem.isAvatar + } + + Image { + id: shareIconOrThumbnail + + anchors.centerIn: parent + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + fillMode: Image.PreserveAspectFit + + source: imageItem.isAvatar ? root.avatarUrl : root.iconUrl + "/white" + sourceSize.width: imageItem.isAvatar ? root.iconSize : root.iconSize / 2 + sourceSize.height: imageItem.isAvatar ? root.iconSize : root.iconSize / 2 + + visible: !imageItem.isAvatar + } + + OpacityMask { + anchors.fill: parent + source: shareIconOrThumbnail + maskSource: backgroundOrMask + visible: imageItem.isAvatar + } + } + + EnforcedPlainTextLabel { + id: shareTypeLabel + + Layout.fillWidth: true + Layout.alignment: linkDetailLabel.visible ? Qt.AlignBottom : Qt.AlignVCenter + Layout.row: 0 + Layout.column: 1 + Layout.rowSpan: root.rows + + text: root.text + color: Style.ncTextColor + elide: Text.ElideRight + } + + EnforcedPlainTextLabel { + id: linkDetailLabel + + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop + Layout.row: 1 + Layout.column: 1 + + text: root.detailText + color: Style.ncSecondaryTextColor + elide: Text.ElideRight + visible: text !== "" + } + + RowLayout { + Layout.row: 0 + Layout.column: 2 + Layout.rowSpan: root.rows + Layout.fillHeight: true + + spacing: 0 + + CustomButton { + id: createLinkButton + + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: Style.iconButtonWidth + Layout.preferredHeight: width + + toolTipText: qsTr("Create a new share link") + + bgColor: Style.lightHover + bgNormalOpacity: 0 + + imageSource: "image://svgimage-custom-color/add.svg/" + Style.ncTextColor + + visible: root.isPlaceholderLinkShare && root.canCreateLinkShares + enabled: visible + + onClicked: root.createNewLinkShare() + } + + CustomButton { + id: copyLinkButton + + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: Style.iconButtonWidth + Layout.preferredHeight: width + + toolTipText: qsTr("Copy share link location") + + bgColor: Style.lightHover + bgNormalOpacity: 0 + + imageSource: "image://svgimage-custom-color/copy.svg/" + Style.ncTextColor + icon.width: 16 + icon.height: 16 + + visible: root.isLinkShare || root.isInternalLinkShare + enabled: visible + + onClicked: { + clipboardHelper.text = root.link; + clipboardHelper.selectAll(); + clipboardHelper.copy(); + clipboardHelper.clear(); + } + + TextEdit { id: clipboardHelper; visible: false} + } + + CustomButton { + id: moreButton + + Layout.alignment: Qt.AlignCenter + Layout.preferredWidth: Style.iconButtonWidth + Layout.preferredHeight: width + + toolTipText: qsTr("Share options") + + bgColor: Style.lightHover + bgNormalOpacity: 0 + + imageSource: "image://svgimage-custom-color/more.svg/" + Style.ncTextColor + + visible: !root.isPlaceholderLinkShare && !root.isInternalLinkShare + enabled: visible + + onClicked: root.rootStackView.push(shareDetailsPageComponent, {}, StackView.PushTransition) + + Component { + id: shareDetailsPageComponent + ShareDetailsPage { + id: shareDetailsPage + + width: parent.width + height: parent.height + backgroundsVisible: root.backgroundsVisible + + fileDetails: root.fileDetails + shareModelData: model + + canCreateLinkShares: root.canCreateLinkShares + + onCloseShareDetails: root.rootStackView.pop(root.rootStackView.initialItem, StackView.PopTransition) + + onToggleAllowEditing: root.toggleAllowEditing(enable) + onToggleAllowResharing: root.toggleAllowResharing(enable) + onTogglePasswordProtect: root.togglePasswordProtect(enable) + onToggleExpirationDate: root.toggleExpirationDate(enable) + onToggleNoteToRecipient: root.toggleNoteToRecipient(enable) + + onSetLinkShareLabel: root.setLinkShareLabel(label) + onSetExpireDate: root.setExpireDate(milliseconds) // Since QML ints are only 32 bits, use a variant + onSetPassword: root.setPassword(password) + onSetNote: root.setNote(note) + + onDeleteShare: { + root.deleteShare(); + closeShareDetails(); + } + onCreateNewLinkShare: { + root.createNewLinkShare(); + closeShareDetails(); + } + + Connections { + target: root + function onResetMenu() { shareDetailsPage.resetMenu() } + function onResetPasswordField() { shareDetailsPage.resetPasswordField() } + function onShowPasswordSetError(errorMessage) { shareDetailsPage.showPasswordSetError(errorMessage) } + } + } + } + } + } +} diff --git a/src/gui/filedetails/ShareDetailsPage.qml b/src/gui/filedetails/ShareDetailsPage.qml new file mode 100644 index 000000000..b4ce6d909 --- /dev/null +++ b/src/gui/filedetails/ShareDetailsPage.qml @@ -0,0 +1,789 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 +import QtGraphicalEffects 1.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" +import "../" + +Page { + id: root + + signal closeShareDetails + signal deleteShare + signal createNewLinkShare + + signal toggleAllowEditing(bool enable) + signal toggleAllowResharing(bool enable) + signal togglePasswordProtect(bool enable) + signal toggleExpirationDate(bool enable) + signal toggleNoteToRecipient(bool enable) + + signal setLinkShareLabel(string label) + signal setExpireDate(var milliseconds) // Since QML ints are only 32 bits, use a variant + signal setPassword(string password) + signal setNote(string note) + + property bool backgroundsVisible: true + + property FileDetails fileDetails: FileDetails {} + property var shareModelData: ({}) + + property bool canCreateLinkShares: true + + readonly property var share: shareModelData.share ?? ({}) + + readonly property string iconUrl: shareModelData.iconUrl ?? "" + readonly property string avatarUrl: shareModelData.avatarUrl ?? "" + readonly property string text: shareModelData.display ?? "" + readonly property string detailText: shareModelData.detailText ?? "" + readonly property string link: shareModelData.link ?? "" + readonly property string note: shareModelData.note ?? "" + readonly property string password: shareModelData.password ?? "" + readonly property string passwordPlaceholder: "●●●●●●●●●●" + + readonly property var expireDate: shareModelData.expireDate // Don't use int as we are limited + readonly property var maximumExpireDate: shareModelData.enforcedMaximumExpireDate + + readonly property string linkShareLabel: shareModelData.linkShareLabel ?? "" + + readonly property bool editingAllowed: shareModelData.editingAllowed + readonly property bool noteEnabled: shareModelData.noteEnabled + readonly property bool expireDateEnabled: shareModelData.expireDateEnabled + readonly property bool expireDateEnforced: shareModelData.expireDateEnforced + readonly property bool passwordProtectEnabled: shareModelData.passwordProtectEnabled + readonly property bool passwordEnforced: shareModelData.passwordEnforced + + readonly property bool isLinkShare: shareModelData.shareType === ShareModel.ShareTypeLink + + property bool waitingForEditingAllowedChange: false + property bool waitingForNoteEnabledChange: false + property bool waitingForExpireDateEnabledChange: false + property bool waitingForPasswordProtectEnabledChange: false + property bool waitingForExpireDateChange: false + property bool waitingForLinkShareLabelChange: false + property bool waitingForPasswordChange: false + property bool waitingForNoteChange: false + + function showPasswordSetError(message) { + passwordErrorBoxLoader.message = message !== "" ? + message : qsTr("An error occurred setting the share password."); + } + + function resetNoteField() { + noteTextEdit.text = note; + waitingForNoteChange = false; + } + + function resetLinkShareLabelField() { + linkShareLabelTextField.text = linkShareLabel; + waitingForLinkShareLabelChange = false; + } + + function resetPasswordField() { + passwordTextField.text = password !== "" ? password : passwordPlaceholder; + waitingForPasswordChange = false; + } + + function resetExpireDateField() { + // Expire date changing is handled by the expireDateSpinBox + waitingForExpireDateChange = false; + } + + function resetEditingAllowedField() { + editingAllowedMenuItem.checked = editingAllowed; + waitingForEditingAllowedChange = false; + } + + function resetNoteEnabledField() { + noteEnabledMenuItem.checked = noteEnabled; + waitingForNoteEnabledChange = false; + } + + function resetExpireDateEnabledField() { + expireDateEnabledMenuItem.checked = expireDateEnabled; + waitingForExpireDateEnabledChange = false; + } + + function resetPasswordProtectEnabledField() { + passwordProtectEnabledMenuItem.checked = passwordProtectEnabled; + waitingForPasswordProtectEnabledChange = false; + } + + function resetMenu() { + moreMenu.close(); + + resetNoteField(); + resetPasswordField(); + resetLinkShareLabelField(); + resetExpireDateField(); + + resetEditingAllowedField(); + resetNoteEnabledField(); + resetExpireDateEnabledField(); + resetPasswordProtectEnabledField(); + } + + // Renaming a link share can lead to the model being reshuffled. + // This can cause a situation where this delegate is assigned to + // a new row and it doesn't have its properties signalled as + // changed by the model, leading to bugs. We therefore reset all + // the fields here when we detect the share has been changed + onShareChanged: resetMenu() + + // Reset value after property binding broken by user interaction + onNoteChanged: resetNoteField() + onPasswordChanged: resetPasswordField() + onLinkShareLabelChanged: resetLinkShareLabelField() + onExpireDateChanged: resetExpireDateField() + + onEditingAllowedChanged: resetEditingAllowedField() + onNoteEnabledChanged: resetNoteEnabledField() + onExpireDateEnabledChanged: resetExpireDateEnabledField() + onPasswordProtectEnabledChanged: resetPasswordProtectEnabledField() + + padding: Style.standardSpacing * 2 + + // TODO: Rather than setting all these palette colours manually, + // create a custom style and do it for all components globally + palette { + text: Style.ncTextColor + windowText: Style.ncTextColor + buttonText: Style.ncTextColor + light: Style.lightHover + midlight: Style.lightHover + mid: Style.ncSecondaryTextColor + dark: Style.menuBorder + button: Style.menuBorder + window: Style.backgroundColor + base: Style.backgroundColor + } + + background: Rectangle { + color: Style.backgroundColor + visible: root.backgroundsVisible + } + + header: ColumnLayout { + spacing: root.padding + + GridLayout { + id: headerGridLayout + + Layout.fillWidth: parent + Layout.topMargin: root.topPadding + + columns: 3 + rows: 2 + + rowSpacing: Style.standardSpacing / 2 + columnSpacing: Style.standardSpacing + + Image { + id: fileIcon + + Layout.rowSpan: headerGridLayout.rows + Layout.preferredWidth: Style.trayListItemIconSize + Layout.leftMargin: root.padding + Layout.fillHeight: true + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + source: root.fileDetails.iconUrl + sourceSize.width: Style.trayListItemIconSize + sourceSize.height: Style.trayListItemIconSize + fillMode: Image.PreserveAspectFit + } + + EnforcedPlainTextLabel { + id: headLabel + + Layout.fillWidth: true + + text: qsTr("Edit share") + color: Style.ncTextColor + font.bold: true + elide: Text.ElideRight + } + + CustomButton { + id: closeButton + + Layout.rowSpan: headerGridLayout.rows + Layout.preferredWidth: Style.iconButtonWidth + Layout.preferredHeight: width + Layout.rightMargin: root.padding + + imageSource: "image://svgimage-custom-color/clear.svg" + "/" + Style.ncTextColor + bgColor: Style.lightHover + bgNormalOpacity: 0 + toolTipText: qsTr("Dismiss") + + onClicked: root.closeShareDetails() + } + + EnforcedPlainTextLabel { + id: secondaryLabel + + Layout.fillWidth: true + Layout.rightMargin: root.padding + + text: root.fileDetails.name + color: Style.ncSecondaryTextColor + wrapMode: Text.Wrap + } + } + } + + contentItem: ScrollView { + contentWidth: availableWidth + clip: true + + ColumnLayout { + id: moreMenu + + property int rowIconWidth: 16 + property int indicatorItemWidth: 20 + property int indicatorSpacing: Style.standardSpacing + property int itemPadding: Style.smallSpacing + + width: parent.width + + RowLayout { + Layout.fillWidth: true + height: visible ? implicitHeight : 0 + spacing: moreMenu.indicatorSpacing + + visible: root.isLinkShare + + Image { + Layout.preferredWidth: moreMenu.indicatorItemWidth + Layout.fillHeight: true + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + fillMode: Image.Pad + + source: "image://svgimage-custom-color/edit.svg/" + Style.menuBorder + sourceSize.width: moreMenu.rowIconWidth + sourceSize.height: moreMenu.rowIconWidth + } + + NCInputTextField { + id: linkShareLabelTextField + + Layout.fillWidth: true + height: visible ? implicitHeight : 0 + + text: root.linkShareLabel + placeholderText: qsTr("Share label") + + enabled: root.isLinkShare && + !root.waitingForLinkShareLabelChange + + onAccepted: if(text !== root.linkShareLabel) { + root.setLinkShareLabel(text); + root.waitingForLinkShareLabelChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForLinkShareLabelChange + running: visible + z: 1 + } + } + } + + // On these checkables, the clicked() signal is called after + // the check state changes. + CheckBox { + id: editingAllowedMenuItem + + Layout.fillWidth: true + + spacing: moreMenu.indicatorSpacing + padding: moreMenu.itemPadding + indicator.width: moreMenu.indicatorItemWidth + indicator.height: moreMenu.indicatorItemWidth + + checkable: true + checked: root.editingAllowed + text: qsTr("Allow editing") + enabled: !root.waitingForEditingAllowedChange + + onClicked: { + root.toggleAllowEditing(checked); + root.waitingForEditingAllowedChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForEditingAllowedChange + running: visible + z: 1 + } + } + + CheckBox { + id: passwordProtectEnabledMenuItem + + Layout.fillWidth: true + + spacing: moreMenu.indicatorSpacing + padding: moreMenu.itemPadding + indicator.width: moreMenu.indicatorItemWidth + indicator.height: moreMenu.indicatorItemWidth + + checkable: true + checked: root.passwordProtectEnabled + text: qsTr("Password protect") + enabled: !root.waitingForPasswordProtectEnabledChange && !root.passwordEnforced + + onClicked: { + root.togglePasswordProtect(checked); + root.waitingForPasswordProtectEnabledChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForPasswordProtectEnabledChange + running: visible + z: 1 + } + } + + RowLayout { + Layout.fillWidth: true + + height: visible ? implicitHeight : 0 + spacing: moreMenu.indicatorSpacing + + visible: root.passwordProtectEnabled + + Image { + Layout.preferredWidth: moreMenu.indicatorItemWidth + Layout.fillHeight: true + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + fillMode: Image.Pad + + source: "image://svgimage-custom-color/lock-https.svg/" + Style.menuBorder + sourceSize.width: moreMenu.rowIconWidth + sourceSize.height: moreMenu.rowIconWidth + } + + NCInputTextField { + id: passwordTextField + + Layout.fillWidth: true + height: visible ? implicitHeight : 0 + + text: root.password !== "" ? root.password : root.passwordPlaceholder + enabled: root.passwordProtectEnabled && + !root.waitingForPasswordChange && + !root.waitingForPasswordProtectEnabledChange + + onAccepted: if(text !== root.password && text !== root.passwordPlaceholder) { + passwordErrorBoxLoader.message = ""; + root.setPassword(text); + root.waitingForPasswordChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForPasswordChange || + root.waitingForPasswordProtectEnabledChange + running: visible + z: 1 + } + } + } + + Loader { + id: passwordErrorBoxLoader + + property string message: "" + + Layout.fillWidth: true + height: message !== "" ? implicitHeight : 0 + + active: message !== "" + visible: active + + sourceComponent: Item { + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + // Artificially add vertical padding + implicitHeight: passwordErrorBox.implicitHeight + (Style.smallSpacing * 2) + + ErrorBox { + id: passwordErrorBox + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + text: passwordErrorBoxLoader.message + } + } + } + + CheckBox { + id: expireDateEnabledMenuItem + + Layout.fillWidth: true + + spacing: moreMenu.indicatorSpacing + padding: moreMenu.itemPadding + indicator.width: moreMenu.indicatorItemWidth + indicator.height: moreMenu.indicatorItemWidth + + checkable: true + checked: root.expireDateEnabled + text: qsTr("Set expiration date") + enabled: !root.waitingForExpireDateEnabledChange && !root.expireDateEnforced + + onClicked: { + root.toggleExpirationDate(checked); + root.waitingForExpireDateEnabledChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForExpireDateEnabledChange + running: visible + z: 1 + } + } + + RowLayout { + Layout.fillWidth: true + height: visible ? implicitHeight : 0 + spacing: moreMenu.indicatorSpacing + + visible: root.expireDateEnabled + + Image { + Layout.preferredWidth: moreMenu.indicatorItemWidth + Layout.fillHeight: true + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + fillMode: Image.Pad + + source: "image://svgimage-custom-color/calendar.svg/" + Style.menuBorder + sourceSize.width: moreMenu.rowIconWidth + sourceSize.height: moreMenu.rowIconWidth + } + + // QML dates are essentially JavaScript dates, which makes them very finicky and unreliable. + // Instead, we exclusively deal with msecs from epoch time to make things less painful when editing. + // We only use the QML Date when showing the nice string to the user. + SpinBox { + id: expireDateSpinBox + + // Work arounds the limitations of QML's 32 bit integer when handling msecs from epoch + // Instead, we handle everything as days since epoch + readonly property int dayInMSecs: 24 * 60 * 60 * 1000 + readonly property int expireDateReduced: Math.floor(root.expireDate / dayInMSecs) + // Reset the model data after binding broken on user interact + onExpireDateReducedChanged: value = expireDateReduced + + // We can't use JS's convenient Infinity or Number.MAX_VALUE as + // JS Number type is 64 bits, whereas QML's int type is only 32 bits + readonly property IntValidator intValidator: IntValidator {} + readonly property int maximumExpireDateReduced: root.expireDateEnforced ? + Math.floor(root.maximumExpireDate / dayInMSecs) : + intValidator.top + readonly property int minimumExpireDateReduced: { + const currentDate = new Date(); + const minDateUTC = new Date(Date.UTC(currentDate.getFullYear(), + currentDate.getMonth(), + currentDate.getDate() + 1)); + return Math.floor(minDateUTC / dayInMSecs) // Start of day at 00:00:0000 UTC + } + + // Taken from Kalendar 22.08 + // https://invent.kde.org/pim/kalendar/-/blob/release/22.08/src/contents/ui/KalendarUtils/dateutils.js + function parseDateString(dateString) { + function defaultParse() { + const defaultParsedDate = Date.fromLocaleDateString(Qt.locale(), dateString, Locale.NarrowFormat); + // JS always generates date in system locale, eliminate timezone difference to UTC + const msecsSinceEpoch = defaultParsedDate.getTime() - (defaultParsedDate.getTimezoneOffset() * 60 * 1000); + return new Date(msecsSinceEpoch); + } + + const dateStringDelimiterMatches = dateString.match(/\D/); + if(dateStringDelimiterMatches.length === 0) { + // Let the date method figure out this weirdness + return defaultParse(); + } + + const dateStringDelimiter = dateStringDelimiterMatches[0]; + + const localisedDateFormatSplit = Qt.locale().dateFormat(Locale.NarrowFormat).split(dateStringDelimiter); + const localisedDateDayPosition = localisedDateFormatSplit.findIndex((x) => /d/gi.test(x)); + const localisedDateMonthPosition = localisedDateFormatSplit.findIndex((x) => /m/gi.test(x)); + const localisedDateYearPosition = localisedDateFormatSplit.findIndex((x) => /y/gi.test(x)); + + let splitDateString = dateString.split(dateStringDelimiter); + let userProvidedYear = splitDateString[localisedDateYearPosition] + + const dateNow = new Date(); + const stringifiedCurrentYear = dateNow.getFullYear().toString(); + + // If we have any input weirdness, or if we have a fully-written year + // (e.g. 2022 instead of 22) then use default parse + if(splitDateString.length === 0 || + splitDateString.length > 3 || + userProvidedYear.length >= stringifiedCurrentYear.length) { + + return defaultParse(); + } + + let fullyWrittenYear = userProvidedYear.split(""); + const digitsToAdd = stringifiedCurrentYear.length - fullyWrittenYear.length; + for(let i = 0; i < digitsToAdd; i++) { + fullyWrittenYear.splice(i, 0, stringifiedCurrentYear[i]) + } + fullyWrittenYear = fullyWrittenYear.join(""); + + const fixedYearNum = Number(fullyWrittenYear); + const monthIndexNum = Number(splitDateString[localisedDateMonthPosition]) - 1; + const dayNum = Number(splitDateString[localisedDateDayPosition]); + + console.log(dayNum, monthIndexNum, fixedYearNum); + + // Modification: return date in UTC + return new Date(Date.UTC(fixedYearNum, monthIndexNum, dayNum)); + } + + Layout.fillWidth: true + height: visible ? implicitHeight : 0 + + + // We want all the internal benefits of the spinbox but don't actually want the + // buttons, so set an empty item as a dummy + up.indicator: Item {} + down.indicator: Item {} + + padding: 0 + background: null + contentItem: NCInputTextField { + text: expireDateSpinBox.textFromValue(expireDateSpinBox.value, expireDateSpinBox.locale) + readOnly: !expireDateSpinBox.editable + validator: expireDateSpinBox.validator + inputMethodHints: Qt.ImhFormattedNumbersOnly + onAccepted: { + expireDateSpinBox.value = expireDateSpinBox.valueFromText(text, expireDateSpinBox.locale); + expireDateSpinBox.valueModified(); + } + } + + value: expireDateReduced + from: minimumExpireDateReduced + to: maximumExpireDateReduced + + textFromValue: (value, locale) => { + const dateFromValue = new Date(value * dayInMSecs); + return dateFromValue.toLocaleDateString(Qt.locale(), Locale.NarrowFormat); + } + valueFromText: (text, locale) => { + const dateFromText = parseDateString(text); + return Math.floor(dateFromText.getTime() / dayInMSecs); + } + + editable: true + inputMethodHints: Qt.ImhDate | Qt.ImhFormattedNumbersOnly + + enabled: root.expireDateEnabled && + !root.waitingForExpireDateChange && + !root.waitingForExpireDateEnabledChange + + onValueModified: { + if (!enabled || !activeFocus) { + return; + } + + root.setExpireDate(value * dayInMSecs); + root.waitingForExpireDateChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForExpireDateEnabledChange || + root.waitingForExpireDateChange + running: visible + z: 1 + } + } + } + + CheckBox { + id: noteEnabledMenuItem + + Layout.fillWidth: true + + spacing: moreMenu.indicatorSpacing + padding: moreMenu.itemPadding + indicator.width: moreMenu.indicatorItemWidth + indicator.height: moreMenu.indicatorItemWidth + + checkable: true + checked: root.noteEnabled + text: qsTr("Note to recipient") + enabled: !root.waitingForNoteEnabledChange + + onClicked: { + root.toggleNoteToRecipient(checked); + root.waitingForNoteEnabledChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForNoteEnabledChange + running: visible + z: 1 + } + } + + RowLayout { + Layout.fillWidth: true + height: visible ? implicitHeight : 0 + spacing: moreMenu.indicatorSpacing + + visible: root.noteEnabled + + Image { + Layout.preferredWidth: moreMenu.indicatorItemWidth + Layout.fillHeight: true + + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + fillMode: Image.Pad + + source: "image://svgimage-custom-color/edit.svg/" + Style.menuBorder + sourceSize.width: moreMenu.rowIconWidth + sourceSize.height: moreMenu.rowIconWidth + } + + NCInputTextEdit { + id: noteTextEdit + + Layout.fillWidth: true + height: visible ? Math.max(Style.talkReplyTextFieldPreferredHeight, contentHeight) : 0 + submitButton.height: Math.min(Style.talkReplyTextFieldPreferredHeight, height - 2) + + text: root.note + enabled: root.noteEnabled && + !root.waitingForNoteChange && + !root.waitingForNoteEnabledChange + + onEditingFinished: if(text !== root.note) { + root.setNote(text); + root.waitingForNoteChange = true; + } + + NCBusyIndicator { + anchors.fill: parent + visible: root.waitingForNoteChange || + root.waitingForNoteEnabledChange + running: visible + z: 1 + } + } + } + + CustomButton { + height: Style.standardPrimaryButtonHeight + + imageSource: "image://svgimage-custom-color/close.svg/" + Style.errorBoxBackgroundColor + imageSourceHover: "image://svgimage-custom-color/close.svg/" + Style.ncHeaderTextColor + text: qsTr("Unshare") + textColor: Style.errorBoxBackgroundColor + textColorHovered: "white" + contentsFont.bold: true + bgNormalColor: Style.buttonBackgroundColor + bgHoverColor: Style.errorBoxBackgroundColor + bgNormalOpacity: 1.0 + bgHoverOpacity: 1.0 + + onClicked: root.deleteShare() + } + + CustomButton { + height: Style.standardPrimaryButtonHeight + + imageSource: "image://svgimage-custom-color/add.svg/" + Style.ncBlue + imageSourceHover: "image://svgimage-custom-color/add.svg/" + Style.ncHeaderTextColor + text: qsTr("Add another link") + textColor: Style.ncBlue + textColorHovered: Style.ncHeaderTextColor + contentsFont.bold: true + bgNormalColor: Style.buttonBackgroundColor + bgHoverColor: Style.ncBlue + bgNormalOpacity: 1.0 + bgHoverOpacity: 1.0 + + visible: root.isLinkShare && root.canCreateLinkShares + enabled: visible + + onClicked: root.createNewLinkShare() + } + } + } + + footer: DialogButtonBox { + topPadding: 0 + bottomPadding: root.padding + rightPadding: root.padding + leftPadding: root.padding + alignment: Qt.AlignRight | Qt.AlignVCenter + visible: copyShareLinkButton.visible + + CustomButton { + id: copyShareLinkButton + + height: Style.standardPrimaryButtonHeight + + imageSource: "image://svgimage-custom-color/copy.svg/" + Style.ncHeaderTextColor + text: qsTr("Copy share link") + textColor: Style.ncHeaderTextColor + contentsFont.bold: true + bgColor: Style.ncBlue + bgNormalOpacity: 1.0 + bgHoverOpacity: Style.hoverOpacity + + visible: root.isLinkShare + enabled: visible + + onClicked: { + clipboardHelper.text = root.link; + clipboardHelper.selectAll(); + clipboardHelper.copy(); + clipboardHelper.clear(); + } + + TextEdit { id: clipboardHelper; visible: false } + } + } +} diff --git a/src/gui/filedetails/ShareView.qml b/src/gui/filedetails/ShareView.qml new file mode 100644 index 000000000..e2cb0d658 --- /dev/null +++ b/src/gui/filedetails/ShareView.qml @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.2 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" +import "../" + +ColumnLayout { + id: root + + property string localPath: "" + property var accountState: ({}) + property FileDetails fileDetails: FileDetails {} + property int horizontalPadding: 0 + property int iconSize: 32 + property bool backgroundsVisible: true + + readonly property bool sharingPossible: shareModel && shareModel.canShare && shareModel.sharingEnabled + readonly property bool userGroupSharingPossible: sharingPossible && shareModel.userGroupSharingEnabled + readonly property bool publicLinkSharingPossible: sharingPossible && shareModel.publicLinkSharesEnabled + + readonly property bool loading: sharingPossible && (!shareModel || + shareModel.fetchOngoing || + !shareModel.hasInitialShareFetchCompleted || + waitingForSharesToChange) + property bool waitingForSharesToChange: true // Gets changed to false when listview count changes + property bool stopWaitingForSharesToChangeOnPasswordError: false + + readonly property ShareModel shareModel: ShareModel { + accountState: root.accountState + localPath: root.localPath + + onSharesChanged: root.waitingForSharesToChange = false + + onServerError: { + if(errorBox.text === "") { + errorBox.text = message; + } else { + errorBox.text += "\n\n" + message + } + + errorBox.visible = true; + root.waitingForSharesToChange = false; + } + + onPasswordSetError: if(root.stopWaitingForSharesToChangeOnPasswordError) { + root.waitingForSharesToChange = false; + root.stopWaitingForSharesToChangeOnPasswordError = false; + } + + onRequestPasswordForLinkShare: shareRequiresPasswordDialog.open() + onRequestPasswordForEmailSharee: { + shareRequiresPasswordDialog.sharee = sharee; + shareRequiresPasswordDialog.open(); + } + } + + property StackView rootStackView: StackView {} + + Dialog { + id: shareRequiresPasswordDialog + + property var sharee + + function discardDialog() { + sharee = undefined; + root.waitingForSharesToChange = false; + close(); + } + + anchors.centerIn: parent + width: parent.width * 0.8 + + title: qsTr("Password required for new share") + standardButtons: Dialog.Ok | Dialog.Cancel + modal: true + closePolicy: Popup.NoAutoClose + + // TODO: Rather than setting all these palette colours manually, + // create a custom style and do it for all components globally + palette { + text: Style.ncTextColor + windowText: Style.ncTextColor + buttonText: Style.ncTextColor + light: Style.lightHover + midlight: Style.lightHover + mid: Style.ncSecondaryTextColor + dark: Style.menuBorder + button: Style.menuBorder + window: Style.backgroundColor + base: Style.backgroundColor + } + + visible: false + + onAccepted: { + if(sharee) { + root.shareModel.createNewUserGroupShareWithPasswordFromQml(sharee, dialogPasswordField.text); + sharee = undefined; + } else { + root.shareModel.createNewLinkShareWithPassword(dialogPasswordField.text); + } + + root.stopWaitingForSharesToChangeOnPasswordError = true; + dialogPasswordField.text = ""; + } + onDiscarded: discardDialog() + onRejected: discardDialog() + + NCInputTextField { + id: dialogPasswordField + + anchors.left: parent.left + anchors.right: parent.right + + placeholderText: qsTr("Share password") + onAccepted: shareRequiresPasswordDialog.accept() + } + } + + ErrorBox { + id: errorBox + + Layout.fillWidth: true + Layout.leftMargin: root.horizontalPadding + Layout.rightMargin: root.horizontalPadding + + showCloseButton: true + visible: false + + onCloseButtonClicked: { + text = ""; + visible = false; + } + } + + ShareeSearchField { + Layout.fillWidth: true + Layout.leftMargin: root.horizontalPadding + Layout.rightMargin: root.horizontalPadding + + visible: root.userGroupSharingPossible + enabled: visible && !root.loading + + accountState: root.accountState + shareItemIsFolder: root.fileDetails && root.fileDetails.isFolder + shareeBlocklist: root.shareModel.sharees + + onShareeSelected: { + root.waitingForSharesToChange = true; + root.shareModel.createNewUserGroupShareFromQml(sharee) + } + } + + Loader { + id: sharesViewLoader + + Layout.fillWidth: true + Layout.fillHeight: true + Layout.leftMargin: root.horizontalPadding + Layout.rightMargin: root.horizontalPadding + + active: root.sharingPossible + + sourceComponent: ScrollView { + id: scrollView + anchors.fill: parent + + contentWidth: availableWidth + clip: true + enabled: root.sharingPossible + + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + + ListView { + id: shareLinksListView + + enabled: !root.loading + model: SortedShareModel { + shareModel: root.shareModel + } + + delegate: ShareDelegate { + id: shareDelegate + + Connections { + target: root.shareModel + // Though we try to handle this internally by listening to onPasswordChanged, + // with passwords we will get the same value from the model data when a + // password set has failed, meaning we won't be able to easily tell when we + // have had a response from the server in QML. So we listen to this signal + // directly from the model and do the reset of the password field manually. + function onPasswordSetError(shareId, errorCode, errorMessage) { + if(shareId !== model.shareId) { + return; + } + shareDelegate.resetPasswordField(); + shareDelegate.showPasswordSetError(errorMessage); + } + + function onServerError() { + if(shareId !== model.shareId) { + return; + } + shareDelegate.resetMenu(); + } + } + + iconSize: root.iconSize + fileDetails: root.fileDetails + rootStackView: root.rootStackView + backgroundsVisible: root.backgroundsVisible + canCreateLinkShares: root.publicLinkSharingPossible + + onCreateNewLinkShare: { + root.waitingForSharesToChange = true; + shareModel.createNewLinkShare(); + } + onDeleteShare: { + root.waitingForSharesToChange = true; + shareModel.deleteShareFromQml(model.share); + } + + onToggleAllowEditing: shareModel.toggleShareAllowEditingFromQml(model.share, enable) + onToggleAllowResharing: shareModel.toggleShareAllowResharingFromQml(model.share, enable) + onTogglePasswordProtect: shareModel.toggleSharePasswordProtectFromQml(model.share, enable) + onToggleExpirationDate: shareModel.toggleShareExpirationDateFromQml(model.share, enable) + onToggleNoteToRecipient: shareModel.toggleShareNoteToRecipientFromQml(model.share, enable) + + onSetLinkShareLabel: shareModel.setLinkShareLabelFromQml(model.share, label) + onSetExpireDate: shareModel.setShareExpireDateFromQml(model.share, milliseconds) + onSetPassword: shareModel.setSharePasswordFromQml(model.share, password) + onSetNote: shareModel.setShareNoteFromQml(model.share, note) + } + + Loader { + id: sharesFetchingLoader + anchors.fill: parent + active: root.loading + z: Infinity + + sourceComponent: Rectangle { + color: Style.backgroundColor + opacity: 0.5 + + NCBusyIndicator { + anchors.centerIn: parent + color: Style.ncSecondaryTextColor + } + } + } + } + } + } + + Loader { + id: sharingNotPossibleView + + Layout.fillWidth: true + Layout.fillHeight: true + Layout.leftMargin: root.horizontalPadding + Layout.rightMargin: root.horizontalPadding + + active: !root.sharingPossible + + sourceComponent: Column { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + EnforcedPlainTextLabel { + id: sharingDisabledLabel + width: parent.width + text: qsTr("Sharing is disabled") + color: Style.ncSecondaryTextColor + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + EnforcedPlainTextLabel { + width: parent.width + text: qsTr("This item cannot be shared.") + color: Style.ncSecondaryTextColor + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + visible: !root.shareModel.canShare + } + EnforcedPlainTextLabel { + width: parent.width + text: qsTr("Sharing is disabled.") + color: Style.ncSecondaryTextColor + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + visible: !root.shareModel.sharingEnabled + } + } + } +} diff --git a/src/gui/filedetails/ShareeDelegate.qml b/src/gui/filedetails/ShareeDelegate.qml new file mode 100644 index 000000000..a9128cb4c --- /dev/null +++ b/src/gui/filedetails/ShareeDelegate.qml @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.2 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 + +ItemDelegate { + id: root + + text: model.display +} diff --git a/src/gui/filedetails/ShareeSearchField.qml b/src/gui/filedetails/ShareeSearchField.qml new file mode 100644 index 000000000..286d27391 --- /dev/null +++ b/src/gui/filedetails/ShareeSearchField.qml @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Layouts 1.2 +import QtQuick.Controls 2.15 + +import com.nextcloud.desktopclient 1.0 +import Style 1.0 +import "../tray" + +TextField { + id: root + + signal shareeSelected(var sharee) + + property var accountState: ({}) + property bool shareItemIsFolder: false + property var shareeBlocklist: ({}) + property ShareeModel shareeModel: ShareeModel { + accountState: root.accountState + shareItemIsFolder: root.shareItemIsFolder + searchString: root.text + shareeBlocklist: root.shareeBlocklist + } + + readonly property int horizontalPaddingOffset: Style.trayHorizontalMargin + readonly property color placeholderColor: Style.menuBorder + readonly property double iconsScaleFactor: 0.6 + + function triggerSuggestionsVisibility() { + shareeListView.count > 0 && text !== "" ? suggestionsPopup.open() : suggestionsPopup.close(); + } + + placeholderText: qsTr("Search for users or groups…") + placeholderTextColor: placeholderColor + color: Style.ncTextColor + enabled: !shareeModel.fetchOngoing + + onActiveFocusChanged: triggerSuggestionsVisibility() + onTextChanged: triggerSuggestionsVisibility() + Keys.onPressed: { + if(suggestionsPopup.visible) { + switch(event.key) { + case Qt.Key_Escape: + suggestionsPopup.close(); + shareeListView.currentIndex = -1; + event.accepted = true; + break; + + case Qt.Key_Up: + shareeListView.decrementCurrentIndex(); + event.accepted = true; + break; + + case Qt.Key_Down: + shareeListView.incrementCurrentIndex(); + event.accepted = true; + break; + + case Qt.Key_Enter: + case Qt.Key_Return: + if(shareeListView.currentIndex > -1) { + shareeListView.itemAtIndex(shareeListView.currentIndex).selectSharee(); + event.accepted = true; + break; + } + } + } else { + switch(event.key) { + case Qt.Key_Down: + triggerSuggestionsVisibility(); + event.accepted = true; + break; + } + } + } + + leftPadding: searchIcon.width + searchIcon.anchors.leftMargin + horizontalPaddingOffset + rightPadding: clearTextButton.width + clearTextButton.anchors.rightMargin + horizontalPaddingOffset + + background: Rectangle { + radius: 5 + border.color: parent.activeFocus ? UserModel.currentUser.accentColor : Style.menuBorder + border.width: 1 + color: Style.backgroundColor + } + + Image { + id: searchIcon + anchors { + top: parent.top + left: parent.left + bottom: parent.bottom + margins: 4 + } + + width: height + + smooth: true + antialiasing: true + mipmap: true + fillMode: Image.PreserveAspectFit + horizontalAlignment: Image.AlignLeft + + source: "image://svgimage-custom-color/search.svg" + "/" + root.placeholderColor + sourceSize: Qt.size(parent.height * root.iconsScaleFactor, parent.height * root.iconsScaleFactor) + + visible: !root.shareeModel.fetchOngoing + } + + NCBusyIndicator { + id: busyIndicator + + anchors { + top: parent.top + left: parent.left + bottom: parent.bottom + } + + width: height + color: root.placeholderColor + visible: root.shareeModel.fetchOngoing + running: visible + } + + Image { + id: clearTextButton + + anchors { + top: parent.top + right: parent.right + bottom: parent.bottom + margins: 4 + } + + width: height + + smooth: true + antialiasing: true + mipmap: true + fillMode: Image.PreserveAspectFit + + source: "image://svgimage-custom-color/clear.svg" + "/" + root.placeholderColor + sourceSize: Qt.size(parent.height * root.iconsScaleFactor, parent.height * root.iconsScaleFactor) + + visible: root.text + + MouseArea { + id: clearTextButtonMouseArea + anchors.fill: parent + onClicked: root.clear() + } + } + + Popup { + id: suggestionsPopup + + width: root.width + height: 100 + y: root.height + + // TODO: Rather than setting all these palette colours manually, + // create a custom style and do it for all components globally + palette { + text: Style.ncTextColor + windowText: Style.ncTextColor + buttonText: Style.ncTextColor + light: Style.lightHover + midlight: Style.lightHover + mid: Style.ncSecondaryTextColor + dark: Style.menuBorder + button: Style.menuBorder + window: Style.backgroundColor + base: Style.backgroundColor + } + + contentItem: ScrollView { + id: suggestionsScrollView + + clip: true + ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + + ListView { + id: shareeListView + + spacing: 0 + currentIndex: -1 + interactive: true + + highlight: Rectangle { + width: shareeListView.currentItem.width + height: shareeListView.currentItem.height + color: Style.lightHover + } + highlightFollowsCurrentItem: true + highlightMoveDuration: 0 + highlightResizeDuration: 0 + highlightRangeMode: ListView.ApplyRange + preferredHighlightBegin: 0 + preferredHighlightEnd: suggestionsScrollView.height + + onCountChanged: root.triggerSuggestionsVisibility() + + model: root.shareeModel + delegate: ShareeDelegate { + anchors.left: parent.left + anchors.right: parent.right + + function selectSharee() { + root.shareeSelected(model.sharee); + suggestionsPopup.close(); + + root.clear(); + } + + onHoveredChanged: if (hovered) { + // When we set the currentIndex the list view will scroll... + // unless we tamper with the preferred highlight points to stop this. + const savedPreferredHighlightBegin = shareeListView.preferredHighlightBegin; + const savedPreferredHighlightEnd = shareeListView.preferredHighlightEnd; + // Set overkill values to make sure no scroll happens when we hover with mouse + shareeListView.preferredHighlightBegin = -suggestionsScrollView.height; + shareeListView.preferredHighlightEnd = suggestionsScrollView.height * 2; + + shareeListView.currentIndex = index + + // Reset original values so keyboard navigation makes list view scroll + shareeListView.preferredHighlightBegin = savedPreferredHighlightBegin; + shareeListView.preferredHighlightEnd = savedPreferredHighlightEnd; + } + onClicked: selectSharee() + } + } + } + } +} diff --git a/src/gui/filedetails/filedetails.cpp b/src/gui/filedetails/filedetails.cpp new file mode 100644 index 000000000..2f0e29a10 --- /dev/null +++ b/src/gui/filedetails/filedetails.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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 + +#include "filedetails.h" +#include "folderman.h" + +namespace OCC { + +Q_LOGGING_CATEGORY(lcFileDetails, "nextcloud.gui.filedetails", QtInfoMsg) + +FileDetails::FileDetails(QObject *parent) + : QObject(parent) +{ + _filelockStateUpdateTimer.setInterval(6000); + _filelockStateUpdateTimer.setSingleShot(false); + connect(&_filelockStateUpdateTimer, &QTimer::timeout, this, &FileDetails::updateLockExpireString); +} + +void FileDetails::refreshFileDetails() +{ + _fileInfo.refresh(); + Q_EMIT fileChanged(); +} + +QString FileDetails::localPath() const +{ + return _localPath; +} + +void FileDetails::setLocalPath(const QString &localPath) +{ + if(localPath.isEmpty()) { + return; + } + + if(!_localPath.isEmpty()) { + _fileWatcher.removePath(_localPath); + } + + if(_fileInfo.exists()) { + disconnect(&_fileWatcher, &QFileSystemWatcher::fileChanged, this, &FileDetails::refreshFileDetails); + } + + _localPath = localPath; + _fileInfo = QFileInfo(localPath); + + _fileWatcher.addPath(localPath); + connect(&_fileWatcher, &QFileSystemWatcher::fileChanged, this, &FileDetails::refreshFileDetails); + + const auto folder = FolderMan::instance()->folderForPath(_localPath); + const auto file = _localPath.mid(folder->cleanPath().length() + 1); + + if (!folder->journalDb()->getFileRecord(file, &_fileRecord)) { + qCWarning(lcFileDetails) << "Invalid file record for path:" + << _localPath + << "will not load file details."; + } + + _filelockState = _fileRecord._lockstate; + updateLockExpireString(); + + Q_EMIT fileChanged(); +} + +QString FileDetails::name() const +{ + return _fileInfo.fileName(); +} + +QString FileDetails::sizeString() const +{ + return _locale.formattedDataSize(_fileInfo.size()); +} + +QString FileDetails::lastChangedString() const +{ + static constexpr auto secsInMinute = 60; + static constexpr auto secsInHour = secsInMinute * 60; + static constexpr auto secsInDay = secsInHour * 24; + static constexpr auto secsInMonth = secsInDay * 30; + static constexpr auto secsInYear = secsInMonth * 12; + + const auto elapsedSecs = _fileInfo.lastModified().secsTo(QDateTime::currentDateTime()); + + if(elapsedSecs < 60) { + const auto elapsedSecsAsInt = static_cast(elapsedSecs); + return tr("%1 second(s) ago", "seconds elapsed since file last modified", elapsedSecsAsInt).arg(elapsedSecsAsInt); + } else if (elapsedSecs < secsInHour) { + const auto elapsedMinutes = static_cast(elapsedSecs / secsInMinute); + return tr("%1 minute(s) ago", "minutes elapsed since file last modified", elapsedMinutes).arg(elapsedMinutes); + } else if (elapsedSecs < secsInDay) { + const auto elapsedHours = static_cast(elapsedSecs / secsInHour); + return tr("%1 hour(s) ago", "hours elapsed since file last modified", elapsedHours).arg(elapsedHours); + } else if (elapsedSecs < secsInMonth) { + const auto elapsedDays = static_cast(elapsedSecs / secsInDay); + return tr("%1 day(s) ago", "days elapsed since file last modified", elapsedDays).arg(elapsedDays); + } else if (elapsedSecs < secsInYear) { + const auto elapsedMonths = static_cast(elapsedSecs / secsInMonth); + return tr("%1 month(s) ago", "months elapsed since file last modified", elapsedMonths).arg(elapsedMonths); + } else { + const auto elapsedYears = static_cast(elapsedSecs / secsInYear); + return tr("%1 year(s) ago", "years elapsed since file last modified", elapsedYears).arg(elapsedYears); + } +} + +QString FileDetails::iconUrl() const +{ + return QStringLiteral("image://tray-image-provider/:/fileicon") + _localPath; +} + +QString FileDetails::lockExpireString() const +{ + return _lockExpireString; +} + +void FileDetails::updateLockExpireString() +{ + if(!_filelockState._locked) { + _filelockStateUpdateTimer.stop(); + _lockExpireString = QString(); + Q_EMIT lockExpireStringChanged(); + return; + } + + if(!_filelockStateUpdateTimer.isActive()) { + _filelockStateUpdateTimer.start(); + } + + static constexpr auto SECONDS_PER_MINUTE = 60; + const auto lockExpirationTime = _filelockState._lockTime + _filelockState._lockTimeout; + const auto remainingTime = QDateTime::currentDateTime().secsTo(QDateTime::fromSecsSinceEpoch(lockExpirationTime)); + const auto remainingTimeInMinutes = static_cast(remainingTime > 0 ? remainingTime / SECONDS_PER_MINUTE : 0); + + _lockExpireString = tr("Locked by %1 - Expires in %2 minute(s)", "remaining time before lock expires", remainingTimeInMinutes).arg(_filelockState._lockOwnerDisplayName).arg(remainingTimeInMinutes); + Q_EMIT lockExpireStringChanged(); +} + +bool FileDetails::isFolder() const +{ + return _fileInfo.isDir(); +} + +} // namespace OCC diff --git a/src/gui/filedetails/filedetails.h b/src/gui/filedetails/filedetails.h new file mode 100644 index 000000000..3a5d1e529 --- /dev/null +++ b/src/gui/filedetails/filedetails.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include +#include +#include + +#include "common/syncjournalfilerecord.h" + +namespace OCC { + +class FileDetails : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString localPath READ localPath WRITE setLocalPath NOTIFY localPathChanged) + Q_PROPERTY(QString name READ name NOTIFY fileChanged) + Q_PROPERTY(QString sizeString READ sizeString NOTIFY fileChanged) + Q_PROPERTY(QString lastChangedString READ lastChangedString NOTIFY fileChanged) + Q_PROPERTY(QString iconUrl READ iconUrl NOTIFY fileChanged) + Q_PROPERTY(QString lockExpireString READ lockExpireString NOTIFY lockExpireStringChanged) + Q_PROPERTY(bool isFolder READ isFolder NOTIFY isFolderChanged) + +public: + explicit FileDetails(QObject *parent = nullptr); + + [[nodiscard]] QString localPath() const; + [[nodiscard]] QString name() const; + [[nodiscard]] QString sizeString() const; + [[nodiscard]] QString lastChangedString() const; + [[nodiscard]] QString iconUrl() const; + [[nodiscard]] QString lockExpireString() const; + [[nodiscard]] bool isFolder() const; + +public slots: + void setLocalPath(const QString &localPath); + +signals: + void localPathChanged(); + void fileChanged(); + void lockExpireStringChanged(); + void isFolderChanged(); + +private slots: + void refreshFileDetails(); + void updateLockExpireString(); + +private: + QString _localPath; + + QFileInfo _fileInfo; + QFileSystemWatcher _fileWatcher; + SyncJournalFileRecord _fileRecord; + SyncJournalFileLockInfo _filelockState; + QByteArray _numericFileId; + QString _lockExpireString; + QTimer _filelockStateUpdateTimer; + + QLocale _locale; +}; + +} // namespace OCC diff --git a/src/gui/filedetails/shareemodel.cpp b/src/gui/filedetails/shareemodel.cpp new file mode 100644 index 000000000..13ced59dc --- /dev/null +++ b/src/gui/filedetails/shareemodel.cpp @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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 "shareemodel.h" + +#include +#include +#include + +#include "ocsshareejob.h" + +namespace OCC { + +Q_LOGGING_CATEGORY(lcShareeModel, "com.nextcloud.shareemodel") + +ShareeModel::ShareeModel(QObject *parent) + : QAbstractListModel(parent) +{ + _searchRateLimitingTimer.setSingleShot(true); + _searchRateLimitingTimer.setInterval(500); + connect(&_searchRateLimitingTimer, &QTimer::timeout, this, &ShareeModel::fetch); +} + +// ---------------------- QAbstractListModel methods ---------------------- // + +int ShareeModel::rowCount(const QModelIndex &parent) const +{ + if(parent.isValid() || !_accountState) { + return 0; + } + + return _sharees.count(); +} + +QHash ShareeModel::roleNames() const +{ + auto roles = QAbstractListModel::roleNames(); + roles[ShareeRole] = "sharee"; + roles[AutoCompleterStringMatchRole] = "autoCompleterStringMatch"; + + return roles; +} + +QVariant ShareeModel::data(const QModelIndex &index, const int role) const +{ + Q_ASSERT(checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid | QAbstractItemModel::CheckIndexOption::ParentIsInvalid)); + + const auto sharee = _sharees.at(index.row()); + + if(sharee.isNull()) { + return {}; + } + + switch(role) { + case Qt::DisplayRole: + return sharee->format(); + case AutoCompleterStringMatchRole: + // Don't show this to the user + return QString(sharee->displayName() + " (" + sharee->shareWith() + ")"); + case ShareeRole: + return QVariant::fromValue(sharee); + } + + qCWarning(lcShareeModel) << "Got unknown role" << role << "returning null value."; + return {}; +} + +// --------------------------- QPROPERTY methods --------------------------- // + +AccountState *ShareeModel::accountState() const +{ + return _accountState; +} + +void ShareeModel::setAccountState(AccountState *accountState) +{ + if (accountState == _accountState) { + return; + } + + _accountState = accountState; + Q_EMIT accountStateChanged(); +} + +bool ShareeModel::shareItemIsFolder() const +{ + return _shareItemIsFolder; +} + +void ShareeModel::setShareItemIsFolder(const bool shareItemIsFolder) +{ + if (shareItemIsFolder == _shareItemIsFolder) { + return; + } + + _shareItemIsFolder = shareItemIsFolder; + Q_EMIT shareItemIsFolderChanged(); +} + +QString ShareeModel::searchString() const +{ + return _searchString; +} + +void ShareeModel::setSearchString(const QString &searchString) +{ + if (searchString == _searchString) { + return; + } + + _searchString = searchString; + Q_EMIT searchStringChanged(); + + _searchRateLimitingTimer.start(); +} + +bool ShareeModel::fetchOngoing() const +{ + return _fetchOngoing; +} + +ShareeModel::LookupMode ShareeModel::lookupMode() const +{ + return _lookupMode; +} + +void ShareeModel::setLookupMode(const ShareeModel::LookupMode lookupMode) +{ + if (lookupMode == _lookupMode) { + return; + } + + _lookupMode = lookupMode; + Q_EMIT lookupModeChanged(); +} + +QVariantList ShareeModel::shareeBlocklist() const +{ + QVariantList returnSharees; + for (const auto &sharee : _shareeBlocklist) { + returnSharees.append(QVariant::fromValue(sharee)); + } + return returnSharees; +} + +void ShareeModel::setShareeBlocklist(const QVariantList shareeBlocklist) +{ + _shareeBlocklist.clear(); + for (const auto &sharee : shareeBlocklist) { + _shareeBlocklist.append(sharee.value()); + } + Q_EMIT shareeBlocklistChanged(); + + filterSharees(); +} + +// ------------------------- Internal data methods ------------------------- // + +void ShareeModel::fetch() +{ + if(!_accountState || !_accountState->account() || _searchString.isEmpty()) { + qCInfo(lcShareeModel) << "Not fetching sharees for searchString: " << _searchString; + return; + } + + _fetchOngoing = true; + Q_EMIT fetchOngoingChanged(); + + const auto shareItemTypeString = _shareItemIsFolder ? QStringLiteral("folder") : QStringLiteral("file"); + + auto *job = new OcsShareeJob(_accountState->account()); + + connect(job, &OcsShareeJob::shareeJobFinished, this, &ShareeModel::shareesFetched); + connect(job, &OcsJob::ocsError, this, [&](const int statusCode, const QString &message) { + _fetchOngoing = false; + Q_EMIT fetchOngoingChanged(); + Q_EMIT ShareeModel::displayErrorMessage(statusCode, message); + }); + + job->getSharees(_searchString, shareItemTypeString, 1, 50, _lookupMode == LookupMode::GlobalSearch ? true : false); +} + +void ShareeModel::shareesFetched(const QJsonDocument &reply) +{ + _fetchOngoing = false; + Q_EMIT fetchOngoingChanged(); + + qCInfo(lcShareeModel) << "Reply: " << reply; + + QVector newSharees; + + const QStringList shareeTypes {"users", "groups", "emails", "remotes", "circles", "rooms"}; + + const auto appendSharees = [this, &shareeTypes, &newSharees](const QJsonObject &data) { + for (const auto &shareeType : shareeTypes) { + const auto category = data.value(shareeType).toArray(); + + for (const auto &sharee : category) { + const auto shareeJsonObject = sharee.toObject(); + const auto parsedSharee = parseSharee(shareeJsonObject); + + const auto shareeInBlacklistIt = std::find_if(_shareeBlocklist.cbegin(), + _shareeBlocklist.cend(), + [&parsedSharee](const ShareePtr &blacklistSharee) { + return parsedSharee->type() == blacklistSharee->type() && + parsedSharee->shareWith() == blacklistSharee->shareWith(); + }); + + if (shareeInBlacklistIt != _shareeBlocklist.cend()) { + continue; + } + + newSharees.append(parsedSharee); + } + } + }; + const auto replyDataObject = reply.object().value("ocs").toObject().value("data").toObject(); + const auto replyDataExactMatchObject = replyDataObject.value("exact").toObject(); + + appendSharees(replyDataObject); + appendSharees(replyDataExactMatchObject); + + beginResetModel(); + _sharees = newSharees; + endResetModel(); + + Q_EMIT shareesReady(); +} + +ShareePtr ShareeModel::parseSharee(const QJsonObject &data) const +{ + auto displayName = data.value("label").toString(); + const auto shareWith = data.value("value").toObject().value("shareWith").toString(); + const auto type = (Sharee::Type)data.value("value").toObject().value("shareType").toInt(); + const auto additionalInfo = data.value("value").toObject().value("shareWithAdditionalInfo").toString(); + if (!additionalInfo.isEmpty()) { + displayName = tr("%1 (%2)", "sharee (shareWithAdditionalInfo)").arg(displayName, additionalInfo); + } + + return ShareePtr(new Sharee(shareWith, displayName, type)); +} + +void ShareeModel::filterSharees() +{ + auto it = _sharees.begin(); + + while (it != _sharees.end()) { + const auto sharee = *it; + const auto shareeInBlacklistIt = std::find_if(_shareeBlocklist.cbegin(), _shareeBlocklist.cend(), [&sharee](const ShareePtr &blacklistSharee) { + return sharee->type() == blacklistSharee->type() && + sharee->shareWith() == blacklistSharee->shareWith(); + }); + + if (shareeInBlacklistIt != _shareeBlocklist.end()) { + const auto row = it - _sharees.begin(); + beginRemoveRows({}, row, row); + it = _sharees.erase(it); + endRemoveRows(); + } else { + ++it; + } + } + + Q_EMIT shareesReady(); +} + +} diff --git a/src/gui/filedetails/shareemodel.h b/src/gui/filedetails/shareemodel.h new file mode 100644 index 000000000..3bc1ec83c --- /dev/null +++ b/src/gui/filedetails/shareemodel.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include + +#include "accountstate.h" +#include "sharee.h" + +class QJsonDocument; +class QJsonObject; + +namespace OCC { + +class ShareeModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(AccountState* accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) + Q_PROPERTY(bool shareItemIsFolder READ shareItemIsFolder WRITE setShareItemIsFolder NOTIFY shareItemIsFolderChanged) + Q_PROPERTY(QString searchString READ searchString WRITE setSearchString NOTIFY searchStringChanged) + Q_PROPERTY(bool fetchOngoing READ fetchOngoing NOTIFY fetchOngoingChanged) + Q_PROPERTY(LookupMode lookupMode READ lookupMode WRITE setLookupMode NOTIFY lookupModeChanged) + Q_PROPERTY(QVariantList shareeBlocklist READ shareeBlocklist WRITE setShareeBlocklist NOTIFY shareeBlocklistChanged) + +public: + enum class LookupMode { + LocalSearch = 0, + GlobalSearch = 1, + }; + Q_ENUM(LookupMode); + + enum Roles { + ShareeRole = Qt::UserRole + 1, + AutoCompleterStringMatchRole, + }; + Q_ENUM(Roles); + + explicit ShareeModel(QObject *parent = nullptr); + + using ShareeSet = QVector; // FIXME: make it a QSet when Sharee can be compared + + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QHash roleNames() const override; + [[nodiscard]] QVariant data(const QModelIndex &index, const int role) const override; + + [[nodiscard]] AccountState *accountState() const; + [[nodiscard]] bool shareItemIsFolder() const; + [[nodiscard]] QString searchString() const; + [[nodiscard]] bool fetchOngoing() const; + [[nodiscard]] LookupMode lookupMode() const; + [[nodiscard]] QVariantList shareeBlocklist() const; + +signals: + void accountStateChanged(); + void shareItemIsFolderChanged(); + void searchStringChanged(); + void fetchOngoingChanged(); + void lookupModeChanged(); + void shareeBlocklistChanged(); + + void shareesReady(); + void displayErrorMessage(const int code, const QString &message); + +public slots: + void setAccountState(OCC::AccountState *accountState); + void setShareItemIsFolder(const bool shareItemIsFolder); + void setSearchString(const QString &searchString); + void setLookupMode(const OCC::ShareeModel::LookupMode lookupMode); + void setShareeBlocklist(const QVariantList shareeBlocklist); + + void fetch(); + +private slots: + void shareesFetched(const QJsonDocument &reply); + void filterSharees(); + +private: + [[nodiscard]] ShareePtr parseSharee(const QJsonObject &data) const; + + QTimer _searchRateLimitingTimer; + + AccountState *_accountState; + QString _searchString; + bool _shareItemIsFolder = false; + bool _fetchOngoing = false; + LookupMode _lookupMode = LookupMode::LocalSearch; + + QVector _sharees; + QVector _shareeBlocklist; +}; + +} diff --git a/src/gui/filedetails/sharemodel.cpp b/src/gui/filedetails/sharemodel.cpp new file mode 100644 index 000000000..f6564887c --- /dev/null +++ b/src/gui/filedetails/sharemodel.cpp @@ -0,0 +1,1063 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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 "sharemodel.h" + +#include +#include + +#include "account.h" +#include "folderman.h" +#include "theme.h" +#include "wordlist.h" + +namespace { + +static const auto placeholderLinkShareId = QStringLiteral("__placeholderLinkShareId__"); +static const auto internalLinkShareId = QStringLiteral("__internalLinkShareId__"); + +QString createRandomPassword() +{ + const auto words = OCC::WordList::getRandomWords(10); + + const auto addFirstLetter = [](const QString ¤t, const QString &next) -> QString { + return current + next.at(0); + }; + + return std::accumulate(std::cbegin(words), std::cend(words), QString(), addFirstLetter); +} +} + +namespace OCC { + +Q_LOGGING_CATEGORY(lcShareModel, "com.nextcloud.sharemodel") + +ShareModel::ShareModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +// ---------------------- QAbstractListModel methods ---------------------- // + +int ShareModel::rowCount(const QModelIndex &parent) const +{ + if(parent.isValid() || !_accountState || _localPath.isEmpty()) { + return 0; + } + + return _shares.count(); +} + +QHash ShareModel::roleNames() const +{ + auto roles = QAbstractListModel::roleNames(); + roles[ShareRole] = "share"; + roles[ShareTypeRole] = "shareType"; + roles[ShareIdRole] = "shareId"; + roles[IconUrlRole] = "iconUrl"; + roles[AvatarUrlRole] = "avatarUrl"; + roles[LinkRole] = "link"; + roles[LinkShareNameRole] = "linkShareName"; + roles[LinkShareLabelRole] = "linkShareLabel"; + roles[NoteEnabledRole] = "noteEnabled"; + roles[NoteRole] = "note"; + roles[ExpireDateEnabledRole] = "expireDateEnabled"; + roles[ExpireDateEnforcedRole] = "expireDateEnforced"; + roles[ExpireDateRole] = "expireDate"; + roles[EnforcedMaximumExpireDateRole] = "enforcedMaximumExpireDate"; + roles[PasswordProtectEnabledRole] = "passwordProtectEnabled"; + roles[PasswordRole] = "password"; + roles[PasswordEnforcedRole] = "passwordEnforced"; + roles[EditingAllowedRole] = "editingAllowed"; + + return roles; +} + +QVariant ShareModel::data(const QModelIndex &index, const int role) const +{ + Q_ASSERT(checkIndex(index, QAbstractItemModel::CheckIndexOption::IndexIsValid | QAbstractItemModel::CheckIndexOption::ParentIsInvalid)); + + const auto share = _shares.at(index.row()); + + if (!share) { + return {}; + } + + // Some roles only provide values for the link and user/group share types + if(const auto linkShare = share.objectCast()) { + switch(role) { + case LinkRole: + return linkShare->getLink(); + case LinkShareNameRole: + return linkShare->getName(); + case LinkShareLabelRole: + return linkShare->getLabel(); + case NoteEnabledRole: + return !linkShare->getNote().isEmpty(); + case NoteRole: + return linkShare->getNote(); + case ExpireDateEnabledRole: + return linkShare->getExpireDate().isValid(); + case ExpireDateRole: + { + const auto startOfExpireDayUTC = linkShare->getExpireDate().startOfDay(QTimeZone::utc()); + return startOfExpireDayUTC.toMSecsSinceEpoch(); + } + } + + } else if (const auto userGroupShare = share.objectCast()) { + switch(role) { + case NoteEnabledRole: + return !userGroupShare->getNote().isEmpty(); + case NoteRole: + return userGroupShare->getNote(); + case ExpireDateEnabledRole: + return userGroupShare->getExpireDate().isValid(); + case ExpireDateRole: + { + const auto startOfExpireDayUTC = userGroupShare->getExpireDate().startOfDay(QTimeZone::utc()); + return startOfExpireDayUTC.toMSecsSinceEpoch(); + } + } + } else if (share->getShareType() == Share::TypeInternalLink && role == LinkRole) { + return _privateLinkUrl; + } + + switch(role) { + case Qt::DisplayRole: + return displayStringForShare(share); + case ShareRole: + return QVariant::fromValue(share); + case ShareTypeRole: + return share->getShareType(); + case ShareIdRole: + return share->getId(); + case IconUrlRole: + return iconUrlForShare(share); + case AvatarUrlRole: + return avatarUrlForShare(share); + case ExpireDateEnforcedRole: + return expireDateEnforcedForShare(share); + case EnforcedMaximumExpireDateRole: + return enforcedMaxExpireDateForShare(share); + case PasswordProtectEnabledRole: + return share->isPasswordSet(); + case PasswordRole: + if (!share->isPasswordSet() || !_shareIdRecentlySetPasswords.contains(share->getId())) { + return {}; + } + return _shareIdRecentlySetPasswords.value(share->getId()); + case PasswordEnforcedRole: + return _accountState && _accountState->account() && _accountState->account()->capabilities().isValid() && + ((share->getShareType() == Share::TypeEmail && _accountState->account()->capabilities().shareEmailPasswordEnforced()) || + (share->getShareType() == Share::TypeLink && _accountState->account()->capabilities().sharePublicLinkEnforcePassword())); + case EditingAllowedRole: + return share->getPermissions().testFlag(SharePermissionUpdate); + + // Deal with roles that only return certain values for link or user/group share types + case NoteEnabledRole: + case ExpireDateEnabledRole: + return false; + case LinkRole: + case LinkShareNameRole: + case LinkShareLabelRole: + case NoteRole: + case ExpireDateRole: + return {}; + } + + qCWarning(lcShareModel) << "Got unknown role" << role + << "for share of type" << share->getShareType() + << "so returning null value."; + return {}; +} + +// ---------------------- Internal model data methods ---------------------- // + +void ShareModel::resetData() +{ + beginResetModel(); + + _folder = nullptr; + _sharePath.clear(); + _maxSharingPermissions = {}; + _numericFileId.clear(); + _privateLinkUrl.clear(); + _filelockState = {}; + _manager.clear(); + _shares.clear(); + _fetchOngoing = false; + _hasInitialShareFetchCompleted = false; + _sharees.clear(); + + Q_EMIT sharePermissionsChanged(); + Q_EMIT fetchOngoingChanged(); + Q_EMIT hasInitialShareFetchCompletedChanged(); + Q_EMIT shareesChanged(); + + endResetModel(); +} + +void ShareModel::updateData() +{ + resetData(); + + if (_localPath.isEmpty() || !_accountState || _accountState->account().isNull()) { + qCWarning(lcShareModel) << "Not updating share model data. Local path is:" << _localPath + << "Is account state null:" << !_accountState; + return; + } + + if (!sharingEnabled()) { + qCWarning(lcShareModel) << "Server does not support sharing"; + return; + } + + _folder = FolderMan::instance()->folderForPath(_localPath); + + if (!_folder) { + qCWarning(lcShareModel) << "Could not update share model data for" << _localPath << "no responsible folder found"; + resetData(); + return; + } + + qCDebug(lcShareModel) << "Updating share model data now."; + + const auto relPath = _localPath.mid(_folder->cleanPath().length() + 1); + _sharePath = _folder->remotePathTrailingSlash() + relPath; + + SyncJournalFileRecord fileRecord; + auto resharingAllowed = true; // lets assume the good + + if(_folder->journalDb()->getFileRecord(relPath, &fileRecord) && fileRecord.isValid()) { + if (!fileRecord._remotePerm.isNull() && + !fileRecord._remotePerm.hasPermission(RemotePermissions::CanReshare)) { + + resharingAllowed = false; + } + } + + _maxSharingPermissions = resharingAllowed ? SharePermissions(_accountState->account()->capabilities().shareDefaultPermissions()) : SharePermissions({}); + Q_EMIT sharePermissionsChanged(); + + _numericFileId = fileRecord.numericFileId(); + + // Will get added when shares are fetched if no link shares are fetched + _placeholderLinkShare.reset(new Share(_accountState->account(), + placeholderLinkShareId, + _accountState->account()->id(), + _accountState->account()->davDisplayName(), + _sharePath, + Share::TypePlaceholderLink)); + + _internalLinkShare.reset(new Share(_accountState->account(), + internalLinkShareId, + _accountState->account()->id(), + _accountState->account()->davDisplayName(), + _sharePath, + Share::TypeInternalLink)); + + auto job = new PropfindJob(_accountState->account(), _sharePath); + job->setProperties( + QList() + << "http://open-collaboration-services.org/ns:share-permissions" + << "http://owncloud.org/ns:fileid" // numeric file id for fallback private link generation + << "http://owncloud.org/ns:privatelink"); + job->setTimeout(10 * 1000); + connect(job, &PropfindJob::result, this, &ShareModel::slotPropfindReceived); + connect(job, &PropfindJob::finishedWithError, this, [&](const QNetworkReply *reply) { + qCWarning(lcShareModel) << "Propfind for" << _sharePath << "failed"; + _fetchOngoing = false; + Q_EMIT fetchOngoingChanged(); + Q_EMIT serverError(reply->error(), reply->errorString()); + }); + + _fetchOngoing = true; + Q_EMIT fetchOngoingChanged(); + job->start(); + + initShareManager(); +} + +void ShareModel::initShareManager() +{ + if (!_accountState || _accountState->account().isNull()) { + return; + } + + bool sharingPossible = true; + if (!publicLinkSharesEnabled()) { + qCWarning(lcSharing) << "Link shares have been disabled"; + sharingPossible = false; + } else if (!canShare()) { + qCWarning(lcSharing) << "The file cannot be shared because it does not have sharing permission."; + sharingPossible = false; + } + + if (_manager.isNull() && sharingPossible) { + _manager.reset(new ShareManager(_accountState->account(), this)); + connect(_manager.data(), &ShareManager::sharesFetched, this, &ShareModel::slotSharesFetched); + connect(_manager.data(), &ShareManager::shareCreated, this, [&]{ _manager->fetchShares(_sharePath); }); + connect(_manager.data(), &ShareManager::linkShareCreated, this, &ShareModel::slotAddShare); + connect(_manager.data(), &ShareManager::linkShareRequiresPassword, this, &ShareModel::requestPasswordForLinkShare); + connect(_manager.data(), &ShareManager::serverError, this, [this](const int code, const QString &message){ + _hasInitialShareFetchCompleted = true; + Q_EMIT hasInitialShareFetchCompletedChanged(); + emit serverError(code, message); + }); + + _manager->fetchShares(_sharePath); + } +} + +void ShareModel::handlePlaceholderLinkShare() +{ + // We want to add the placeholder if there are no link shares and + // if we are not already showing the placeholder link share + auto linkSharePresent = false; + auto placeholderLinkSharePresent = false; + + for (const auto &share : qAsConst(_shares)) { + const auto shareType = share->getShareType(); + + if (!linkSharePresent && shareType == Share::TypeLink) { + linkSharePresent = true; + } else if (!placeholderLinkSharePresent && shareType == Share::TypePlaceholderLink) { + placeholderLinkSharePresent = true; + } + + if(linkSharePresent && placeholderLinkSharePresent) { + break; + } + } + + if (linkSharePresent && placeholderLinkSharePresent) { + slotRemoveShareWithId(placeholderLinkShareId); + } else if (!linkSharePresent && !placeholderLinkSharePresent) { + slotAddShare(_placeholderLinkShare); + } +} + +void ShareModel::slotPropfindReceived(const QVariantMap &result) +{ + _fetchOngoing = false; + Q_EMIT fetchOngoingChanged(); + + const QVariant receivedPermissions = result["share-permissions"]; + if (!receivedPermissions.toString().isEmpty()) { + _maxSharingPermissions = static_cast(receivedPermissions.toInt()); + Q_EMIT sharePermissionsChanged(); + qCInfo(lcShareModel) << "Received sharing permissions for" << _sharePath << _maxSharingPermissions; + } + + const auto privateLinkUrl = result["privatelink"].toString(); + const auto numericFileId = result["fileid"].toByteArray(); + + if (!privateLinkUrl.isEmpty()) { + qCInfo(lcShareModel) << "Received private link url for" << _sharePath << privateLinkUrl; + _privateLinkUrl = privateLinkUrl; + } else if (!numericFileId.isEmpty()) { + qCInfo(lcShareModel) << "Received numeric file id for" << _sharePath << numericFileId; + _privateLinkUrl = _accountState->account()->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded); + } + + setupInternalLinkShare(); +} + +void ShareModel::slotSharesFetched(const QList &shares) +{ + if(!_hasInitialShareFetchCompleted) { + _hasInitialShareFetchCompleted = true; + Q_EMIT hasInitialShareFetchCompletedChanged(); + } + + qCInfo(lcSharing) << "Fetched" << shares.count() << "shares"; + + for (const auto &share : shares) { + if (share.isNull() || + share->account().isNull() || + share->getUidOwner() != share->account()->davUser()) { + + continue; + } + + slotAddShare(share); + } + + handlePlaceholderLinkShare(); +} + +void ShareModel::setupInternalLinkShare() +{ + if (!_accountState || + _accountState->account().isNull() || + _localPath.isEmpty() || + _privateLinkUrl.isEmpty()) { + return; + } + + beginInsertRows({}, _shares.count(), _shares.count()); + _shares.append(_internalLinkShare); + endInsertRows(); + Q_EMIT internalLinkReady(); +} + +void ShareModel::slotAddShare(const SharePtr &share) +{ + if (share.isNull()) { + return; + } + + const auto shareId = share->getId(); + QModelIndex shareModelIndex; + + if (_shareIdIndexHash.contains(shareId)) { + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareIndex = sharePersistentModelIndex.row(); + + _shares.replace(shareIndex, share); + + shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex); + } else { + const auto shareIndex = _shares.count(); + + beginInsertRows({}, _shares.count(), _shares.count()); + _shares.append(share); + endInsertRows(); + + slotAddSharee(share->getShareWith()); + + shareModelIndex = index(shareIndex); + } + + const QPersistentModelIndex sharePersistentIndex(shareModelIndex); + _shareIdIndexHash.insert(shareId, sharePersistentIndex); + + connect(share.data(), &Share::serverError, this, &ShareModel::slotServerError); + connect(share.data(), &Share::passwordSetError, this, [this, shareId](const int code, const QString &message) { + _shareIdRecentlySetPasswords.remove(shareId); + slotSharePasswordSet(shareId); + Q_EMIT passwordSetError(shareId, code, message); + }); + + // Passing shareId by reference here will cause crashing, so we pass by value + connect(share.data(), &Share::shareDeleted, this, [this, shareId]{ slotRemoveShareWithId(shareId); }); + connect(share.data(), &Share::permissionsSet, this, [this, shareId]{ slotSharePermissionsSet(shareId); }); + connect(share.data(), &Share::passwordSet, this, [this, shareId]{ slotSharePasswordSet(shareId); }); + + if (const auto linkShare = share.objectCast()) { + connect(linkShare.data(), &LinkShare::noteSet, this, [this, shareId]{ slotShareNoteSet(shareId); }); + connect(linkShare.data(), &LinkShare::nameSet, this, [this, shareId]{ slotShareNameSet(shareId); }); + connect(linkShare.data(), &LinkShare::labelSet, this, [this, shareId]{ slotShareLabelSet(shareId); }); + connect(linkShare.data(), &LinkShare::expireDateSet, this, [this, shareId]{ slotShareExpireDateSet(shareId); }); + } else if (const auto userGroupShare = share.objectCast()) { + connect(userGroupShare.data(), &UserGroupShare::noteSet, this, [this, shareId]{ slotShareNoteSet(shareId); }); + connect(userGroupShare.data(), &UserGroupShare::expireDateSet, this, [this, shareId]{ slotShareExpireDateSet(shareId); }); + } + + if (_manager) { + connect(_manager.data(), &ShareManager::serverError, this, &ShareModel::slotServerError); + } + + handlePlaceholderLinkShare(); + Q_EMIT sharesChanged(); +} + +void ShareModel::slotRemoveShareWithId(const QString &shareId) +{ + if (_shares.empty() || shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + _shareIdRecentlySetPasswords.remove(shareId); + const auto shareIndex = _shareIdIndexHash.take(shareId); + + if (!checkIndex(shareIndex, QAbstractItemModel::CheckIndexOption::IndexIsValid | QAbstractItemModel::CheckIndexOption::ParentIsInvalid)) { + qCWarning(lcShareModel) << "Won't remove share with id:" << shareId + << ", invalid share index: " << shareIndex; + return; + } + + const auto share = shareIndex.data(ShareModel::ShareRole).value(); + const auto sharee = share->getShareWith(); + slotRemoveSharee(sharee); + + beginRemoveRows({}, shareIndex.row(), shareIndex.row()); + _shares.removeAt(shareIndex.row()); + endRemoveRows(); + + handlePlaceholderLinkShare(); + + Q_EMIT sharesChanged(); +} + +void ShareModel::slotServerError(const int code, const QString &message) +{ + qCWarning(lcShareModel) << "Error from server" << code << message; + Q_EMIT serverError(code, message); +} + +void ShareModel::slotAddSharee(const ShareePtr &sharee) +{ + if(!sharee) { + return; + } + + _sharees.append(sharee); + Q_EMIT shareesChanged(); +} + +void ShareModel::slotRemoveSharee(const ShareePtr &sharee) +{ + _sharees.removeAll(sharee); + Q_EMIT shareesChanged(); +} + +QString ShareModel::displayStringForShare(const SharePtr &share) const +{ + if (const auto linkShare = share.objectCast()) { + const auto displayString = tr("Share link"); + + if (!linkShare->getLabel().isEmpty()) { + return QStringLiteral("%1 (%2)").arg(displayString, linkShare->getLabel()); + } + + return displayString; + } else if (share->getShareType() == Share::TypePlaceholderLink) { + return tr("Link share"); + } else if (share->getShareType() == Share::TypeInternalLink) { + return tr("Internal link"); + } else if (share->getShareWith()) { + return share->getShareWith()->format(); + } + + qCWarning(lcShareModel) << "Unable to provide good display string for share"; + return QStringLiteral("Share"); +} + +QString ShareModel::iconUrlForShare(const SharePtr &share) const +{ + const auto iconsPath = QStringLiteral("image://svgimage-custom-color/"); + + switch(share->getShareType()) { + case Share::TypeInternalLink: + return QString(iconsPath + QStringLiteral("external.svg")); + case Share::TypePlaceholderLink: + case Share::TypeLink: + return QString(iconsPath + QStringLiteral("public.svg")); + case Share::TypeEmail: + return QString(iconsPath + QStringLiteral("email.svg")); + case Share::TypeRoom: + return QString(iconsPath + QStringLiteral("wizard-talk.svg")); + case Share::TypeUser: + return QString(iconsPath + QStringLiteral("user.svg")); + case Share::TypeGroup: + return QString(iconsPath + QStringLiteral("wizard-groupware.svg")); + default: + return {}; + } +} + +QString ShareModel::avatarUrlForShare(const SharePtr &share) const +{ + if (share->getShareWith() && share->getShareWith()->type() == Sharee::User && _accountState && _accountState->account()) { + const auto provider = QStringLiteral("image://tray-image-provider/"); + const auto userId = share->getShareWith()->shareWith(); + const auto avatarUrl = Utility::concatUrlPath(_accountState->account()->url(), + QString("remote.php/dav/avatars/%1/%2.png").arg(userId, QString::number(64))).toString(); + return QString(provider + avatarUrl); + } + + return {}; +} + +long long ShareModel::enforcedMaxExpireDateForShare(const SharePtr &share) const +{ + if (!_accountState || !_accountState->account() || !_accountState->account()->capabilities().isValid()) { + return {}; + } + + auto expireDays = -1; + + // Both public links and emails count as "public" shares + if ((share->getShareType() == Share::TypeLink || share->getShareType() == Share::TypeEmail) + && _accountState->account()->capabilities().sharePublicLinkEnforceExpireDate()) { + expireDays = _accountState->account()->capabilities().sharePublicLinkExpireDateDays(); + + } else if (share->getShareType() == Share::TypeRemote && _accountState->account()->capabilities().shareRemoteEnforceExpireDate()) { + expireDays = _accountState->account()->capabilities().shareRemoteExpireDateDays(); + + } else if ((share->getShareType() == Share::TypeUser || + share->getShareType() == Share::TypeGroup || + share->getShareType() == Share::TypeCircle || + share->getShareType() == Share::TypeRoom) && + _accountState->account()->capabilities().shareInternalEnforceExpireDate()) { + expireDays = _accountState->account()->capabilities().shareInternalExpireDateDays(); + + } else { + return {}; + } + + const auto expireDateTime = QDate::currentDate().addDays(expireDays).startOfDay(QTimeZone::utc()); + return expireDateTime.toMSecsSinceEpoch(); +} + +bool ShareModel::expireDateEnforcedForShare(const SharePtr &share) const +{ + if(!_accountState || !_accountState->account() || !_accountState->account()->capabilities().isValid()) { + return false; + } + + // Both public links and emails count as "public" shares + if (share->getShareType() == Share::TypeLink || + share->getShareType() == Share::TypeEmail) { + return _accountState->account()->capabilities().sharePublicLinkEnforceExpireDate(); + + } else if (share->getShareType() == Share::TypeRemote) { + return _accountState->account()->capabilities().shareRemoteEnforceExpireDate(); + + } else if (share->getShareType() == Share::TypeUser || + share->getShareType() == Share::TypeGroup || + share->getShareType() == Share::TypeCircle || + share->getShareType() == Share::TypeRoom) { + return _accountState->account()->capabilities().shareInternalEnforceExpireDate(); + + } + + return false; +} + +// ----------------- Shares modified signal handling slots ----------------- // + +void ShareModel::slotSharePermissionsSet(const QString &shareId) +{ + if (shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex, { EditingAllowedRole }); +} + +void ShareModel::slotSharePasswordSet(const QString &shareId) +{ + if (shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex, { PasswordProtectEnabledRole, PasswordRole }); +} + +void ShareModel::slotShareNoteSet(const QString &shareId) +{ + if (shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex, { NoteEnabledRole, NoteRole }); +} + +void ShareModel::slotShareNameSet(const QString &shareId) +{ + if (shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex, { LinkShareNameRole }); +} + +void ShareModel::slotShareLabelSet(const QString &shareId) +{ + if (shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex, { Qt::DisplayRole, LinkShareLabelRole }); +} + +void ShareModel::slotShareExpireDateSet(const QString &shareId) +{ + if (shareId.isEmpty() || !_shareIdIndexHash.contains(shareId)) { + return; + } + + const auto sharePersistentModelIndex = _shareIdIndexHash.value(shareId); + const auto shareModelIndex = index(sharePersistentModelIndex.row()); + Q_EMIT dataChanged(shareModelIndex, shareModelIndex, { ExpireDateEnabledRole, ExpireDateRole }); +} + +// ----------------------- Shares modification slots ----------------------- // + +void ShareModel::toggleShareAllowEditing(const SharePtr &share, const bool enable) const +{ + if (share.isNull()) { + return; + } + + auto permissions = share->getPermissions(); + enable ? permissions |= SharePermissionUpdate : permissions &= ~SharePermissionUpdate; + + share->setPermissions(permissions); +} + +void ShareModel::toggleShareAllowEditingFromQml(const QVariant &share, const bool enable) const +{ + const auto ptr = share.value(); + toggleShareAllowEditing(ptr, enable); +} + +void ShareModel::toggleShareAllowResharing(const SharePtr &share, const bool enable) const +{ + if (share.isNull()) { + return; + } + + auto permissions = share->getPermissions(); + enable ? permissions |= SharePermissionShare : permissions &= ~SharePermissionShare; + + share->setPermissions(permissions); +} + +void ShareModel::toggleShareAllowResharingFromQml(const QVariant &share, const bool enable) const +{ + const auto ptr = share.value(); + toggleShareAllowResharing(ptr, enable); +} + +void ShareModel::toggleSharePasswordProtect(const SharePtr &share, const bool enable) +{ + if (share.isNull()) { + return; + } + + if(!enable) { + share->setPassword({}); + return; + } + + const auto randomPassword = createRandomPassword(); + _shareIdRecentlySetPasswords.insert(share->getId(), randomPassword); + share->setPassword(randomPassword); +} + +void ShareModel::toggleSharePasswordProtectFromQml(const QVariant &share, const bool enable) +{ + const auto ptr = share.value(); + toggleSharePasswordProtect(ptr, enable); +} + +void ShareModel::toggleShareExpirationDate(const SharePtr &share, const bool enable) const +{ + if (share.isNull()) { + return; + } + + const auto expireDate = enable ? QDate::currentDate().addDays(1) : QDate(); + + if (const auto linkShare = share.objectCast()) { + linkShare->setExpireDate(expireDate); + } else if (const auto userGroupShare = share.objectCast()) { + userGroupShare->setExpireDate(expireDate); + } +} + +void ShareModel::toggleShareExpirationDateFromQml(const QVariant &share, const bool enable) const +{ + const auto ptr = share.value(); + toggleShareExpirationDate(ptr, enable); +} + +void ShareModel::toggleShareNoteToRecipient(const SharePtr &share, const bool enable) const +{ + if (share.isNull()) { + return; + } + + const QString note = enable ? tr("Enter a note for the recipient") : QString(); + if (const auto linkShare = share.objectCast()) { + linkShare->setNote(note); + } else if (const auto userGroupShare = share.objectCast()) { + userGroupShare->setNote(note); + } +} + +void ShareModel::toggleShareNoteToRecipientFromQml(const QVariant &share, const bool enable) const +{ + const auto ptr = share.value(); + toggleShareNoteToRecipient(ptr, enable); +} + +void ShareModel::setLinkShareLabel(const QSharedPointer &linkShare, const QString &label) const +{ + if (linkShare.isNull()) { + return; + } + + linkShare->setLabel(label); +} + +void ShareModel::setLinkShareLabelFromQml(const QVariant &linkShare, const QString &label) const +{ + // All of our internal share pointers are SharePtr, so cast to LinkShare for this method + const auto ptr = linkShare.value().objectCast(); + setLinkShareLabel(ptr, label); +} + +void ShareModel::setShareExpireDate(const SharePtr &share, const qint64 milliseconds) const +{ + if (share.isNull()) { + return; + } + + const auto date = QDateTime::fromMSecsSinceEpoch(milliseconds, QTimeZone::utc()).date(); + + if (const auto linkShare = share.objectCast()) { + linkShare->setExpireDate(date); + } else if (const auto userGroupShare = share.objectCast()) { + userGroupShare->setExpireDate(date); + } +} + +void ShareModel::setShareExpireDateFromQml(const QVariant &share, const QVariant milliseconds) const +{ + const auto ptr = share.value(); + const auto millisecondsLL = milliseconds.toLongLong(); + setShareExpireDate(ptr, millisecondsLL); +} + +void ShareModel::setSharePassword(const SharePtr &share, const QString &password) +{ + if (share.isNull()) { + return; + } + + _shareIdRecentlySetPasswords.insert(share->getId(), password); + share->setPassword(password); +} + +void ShareModel::setSharePasswordFromQml(const QVariant &share, const QString &password) +{ + const auto ptr = share.value(); + setSharePassword(ptr, password); +} + +void ShareModel::setShareNote(const SharePtr &share, const QString ¬e) const +{ + if (share.isNull()) { + return; + } + + if (const auto linkShare = share.objectCast()) { + linkShare->setNote(note); + } else if (const auto userGroupShare = share.objectCast()) { + userGroupShare->setNote(note); + } +} + +void ShareModel::setShareNoteFromQml(const QVariant &share, const QString ¬e) const +{ + const auto ptr = share.value(); + setShareNote(ptr, note); +} + +// ------------------- Share creation and deletion slots ------------------- // + +void ShareModel::createNewLinkShare() const +{ + if (_manager) { + const auto askOptionalPassword = _accountState->account()->capabilities().sharePublicLinkAskOptionalPassword(); + const auto password = askOptionalPassword ? createRandomPassword() : QString(); + _manager->createLinkShare(_sharePath, QString(), password); + } +} + +void ShareModel::createNewLinkShareWithPassword(const QString &password) const +{ + if (_manager) { + _manager->createLinkShare(_sharePath, QString(), password); + } +} + +void ShareModel::createNewUserGroupShare(const ShareePtr &sharee) +{ + if (sharee.isNull()) { + return; + } + + qCInfo(lcShareModel) << "Creating new user/group share for sharee: " << sharee->format(); + + if (sharee->type() == Sharee::Email && + _accountState && + !_accountState->account().isNull() && + _accountState->account()->capabilities().isValid() && + _accountState->account()->capabilities().shareEmailPasswordEnforced()) { + + Q_EMIT requestPasswordForEmailSharee(sharee); + return; + } + + _manager->createShare(_sharePath, + Share::ShareType(sharee->type()), + sharee->shareWith(), + _maxSharingPermissions, + {}); +} + +void ShareModel::createNewUserGroupShareWithPassword(const ShareePtr &sharee, const QString &password) const +{ + if (sharee.isNull()) { + return; + } + + _manager->createShare(_sharePath, + Share::ShareType(sharee->type()), + sharee->shareWith(), + _maxSharingPermissions, + password); +} + +void ShareModel::createNewUserGroupShareFromQml(const QVariant &sharee) +{ + const auto ptr = sharee.value(); + createNewUserGroupShare(ptr); +} + +void ShareModel::createNewUserGroupShareWithPasswordFromQml(const QVariant &sharee, const QString &password) const +{ + const auto ptr = sharee.value(); + createNewUserGroupShareWithPassword(ptr, password); +} + +void ShareModel::deleteShare(const SharePtr &share) const +{ + if(share.isNull()) { + return; + } + + share->deleteShare(); +} + +void ShareModel::deleteShareFromQml(const QVariant &share) const +{ + const auto ptr = share.value(); + deleteShare(ptr); +} + +// --------------------------- QPROPERTY methods --------------------------- // + +QString ShareModel::localPath() const +{ + return _localPath; +} + +void ShareModel::setLocalPath(const QString &localPath) +{ + if (localPath == _localPath) { + return; + } + + _localPath = localPath; + Q_EMIT localPathChanged(); + updateData(); +} + +AccountState *ShareModel::accountState() const +{ + return _accountState; +} + +void ShareModel::setAccountState(AccountState *accountState) +{ + if (accountState == _accountState) { + return; + } + + _accountState = accountState; + + // Change the server and account-related properties + connect(_accountState, &AccountState::stateChanged, this, &ShareModel::accountConnectedChanged); + connect(_accountState, &AccountState::stateChanged, this, &ShareModel::sharingEnabledChanged); + connect(_accountState, &AccountState::stateChanged, this, &ShareModel::publicLinkSharesEnabledChanged); + connect(_accountState, &AccountState::stateChanged, this, &ShareModel::userGroupSharingEnabledChanged); + + Q_EMIT accountStateChanged(); + Q_EMIT accountConnectedChanged(); + Q_EMIT sharingEnabledChanged(); + Q_EMIT publicLinkSharesEnabledChanged(); + Q_EMIT userGroupSharingEnabledChanged(); + updateData(); +} + +bool ShareModel::accountConnected() const +{ + return _accountState && _accountState->isConnected(); +} + +bool ShareModel::sharingEnabled() const +{ + return _accountState && + _accountState->account() && + _accountState->account()->capabilities().isValid() && + _accountState->account()->capabilities().shareAPI(); +} + +bool ShareModel::publicLinkSharesEnabled() const +{ + return Theme::instance()->linkSharing() && + _accountState && + _accountState->account() && + _accountState->account()->capabilities().isValid() && + _accountState->account()->capabilities().sharePublicLink(); +} + +bool ShareModel::userGroupSharingEnabled() const +{ + return Theme::instance()->userGroupSharing(); +} + +bool ShareModel::fetchOngoing() const +{ + return _fetchOngoing; +} + +bool ShareModel::hasInitialShareFetchCompleted() const +{ + return _hasInitialShareFetchCompleted; +} + +bool ShareModel::canShare() const +{ + return _maxSharingPermissions & SharePermissionShare; +} + +QVariantList ShareModel::sharees() const +{ + QVariantList returnSharees; + for (const auto &sharee : _sharees) { + returnSharees.append(QVariant::fromValue(sharee)); + } + return returnSharees; +} + +} // namespace OCC diff --git a/src/gui/filedetails/sharemodel.h b/src/gui/filedetails/sharemodel.h new file mode 100644 index 000000000..05e08fbdc --- /dev/null +++ b/src/gui/filedetails/sharemodel.h @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include + +#include "accountstate.h" +#include "folder.h" +#include "sharemanager.h" +#include "sharepermissions.h" + +namespace OCC { + +class ShareModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(AccountState* accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) + Q_PROPERTY(QString localPath READ localPath WRITE setLocalPath NOTIFY localPathChanged) + Q_PROPERTY(bool accountConnected READ accountConnected NOTIFY accountConnectedChanged) + Q_PROPERTY(bool sharingEnabled READ sharingEnabled NOTIFY sharingEnabledChanged) + Q_PROPERTY(bool publicLinkSharesEnabled READ publicLinkSharesEnabled NOTIFY publicLinkSharesEnabledChanged) + Q_PROPERTY(bool userGroupSharingEnabled READ userGroupSharingEnabled NOTIFY userGroupSharingEnabledChanged) + Q_PROPERTY(bool canShare READ canShare NOTIFY sharePermissionsChanged) + Q_PROPERTY(bool fetchOngoing READ fetchOngoing NOTIFY fetchOngoingChanged) + Q_PROPERTY(bool hasInitialShareFetchCompleted READ hasInitialShareFetchCompleted NOTIFY hasInitialShareFetchCompletedChanged) + Q_PROPERTY(QVariantList sharees READ sharees NOTIFY shareesChanged) + +public: + enum Roles { + ShareRole = Qt::UserRole + 1, + ShareTypeRole, + ShareIdRole, + IconUrlRole, + AvatarUrlRole, + LinkRole, + LinkShareNameRole, + LinkShareLabelRole, + NoteEnabledRole, + NoteRole, + ExpireDateEnabledRole, + ExpireDateEnforcedRole, + ExpireDateRole, + EnforcedMaximumExpireDateRole, + PasswordProtectEnabledRole, + PasswordRole, + PasswordEnforcedRole, + EditingAllowedRole, + }; + Q_ENUM(Roles) + + /** + * Possible share types + * Need to be in sync with Share::ShareType. + * We use this in QML. + */ + enum ShareType { + ShareTypeUser = Share::TypeUser, + ShareTypeGroup = Share::TypeGroup, + ShareTypeLink = Share::TypeLink, + ShareTypeEmail = Share::TypeEmail, + ShareTypeRemote = Share::TypeRemote, + ShareTypeCircle = Share::TypeCircle, + ShareTypeRoom = Share::TypeRoom, + ShareTypePlaceholderLink = Share::TypePlaceholderLink, + ShareTypeInternalLink = Share::TypeInternalLink, + }; + Q_ENUM(ShareType); + + explicit ShareModel(QObject *parent = nullptr); + + [[nodiscard]] QVariant data(const QModelIndex &index, const int role) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QHash roleNames() const override; + + [[nodiscard]] AccountState *accountState() const; + [[nodiscard]] QString localPath() const; + + [[nodiscard]] bool accountConnected() const; + [[nodiscard]] bool sharingEnabled() const; + [[nodiscard]] bool publicLinkSharesEnabled() const; + [[nodiscard]] bool userGroupSharingEnabled() const; + [[nodiscard]] bool canShare() const; + + [[nodiscard]] bool fetchOngoing() const; + [[nodiscard]] bool hasInitialShareFetchCompleted() const; + + [[nodiscard]] QVariantList sharees() const; + +signals: + void localPathChanged(); + void accountStateChanged(); + void accountConnectedChanged(); + void sharingEnabledChanged(); + void publicLinkSharesEnabledChanged(); + void userGroupSharingEnabledChanged(); + void sharePermissionsChanged(); + void lockExpireStringChanged(); + void fetchOngoingChanged(); + void hasInitialShareFetchCompletedChanged(); + void shareesChanged(); + void internalLinkReady(); + + void serverError(const int code, const QString &message); + void passwordSetError(const QString &shareId, const int code, const QString &message); + void requestPasswordForLinkShare(); + void requestPasswordForEmailSharee(const OCC::ShareePtr &sharee); + + void sharesChanged(); + +public slots: + void setAccountState(OCC::AccountState *accountState); + void setLocalPath(const QString &localPath); + + void createNewLinkShare() const; + void createNewLinkShareWithPassword(const QString &password) const; + void createNewUserGroupShare(const OCC::ShareePtr &sharee); + void createNewUserGroupShareFromQml(const QVariant &sharee); + void createNewUserGroupShareWithPassword(const OCC::ShareePtr &sharee, const QString &password) const; + void createNewUserGroupShareWithPasswordFromQml(const QVariant &sharee, const QString &password) const; + + void deleteShare(const OCC::SharePtr &share) const; + void deleteShareFromQml(const QVariant &share) const; + + void toggleShareAllowEditing(const OCC::SharePtr &share, const bool enable) const; + void toggleShareAllowEditingFromQml(const QVariant &share, const bool enable) const; + void toggleShareAllowResharing(const OCC::SharePtr &share, const bool enable) const; + void toggleShareAllowResharingFromQml(const QVariant &share, const bool enable) const; + void toggleSharePasswordProtect(const OCC::SharePtr &share, const bool enable); + void toggleSharePasswordProtectFromQml(const QVariant &share, const bool enable); + void toggleShareExpirationDate(const OCC::SharePtr &share, const bool enable) const; + void toggleShareExpirationDateFromQml(const QVariant &share, const bool enable) const; + void toggleShareNoteToRecipient(const OCC::SharePtr &share, const bool enable) const; + void toggleShareNoteToRecipientFromQml(const QVariant &share, const bool enable) const; + + void setLinkShareLabel(const QSharedPointer &linkShare, const QString &label) const; + void setLinkShareLabelFromQml(const QVariant &linkShare, const QString &label) const; + void setShareExpireDate(const OCC::SharePtr &share, const qint64 milliseconds) const; + // Needed as ints in QML are 32 bits so we need to use a QVariant + void setShareExpireDateFromQml(const QVariant &share, const QVariant milliseconds) const; + void setSharePassword(const OCC::SharePtr &share, const QString &password); + void setSharePasswordFromQml(const QVariant &share, const QString &password); + void setShareNote(const OCC::SharePtr &share, const QString ¬e) const; + void setShareNoteFromQml(const QVariant &share, const QString ¬e) const; + +private slots: + void resetData(); + void updateData(); + void initShareManager(); + void handlePlaceholderLinkShare(); + void setupInternalLinkShare(); + + void slotPropfindReceived(const QVariantMap &result); + void slotServerError(const int code, const QString &message); + void slotAddShare(const OCC::SharePtr &share); + void slotRemoveShareWithId(const QString &shareId); + void slotSharesFetched(const QList &shares); + void slotAddSharee(const OCC::ShareePtr &sharee); + void slotRemoveSharee(const OCC::ShareePtr &sharee); + + void slotSharePermissionsSet(const QString &shareId); + void slotSharePasswordSet(const QString &shareId); + void slotShareNoteSet(const QString &shareId); + void slotShareNameSet(const QString &shareId); + void slotShareLabelSet(const QString &shareId); + void slotShareExpireDateSet(const QString &shareId); + +private: + [[nodiscard]] QString displayStringForShare(const SharePtr &share) const; + [[nodiscard]] QString iconUrlForShare(const SharePtr &share) const; + [[nodiscard]] QString avatarUrlForShare(const SharePtr &share) const; + [[nodiscard]] long long enforcedMaxExpireDateForShare(const SharePtr &share) const; + [[nodiscard]] bool expireDateEnforcedForShare(const SharePtr &share) const; + + bool _fetchOngoing = false; + bool _hasInitialShareFetchCompleted = false; + SharePtr _placeholderLinkShare; + SharePtr _internalLinkShare; + + // DO NOT USE QSHAREDPOINTERS HERE. + // QSharedPointers MUST NOT be used with pointers already assigned to other shared pointers. + // This is because they do not share reference counters, and as such are not aware of another + // smart pointer's use of the same object. + // + // We cannot pass objects instantiated in QML using smart pointers through the property interface + // so we have to pass the pointer here. If we kill the dialog using a smart pointer then + // these objects will be deallocated for the entire application. We do not want that!! + AccountState *_accountState; + Folder *_folder; + + QString _localPath; + QString _sharePath; + SharePermissions _maxSharingPermissions; + QByteArray _numericFileId; + SyncJournalFileLockInfo _filelockState; + QString _privateLinkUrl; + + QSharedPointer _manager; + + QVector _shares; + QHash _shareIdIndexHash; + QHash _shareIdRecentlySetPasswords; + QVector _sharees; +}; + +} // namespace OCC diff --git a/src/gui/filedetails/sortedsharemodel.cpp b/src/gui/filedetails/sortedsharemodel.cpp new file mode 100644 index 000000000..4658060e1 --- /dev/null +++ b/src/gui/filedetails/sortedsharemodel.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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 "sortedsharemodel.h" + +namespace OCC { + +Q_LOGGING_CATEGORY(lcSortedShareModel, "com.nextcloud.sortedsharemodel") + +SortedShareModel::SortedShareModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ +} + +void SortedShareModel::sortModel() +{ + sort(0); +} + +ShareModel *SortedShareModel::shareModel() const +{ + return qobject_cast(sourceModel()); +} + +void SortedShareModel::setShareModel(ShareModel *shareModel) +{ + const auto currentSetModel = sourceModel(); + + if(currentSetModel) { + disconnect(currentSetModel, &ShareModel::rowsInserted, this, &SortedShareModel::sortModel); + disconnect(currentSetModel, &ShareModel::rowsMoved, this, &SortedShareModel::sortModel); + disconnect(currentSetModel, &ShareModel::rowsRemoved, this, &SortedShareModel::sortModel); + disconnect(currentSetModel, &ShareModel::dataChanged, this, &SortedShareModel::sortModel); + disconnect(currentSetModel, &ShareModel::modelReset, this, &SortedShareModel::sortModel); + } + + // Re-sort model when any changes take place + connect(shareModel, &ShareModel::rowsInserted, this, &SortedShareModel::sortModel); + connect(shareModel, &ShareModel::rowsMoved, this, &SortedShareModel::sortModel); + connect(shareModel, &ShareModel::rowsRemoved, this, &SortedShareModel::sortModel); + connect(shareModel, &ShareModel::dataChanged, this, &SortedShareModel::sortModel); + connect(shareModel, &ShareModel::modelReset, this, &SortedShareModel::sortModel); + + setSourceModel(shareModel); + sortModel(); + Q_EMIT shareModelChanged(); +} + +bool SortedShareModel::lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const +{ + if (!sourceLeft.isValid() || !sourceRight.isValid()) { + return false; + } + + const auto leftShare = sourceLeft.data(ShareModel::ShareRole).value(); + const auto rightShare = sourceRight.data(ShareModel::ShareRole).value(); + + if (leftShare.isNull() || rightShare.isNull()) { + return false; + } + + const auto leftShareType = leftShare->getShareType(); + + // Placeholder link shares always go at top + if (leftShareType == Share::TypePlaceholderLink) { + return true; + } else if (leftShareType == Share::TypeInternalLink) { + // Internal links always at bottom + return false; + } + + const auto rightShareType = rightShare->getShareType(); + + // Placeholder link shares always go at top + if (rightShareType == Share::TypePlaceholderLink) { + return false; + } else if (rightShareType == Share::TypeInternalLink) { + // Internal links always at bottom + return true; + } + + // We want to place link shares at the top + if (leftShareType == Share::TypeLink && rightShareType != Share::TypeLink) { + return true; + } else if (rightShareType == Share::TypeLink && leftShareType != Share::TypeLink) { + return false; + } else if (leftShareType != rightShareType) { + return leftShareType < rightShareType; + } + + if (leftShareType == Share::TypeLink) { + const auto leftLinkShare = leftShare.objectCast(); + const auto rightLinkShare = rightShare.objectCast(); + + if(leftLinkShare.isNull() || rightLinkShare.isNull()) { + qCWarning(lcSortedShareModel) << "One of compared shares is a null pointer after conversion despite having same share type. Left link share is null:" << leftLinkShare.isNull() + << "Right link share is null: " << rightLinkShare.isNull(); + return false; + } + + return leftLinkShare->getLabel() < rightLinkShare->getLabel(); + + } else if (leftShare->getShareWith()) { + if(rightShare->getShareWith().isNull()) { + return true; + } + + return leftShare->getShareWith()->format() < rightShare->getShareWith()->format(); + } + + return false; +} + +} // namespace OCC diff --git a/src/gui/filedetails/sortedsharemodel.h b/src/gui/filedetails/sortedsharemodel.h new file mode 100644 index 000000000..9e9db90f5 --- /dev/null +++ b/src/gui/filedetails/sortedsharemodel.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include "sharemodel.h" + +namespace OCC { + +class SortedShareModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(ShareModel* shareModel READ shareModel WRITE setShareModel NOTIFY shareModelChanged) + +public: + explicit SortedShareModel(QObject *parent = nullptr); + + [[nodiscard]] ShareModel *shareModel() const; + +signals: + void shareModelChanged(); + +public slots: + void setShareModel(OCC::ShareModel *shareModel); + +protected: + [[nodiscard]] bool lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const override; + +private slots: + void sortModel(); +}; + +} // namespace OCC diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index bfd16da5e..ea933758d 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -46,8 +46,12 @@ #include #include -static const char versionC[] = "version"; - +namespace { +#ifndef VERSION_C +#define VERSION_C +constexpr auto versionC = "version"; +#endif +} namespace OCC { Q_LOGGING_CATEGORY(lcFolder, "nextcloud.gui.folder", QtInfoMsg) @@ -304,6 +308,10 @@ void Folder::setSyncPaused(bool paused) void Folder::setSyncState(SyncResult::Status state) { + if (_silenceErrorsUntilNextSync && state == SyncResult::Error) { + _syncResult.setStatus(SyncResult::Status::Success); + return; + } _syncResult.setStatus(state); } @@ -577,7 +585,9 @@ void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason) SyncJournalFileRecord record; - _journal.getFileRecord(relativePathBytes, &record); + if (!_journal.getFileRecord(relativePathBytes, &record)) { + qCWarning(lcFolder) << "could not get file from local DB" << relativePathBytes; + } if (reason != ChangeReason::UnLock) { // Check that the mtime/size actually changed or there was // an attribute change (pin state) that caused the notification @@ -613,7 +623,11 @@ void Folder::implicitlyHydrateFile(const QString &relativepath) // Set in the database that we should download the file SyncJournalFileRecord record; - _journal.getFileRecord(relativepath.toUtf8(), &record); + ; + if (!_journal.getFileRecord(relativepath.toUtf8(), &record)) { + qCWarning(lcFolder) << "could not get file from local DB" << relativepath; + return; + } if (!record.isValid()) { qCInfo(lcFolder) << "Did not find file in db"; return; @@ -622,8 +636,14 @@ void Folder::implicitlyHydrateFile(const QString &relativepath) qCInfo(lcFolder) << "The file is not virtual"; return; } + record._type = ItemTypeVirtualFileDownload; - _journal.setFileRecord(record); + + const auto result = _journal.setFileRecord(record); + if (!result) { + qCWarning(lcFolder) << "Error when setting the file record to the database" << record._path << result.error(); + return; + } // Change the file's pin state if it's contradictory to being hydrated // (suffix-virtual file's pin state is stored at the hydrated path) @@ -815,7 +835,8 @@ bool Folder::reloadExcludes() void Folder::startSync(const QStringList &pathList) { - Q_UNUSED(pathList) + Q_UNUSED(pathList); + setSilenceErrorsUntilNextSync(false); const auto singleItemDiscoveryOptions = _engine->singleItemDiscoveryOptions(); Q_ASSERT(!singleItemDiscoveryOptions.discoveryDirItem || singleItemDiscoveryOptions.discoveryDirItem->isDirectory()); if (singleItemDiscoveryOptions.discoveryDirItem && !singleItemDiscoveryOptions.discoveryDirItem->isDirectory()) { @@ -946,8 +967,10 @@ void Folder::setDirtyNetworkLimits() void Folder::slotSyncError(const QString &message, ErrorCategory category) { - _syncResult.appendErrorString(message); - emit ProgressDispatcher::instance()->syncError(alias(), message, category); + if (!_silenceErrorsUntilNextSync) { + _syncResult.appendErrorString(message); + emit ProgressDispatcher::instance()->syncError(alias(), message, category); + } } void Folder::slotAddErrorToGui(SyncFileItem::Status status, const QString &errorMessage, const QString &subject) @@ -982,6 +1005,9 @@ void Folder::slotSyncFinished(bool success) if (syncError) { _syncResult.setStatus(SyncResult::Error); + if (_silenceErrorsUntilNextSync) { + _syncResult.setStatus(SyncResult::Status::Success); + } } else if (_syncResult.foundFilesNotSynced()) { _syncResult.setStatus(SyncResult::Problem); } else if (_definition.paused) { @@ -1135,6 +1161,11 @@ void Folder::slotNextSyncFullLocalDiscovery() _timeSinceLastFullLocalDiscovery.invalidate(); } +void Folder::setSilenceErrorsUntilNextSync(bool silenceErrors) +{ + _silenceErrorsUntilNextSync = silenceErrors; +} + void Folder::schedulePathForLocalDiscovery(const QString &relativePath) { _localDiscoveryTracker->addTouchedPath(relativePath.toUtf8()); @@ -1233,6 +1264,15 @@ void Folder::acceptInvalidFileName(const QString &filePath) _engine->addAcceptedInvalidFileName(filePath); } +void Folder::acceptCaseClashConflictFileName(const QString &filePath) +{ + qCInfo(lcFolder) << "going to delete case clash conflict record" << filePath; + _journal.deleteCaseClashConflictByPathRecord(filePath); + + qCInfo(lcFolder) << "going to delete" << path() + filePath; + FileSystem::remove(path() + filePath); +} + void Folder::setSaveBackwardsCompatible(bool save) { _saveBackwardsCompatible = save; @@ -1253,7 +1293,7 @@ void Folder::registerFolderWatcher() connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable, this, &Folder::slotWatcherUnreliable); _folderWatcher->init(path()); - _folderWatcher->startNotificatonTest(path() + QLatin1String(".owncloudsync.log")); + _folderWatcher->startNotificatonTest(path() + QLatin1String(".nextcloudsync.log")); } bool Folder::virtualFilesEnabled() const @@ -1301,6 +1341,81 @@ void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, std::functio msgBox->open(); } +void Folder::removeLocalE2eFiles() +{ + qCDebug(lcFolder) << "Removing local E2EE files"; + + const QDir folderRootDir(path()); + QStringList e2eFoldersToBlacklist; + const auto couldGetFiles = _journal.getFilesBelowPath("", [this, &e2eFoldersToBlacklist, &folderRootDir](const SyncJournalFileRecord &rec) { + // We only want to add the root-most encrypted folder to the blacklist + if (rec.isValid() && rec._isE2eEncrypted && rec.isDirectory()) { + QDir pathDir(_canonicalLocalPath + rec.path()); + bool parentPathEncrypted = false; + + while (pathDir.cdUp() && pathDir != folderRootDir) { + SyncJournalFileRecord dirRec; + const auto currentCanonicalPath = pathDir.canonicalPath(); + + if (!_journal.getFileRecord(currentCanonicalPath, &dirRec)) { + qCWarning(lcFolder) << "Failed to get file record for" << currentCanonicalPath; + } + + if (dirRec._isE2eEncrypted) { + parentPathEncrypted = true; + break; + } + } + + if (!parentPathEncrypted) { + const auto pathAdjusted = rec._path.endsWith('/') ? rec._path : QString(rec._path + QStringLiteral("/")); + e2eFoldersToBlacklist.append(pathAdjusted); + } + } + }); + + if (!couldGetFiles) { + qCWarning(lcFolder) << "Could not fetch E2EE folders to blacklist in this folder:" << path(); + return; + } else if (e2eFoldersToBlacklist.isEmpty()) { + qCWarning(lcFolder) << "No E2EE folders found at path" << path(); + return; + } + + qCInfo(lcFolder) << "About to blacklist: " << e2eFoldersToBlacklist; + + bool ok = false; + const auto existingBlacklist = _journal.getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok); + Q_ASSERT(ok); + + const auto existingBlacklistSet = existingBlacklist.toSet(); + auto expandedBlacklistSet = existingBlacklist.toSet(); + + for (const auto &path : qAsConst(e2eFoldersToBlacklist)) { + expandedBlacklistSet.insert(path); + } + + // same as in void FolderStatusModel::slotApplySelectiveSync() + // only start sync if blackList has changed + // database lists will get updated during discovery + const auto changes = (existingBlacklistSet - expandedBlacklistSet) + (expandedBlacklistSet - existingBlacklistSet); + + _journal.setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, expandedBlacklistSet.values()); + _journal.setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, changes.values()); + + if (!changes.isEmpty()) { + _journal.setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, QStringList()); + if (isBusy()) { + slotTerminateSync(); + } + for (const auto &it : changes) { + _journal.schedulePathForRemoteDiscovery(it); + schedulePathForLocalDiscovery(it); + } + FolderMan::instance()->scheduleFolderForImmediateSync(this); + } +} + QString Folder::fileFromLocalPath(const QString &localPath) const { return localPath.mid(cleanPath().length() + 1); diff --git a/src/gui/folder.h b/src/gui/folder.h index 87e4e7a4c..9e6de5797 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -92,7 +92,7 @@ public: static QString prepareTargetPath(const QString &path); /// journalPath relative to localPath. - QString absoluteJournalPath() const; + [[nodiscard]] QString absoluteJournalPath() const; /// Returns the relative journal path that's appropriate for this folder and account. QString defaultJournalPath(AccountPtr account); @@ -256,6 +256,8 @@ public: void acceptInvalidFileName(const QString &filePath); + void acceptCaseClashConflictFileName(const QString &filePath); + /** * Migration: When this flag is true, this folder will save to * the backwards-compatible 'Folders' section in the config file. @@ -299,10 +301,10 @@ public: signals: void syncStateChange(); void syncStarted(); - void syncFinished(const SyncResult &result); - void progressInfo(const ProgressInfo &progress); + void syncFinished(const OCC::SyncResult &result); + void progressInfo(const OCC::ProgressInfo &progress); void newBigFolderDiscovered(const QString &); // A new folder bigger than the threshold was discovered - void syncPausedChanged(Folder *, bool paused); + void syncPausedChanged(OCC::Folder *, bool paused); void canSyncChanged(); /** @@ -319,7 +321,7 @@ public slots: void slotTerminateSync(); // connected to the corresponding signals in the SyncEngine - void slotAboutToRemoveAllFiles(SyncFileItem::Direction, std::function callback); + void slotAboutToRemoveAllFiles(OCC::SyncFileItem::Direction, std::function callback); /** * Starts a sync operation @@ -338,7 +340,7 @@ public slots: * changes. Needs to check whether this change should trigger a new * sync run to be scheduled. */ - void slotWatchedPathChanged(const QString &path, ChangeReason reason); + void slotWatchedPathChanged(const QString &path, OCC::Folder::ChangeReason reason); /** * Mark a virtual file as being requested for download, and start a sync. @@ -368,18 +370,25 @@ public slots: /** Ensures that the next sync performs a full local discovery. */ void slotNextSyncFullLocalDiscovery(); + void setSilenceErrorsUntilNextSync(bool silenceErrors); + + /** Deletes local copies of E2EE files. + * Intended for clean-up after disabling E2EE for an account. + */ + void removeLocalE2eFiles(); + private slots: void slotSyncStarted(); void slotSyncFinished(bool); /** Adds a error message that's not tied to a specific item. */ - void slotSyncError(const QString &message, ErrorCategory category = ErrorCategory::Normal); + void slotSyncError(const QString &message, OCC::ErrorCategory category = OCC::ErrorCategory::Normal); - void slotAddErrorToGui(SyncFileItem::Status status, const QString &errorMessage, const QString &subject = {}); + void slotAddErrorToGui(OCC::SyncFileItem::Status status, const QString &errorMessage, const QString &subject = {}); - void slotTransmissionProgress(const ProgressInfo &pi); - void slotItemCompleted(const SyncFileItemPtr &); + void slotTransmissionProgress(const OCC::ProgressInfo &pi); + void slotItemCompleted(const OCC::SyncFileItemPtr &); void slotRunEtagJob(); void etagRetrieved(const QByteArray &, const QDateTime &tp); @@ -404,7 +413,7 @@ private slots: 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); + void warnOnNewExcludedItem(const OCC::SyncJournalFileRecord &record, const QStringRef &path); /** Warn users about an unreliable folder watcher */ void slotWatcherUnreliable(const QString &message); @@ -506,6 +515,8 @@ private: */ bool _hasSwitchedToVfs = false; + bool _silenceErrorsUntilNextSync = false; + /** * Watches this folder's local directory for changes. * diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 8d57a72b8..b8cecf7d2 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -24,6 +24,7 @@ #include "filesystem.h" #include "lockwatcher.h" #include "common/asserts.h" +#include "gui/systray.h" #include #include @@ -37,8 +38,12 @@ #include #include -static const char versionC[] = "version"; -static const int maxFoldersVersion = 1; +namespace { +constexpr auto settingsAccountsC = "Accounts"; +constexpr auto settingsFoldersC = "Folders"; +constexpr auto settingsVersionC = "version"; +constexpr auto maxFoldersVersion = 1; +} namespace OCC { @@ -182,7 +187,8 @@ int FolderMan::setupFolders() qCInfo(lcFolderMan) << "Setup folders from settings file"; - for (const auto &account : AccountManager::instance()->accounts()) { + const auto accounts = AccountManager::instance()->accounts(); + for (const auto &account : accounts) { const auto id = account->account()->id(); if (!accountsWithSettings.contains(id)) { continue; @@ -213,7 +219,7 @@ int FolderMan::setupFolders() emit folderListChanged(_folderMap); - for (const auto folder : _folderMap) { + for (const auto folder : qAsConst(_folderMap)) { folder->processSwitchedToVirtualFiles(); } @@ -222,7 +228,8 @@ int FolderMan::setupFolders() void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account, const QStringList &ignoreKeys, bool backwardsCompatible, bool foldersWithPlaceholders) { - for (const auto &folderAlias : settings.childGroups()) { + const auto settingsChildGroups = settings.childGroups(); + for (const auto &folderAlias : settingsChildGroups) { // Skip folders with too-new version settings.beginGroup(folderAlias); if (ignoreKeys.contains(settings.group())) { @@ -315,7 +322,7 @@ void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account, f->switchToVirtualFiles(); } // Migrate the old "usePlaceholders" setting to the root folder pin state - if (settings.value(QLatin1String(versionC), 1).toInt() == 1 + if (settings.value(QLatin1String(settingsVersionC), 1).toInt() == 1 && settings.value(QLatin1String("usePlaceholders"), false).toBool()) { qCInfo(lcFolderMan) << "Migrate: From usePlaceholders to PinState::OnlineOnly"; f->setRootPinState(PinState::OnlineOnly); @@ -339,7 +346,7 @@ int FolderMan::setupFoldersMigration() { ConfigFile cfg; QDir storageDir(cfg.configPath()); - _folderConfigPath = cfg.configPath() + QLatin1String("folders"); + _folderConfigPath = cfg.configPath(); qCInfo(lcFolderMan) << "Setup folders from " << _folderConfigPath << "(migration)"; @@ -370,11 +377,11 @@ void FolderMan::backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringLi auto processSubgroup = [&](const QString &name) { settings->beginGroup(name); - const int foldersVersion = settings->value(QLatin1String(versionC), 1).toInt(); + const int foldersVersion = settings->value(QLatin1String(settingsVersionC), 1).toInt(); if (foldersVersion <= maxFoldersVersion) { foreach (const auto &folderAlias, settings->childGroups()) { settings->beginGroup(folderAlias); - const int folderVersion = settings->value(QLatin1String(versionC), 1).toInt(); + const int folderVersion = settings->value(QLatin1String(settingsVersionC), 1).toInt(); if (folderVersion > FolderDefinition::maxSettingsVersion()) { ignoreKeys->append(settings->group()); } @@ -386,7 +393,8 @@ void FolderMan::backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringLi settings->endGroup(); }; - for (const auto &accountId : settings->childGroups()) { + const auto settingsChildGroups = settings->childGroups(); + for (const auto &accountId : settingsChildGroups) { settings->beginGroup(accountId); processSubgroup("Folders"); processSubgroup("Multifolders"); @@ -499,58 +507,91 @@ Folder *FolderMan::setupFolderFromOldConfigFile(const QString &file, AccountStat // Check if the filename is equal to the group setting. If not, use the group // name as an alias. - QStringList groups = settings.childGroups(); + const auto groups = settings.childGroups(); + if (groups.isEmpty()) { + qCWarning(lcFolderMan) << "empty file:" << cfgFile.filePath(); + return folder; + } - if (!groups.contains(escapedAlias) && groups.count() > 0) { - escapedAlias = groups.first(); + if (!accountState) { + qCCritical(lcFolderMan) << "can't create folder without an account"; + return nullptr; } - settings.beginGroup(escapedAlias); // read the group with the same name as the file which is the folder alias + settings.beginGroup(settingsAccountsC); + const auto rootChildGroups = settings.childGroups(); + for (const auto &accountId : rootChildGroups) { + qCDebug(lcFolderMan) << "try to migrate accountId:" << accountId; + settings.beginGroup(accountId); + settings.beginGroup(settingsFoldersC); - QString path = settings.value(QLatin1String("localPath")).toString(); - QString backend = settings.value(QLatin1String("backend")).toString(); - QString targetPath = settings.value(QLatin1String("targetPath")).toString(); - bool paused = settings.value(QLatin1String("paused"), false).toBool(); - // QString connection = settings.value( QLatin1String("connection") ).toString(); - QString alias = unescapeAlias(escapedAlias); + if (settings.childGroups().isEmpty()) { + continue; + } - if (backend.isEmpty() || backend != QLatin1String("owncloud")) { - qCWarning(lcFolderMan) << "obsolete configuration of type" << backend; - return nullptr; - } + const auto childGroups = settings.childGroups(); + for (const auto &alias : childGroups) { + settings.beginGroup(alias); + qCDebug(lcFolderMan) << "try to migrate folder alias:" << alias; - // cut off the leading slash, oCUrl always has a trailing. - if (targetPath.startsWith(QLatin1Char('/'))) { - targetPath.remove(0, 1); - } + const auto path = settings.value(QLatin1String("localPath")).toString(); + const auto targetPath = settings.value(QLatin1String("targetPath")).toString(); + const auto journalPath = settings.value(QLatin1String("journalPath")).toString(); + const auto paused = settings.value(QLatin1String("paused"), false).toBool(); + const auto ignoreHiddenFiles = settings.value(QLatin1String("ignoreHiddenFiles"), false).toBool(); - if (!accountState) { - qCCritical(lcFolderMan) << "can't create folder without an account"; - return nullptr; - } + if (path.isEmpty()) { + qCDebug(lcFolderMan) << "localPath is empty"; + settings.endGroup(); + continue; + } + + if (targetPath.isEmpty()) { + qCDebug(lcFolderMan) << "targetPath is empty"; + settings.endGroup(); + continue; + } + + if (journalPath.isEmpty()) { + qCDebug(lcFolderMan) << "journalPath is empty"; + settings.endGroup(); + continue; + } - FolderDefinition folderDefinition; - folderDefinition.alias = alias; - folderDefinition.localPath = path; - folderDefinition.targetPath = targetPath; - folderDefinition.paused = paused; - folderDefinition.ignoreHiddenFiles = ignoreHiddenFiles(); + FolderDefinition folderDefinition; + folderDefinition.alias = alias; + folderDefinition.localPath = path; + folderDefinition.targetPath = targetPath; + folderDefinition.journalPath = journalPath; + folderDefinition.paused = paused; + folderDefinition.ignoreHiddenFiles = ignoreHiddenFiles; + + folder = addFolderInternal(folderDefinition, accountState, std::make_unique()); + if (folder) { + const auto blackList = settings.value(QLatin1String("blackList")).toStringList(); + if (!blackList.empty()) { + //migrate settings + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList); + settings.remove(QLatin1String("blackList")); + // FIXME: If you remove this codepath, you need to provide another way to do + // this via theme.h or the normal FolderMan::setupFolders + } - folder = addFolderInternal(folderDefinition, accountState, std::make_unique()); - if (folder) { - QStringList blackList = settings.value(QLatin1String("blackList")).toStringList(); - if (!blackList.empty()) { - //migrate settings - folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList); - settings.remove(QLatin1String("blackList")); - // FIXME: If you remove this codepath, you need to provide another way to do - // this via theme.h or the normal FolderMan::setupFolders + folder->saveToSettings(); + } + qCInfo(lcFolderMan) << "Migrated!" << folder; + settings.sync(); + + if (folder) { + return folder; + } + + settings.endGroup(); } - folder->saveToSettings(); + settings.endGroup(); + settings.endGroup(); } - qCInfo(lcFolderMan) << "Migrated!" << folder; - settings.sync(); return folder; } @@ -592,7 +633,8 @@ Folder *FolderMan::folder(const QString &alias) void FolderMan::scheduleAllFolders() { - for (Folder *f : _folderMap.values()) { + const auto folderMapValues = _folderMap.values(); + for (Folder *f : folderMapValues) { if (f && f->canSync()) { scheduleFolder(f); } @@ -610,10 +652,22 @@ void FolderMan::forceSyncForFolder(Folder *folder) } folder->slotWipeErrorBlacklist(); // issue #6757 + folder->setSyncPaused(false); + // Insert the selected folder at the front of the queue scheduleFolderNext(folder); } +void FolderMan::removeE2eFiles(const AccountPtr &account) const +{ + Q_ASSERT(account->e2e()->_mnemonic.isEmpty()); + for (const auto folder : map()) { + if(folder->accountState()->account()->id() == account->id()) { + folder->removeLocalE2eFiles(); + } + } +} + void FolderMan::slotScheduleAppRestart() { _appRestartRequired = true; @@ -733,7 +787,8 @@ void FolderMan::slotAccountStateChanged() if (accountState->isConnected()) { qCInfo(lcFolderMan) << "Account" << accountName << "connected, scheduling its folders"; - for (Folder *f : _folderMap.values()) { + const auto folderMapValues = _folderMap.values(); + for (Folder *f : folderMapValues) { if (f && f->canSync() && f->accountState() == accountState) { @@ -773,7 +828,7 @@ void FolderMan::setSyncEnabled(bool enabled) } _syncEnabled = enabled; // force a redraw in case the network connect status changed - emit(folderSyncStateChange(nullptr)); + emit folderSyncStateChange(nullptr); } void FolderMan::startScheduledSyncSoon() @@ -829,7 +884,7 @@ void FolderMan::startScheduledSyncSoon() void FolderMan::slotStartScheduledFolderSync() { if (isAnySyncRunning()) { - for (auto f : _folderMap) { + for (auto f : qAsConst(_folderMap)) { if (f->isSyncRunning()) qCInfo(lcFolderMan) << "Currently folder " << f->remoteUrl().toString() << " is running, wait for finish!"; } @@ -1215,7 +1270,8 @@ QStringList FolderMan::findFileInLocalFolders(const QString &relPath, const Acco if (!serverPath.startsWith('/')) serverPath.prepend('/'); - for (Folder *folder : this->map().values()) { + const auto mapValues = map().values(); + for (Folder *folder : mapValues) { if (acc && folder->accountState()->account() != acc) { continue; } @@ -1413,12 +1469,13 @@ void FolderMan::slotWipeFolderForAccount(AccountState *accountState) void FolderMan::setDirtyProxy() { - for (const Folder *f : _folderMap.values()) { - if (f) { - if (f->accountState() && f->accountState()->account() - && f->accountState()->account()->networkAccessManager()) { + const auto folderMapValues = _folderMap.values(); + for (const auto folder : folderMapValues) { + if (folder) { + if (folder->accountState() && folder->accountState()->account() + && folder->accountState()->account()->networkAccessManager()) { // Need to do this so we do not use the old determined system proxy - f->accountState()->account()->networkAccessManager()->setProxy( + folder->accountState()->account()->networkAccessManager()->setProxy( QNetworkProxy(QNetworkProxy::DefaultProxy)); } } @@ -1427,14 +1484,30 @@ void FolderMan::setDirtyProxy() void FolderMan::setDirtyNetworkLimits() { - for (Folder *f : _folderMap.values()) { + const auto folderMapValues = _folderMap.values(); + for (auto folder : folderMapValues) { // set only in busy folders. Otherwise they read the config anyway. - if (f && f->isBusy()) { - f->setDirtyNetworkLimits(); + if (folder && folder->isBusy()) { + folder->setDirtyNetworkLimits(); } } } +void FolderMan::leaveShare(const QString &localFile) +{ + if (const auto folder = FolderMan::instance()->folderForPath(localFile)) { + const auto filePathRelative = QString(localFile).remove(folder->path()); + + const auto leaveShareJob = new SimpleApiJob(folder->accountState()->account(), folder->accountState()->account()->davPath() + filePathRelative); + leaveShareJob->setVerb(SimpleApiJob::Verb::Delete); + connect(leaveShareJob, &SimpleApiJob::resultReceived, this, [this, folder](int statusCode) { + Q_UNUSED(statusCode) + scheduleFolder(folder); + }); + leaveShareJob->start(); + } +} + void FolderMan::trayOverallStatus(const QList &folders, SyncResult::Status *status, bool *unresolvedConflicts) { @@ -1607,7 +1680,7 @@ static QString canonicalPath(const QString &path) const auto parentPath = selFile.dir().path(); // It's possible for the parentPath to match the path - // (possibly we've arrived at a non-existant drive root on Windows) + // (possibly we've arrived at a non-existent drive root on Windows) // and recursing would be fatal. if (parentPath == path) { return path; @@ -1776,7 +1849,7 @@ void FolderMan::slotProcessFilesPushNotification(Account *account) { qCInfo(lcFolderMan) << "Got files push notification for account" << account; - for (auto folder : _folderMap) { + for (auto folder : qAsConst(_folderMap)) { // Just run on the folders that belong to this account if (folder->accountState()->account() != account) { continue; diff --git a/src/gui/folderman.h b/src/gui/folderman.h index bda66138d..a384bd643 100644 --- a/src/gui/folderman.h +++ b/src/gui/folderman.h @@ -27,6 +27,9 @@ class TestFolderMan; class TestCfApiShellExtensionsIPC; +class TestShareModel; +class ShareTestHelper; +class EndToEndTestHelper; namespace OCC { @@ -83,7 +86,7 @@ public: */ static void backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys); - const Folder::Map &map() const; + [[nodiscard]] const Folder::Map &map() const; /** Adds a folder for an account, ensures the journal is gone and saves it in the settings. */ @@ -144,7 +147,7 @@ public: * * @returns an empty string and PathValidityResult::Valid if it is allowed, or an error if it is not allowed */ - QPair checkPathValidityForNewFolder(const QString &path, const QUrl &serverUrl = QUrl()) const; + [[nodiscard]] QPair checkPathValidityForNewFolder(const QString &path, const QUrl &serverUrl = QUrl()) const; /** * Attempts to find a non-existing, acceptable path for creating a new sync folder. @@ -155,7 +158,7 @@ public: * subfolder of ~ would be a good candidate. When that happens \a basePath * is returned. */ - QString findGoodPathForNewSyncFolder(const QString &basePath, const QUrl &serverUrl) const; + [[nodiscard]] QString findGoodPathForNewSyncFolder(const QString &basePath, const QUrl &serverUrl) const; /** * While ignoring hidden files can theoretically be switched per folder, @@ -163,13 +166,13 @@ public: * at once. * These helper functions can be removed once it's properly per-folder. */ - bool ignoreHiddenFiles() const; + [[nodiscard]] bool ignoreHiddenFiles() const; void setIgnoreHiddenFiles(bool ignore); /** * Access to the current queue of scheduled folders. */ - QQueue scheduleQueue() const; + [[nodiscard]] QQueue scheduleQueue() const; /** * Access to the currently syncing folder. @@ -179,7 +182,7 @@ public: * * See also isAnySyncRunning() */ - Folder *currentSyncFolder() const; + [[nodiscard]] Folder *currentSyncFolder() const; /** * Returns true if any folder is currently syncing. @@ -187,7 +190,7 @@ public: * This might be a FolderMan-scheduled sync, or a externally * managed sync like a placeholder hydration. */ - bool isAnySyncRunning() const; + [[nodiscard]] bool isAnySyncRunning() const; /** Removes all folders */ int unloadAndDeleteAllFolders(); @@ -213,13 +216,16 @@ public: void setDirtyProxy(); void setDirtyNetworkLimits(); + /** removes current user from the share **/ + void leaveShare(const QString &localFile); + signals: /** * signal to indicate a folder has changed its sync state. * * Attention: The folder may be zero. Do a general update of the state then. */ - void folderSyncStateChange(Folder *); + void folderSyncStateChange(OCC::Folder *); /** * Indicates when the schedule queue changes. @@ -229,12 +235,12 @@ signals: /** * Emitted whenever the list of configured folders changes. */ - void folderListChanged(const Folder::Map &); + void folderListChanged(const OCC::Folder::Map &); /** * Emitted once slotRemoveFoldersForAccount is done wiping */ - void wipeDone(AccountState *account, bool success); + void wipeDone(OCC::AccountState *account, bool success); public slots: @@ -258,18 +264,20 @@ public slots: void slotSyncOnceFileUnlocks(const QString &path); // slot to schedule an ETag job (from Folder only) - void slotScheduleETagJob(const QString &alias, RequestEtagJob *job); + void slotScheduleETagJob(const QString &alias, OCC::RequestEtagJob *job); /** Wipe folder */ - void slotWipeFolderForAccount(AccountState *accountState); + void slotWipeFolderForAccount(OCC::AccountState *accountState); + + void forceSyncForFolder(OCC::Folder *folder); - void forceSyncForFolder(Folder *folder); + void removeE2eFiles(const AccountPtr &account) const; private slots: - void slotFolderSyncPaused(Folder *, bool paused); + void slotFolderSyncPaused(OCC::Folder *, bool paused); void slotFolderCanSyncChanged(); void slotFolderSyncStarted(); - void slotFolderSyncFinished(const SyncResult &); + void slotFolderSyncFinished(const OCC::SyncResult &); void slotRunOneEtagJob(); void slotEtagJobDestroyed(QObject *); @@ -278,15 +286,15 @@ private slots: void slotStartScheduledFolderSync(); void slotEtagPollTimerTimeout(); - void slotAccountRemoved(AccountState *accountState); + void slotAccountRemoved(OCC::AccountState *accountState); - void slotRemoveFoldersForAccount(AccountState *accountState); + void slotRemoveFoldersForAccount(OCC::AccountState *accountState); // Wraps the Folder::syncStateChange() signal into the // FolderMan::folderSyncStateChange(Folder*) signal. void slotForwardFolderSyncStateChange(); - void slotServerVersionChanged(Account *account); + void slotServerVersionChanged(OCC::Account *account); /** * A file whose locks were being monitored has become unlocked. @@ -304,9 +312,9 @@ private slots: */ void slotScheduleFolderByTime(); - void slotSetupPushNotifications(const Folder::Map &); - void slotProcessFilesPushNotification(Account *account); - void slotConnectToPushNotifications(Account *account); + void slotSetupPushNotifications(const OCC::Folder::Map &); + void slotProcessFilesPushNotification(OCC::Account *account); + void slotConnectToPushNotifications(OCC::Account *account); private: /** Adds a new folder, does not add it to the account settings and @@ -323,7 +331,7 @@ private: // finds all folder configuration files // and create the folders - QString getBackupName(QString fullPathName) const; + [[nodiscard]] QString getBackupName(QString fullPathName) const; // makes the folder known to the socket api void registerFolderWithSocketApi(Folder *folder); @@ -338,7 +346,7 @@ private: bool pushNotificationsFilesReady(Account *account); - bool isSwitchToVfsNeeded(const FolderDefinition &folderDefinition) const; + [[nodiscard]] bool isSwitchToVfsNeeded(const FolderDefinition &folderDefinition) const; QSet _disabledFolders; Folder::Map _folderMap; @@ -379,6 +387,8 @@ private: friend class OCC::Application; friend class ::TestFolderMan; friend class ::TestCfApiShellExtensionsIPC; + friend class ::ShareTestHelper; + friend class ::EndToEndTestHelper; }; } // namespace OCC diff --git a/src/gui/folderstatusdelegate.cpp b/src/gui/folderstatusdelegate.cpp index ed08bf9e2..0934bd1da 100644 --- a/src/gui/folderstatusdelegate.cpp +++ b/src/gui/folderstatusdelegate.cpp @@ -58,7 +58,7 @@ QSize FolderStatusDelegate::sizeHint(const QStyleOptionViewItem &option, QFontMetrics fm(font); QFontMetrics aliasFm(aliasFont); - auto classif = static_cast(index.model())->classify(index); + auto classif = dynamic_cast(index.model())->classify(index); if (classif == FolderStatusModel::AddButton) { const int margins = aliasFm.height(); // same as 2*aliasMargin of paint QFontMetrics fm(qApp->font("QPushButton")); @@ -126,7 +126,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & QFontMetrics subFm(subFont); QFontMetrics aliasFm(aliasFont); - QFontMetrics progressFm(progressFont); int aliasMargin = aliasFm.height() / 2; int margin = subFm.height() / 4; @@ -148,7 +147,7 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & return; } - if (static_cast(index.model())->classify(index) != FolderStatusModel::RootFolder) { + if (dynamic_cast(index.model())->classify(index) != FolderStatusModel::RootFolder) { return; } painter->save(); @@ -156,7 +155,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & auto statusIcon = qvariant_cast(index.data(FolderStatusIconRole)); auto aliasText = qvariant_cast(index.data(HeaderRole)); auto pathText = qvariant_cast(index.data(FolderPathRole)); - auto remotePath = qvariant_cast(index.data(FolderSecondPathRole)); auto conflictTexts = qvariant_cast(index.data(FolderConflictMsg)); auto errorTexts = qvariant_cast(index.data(FolderErrorMsg)); auto infoTexts = qvariant_cast(index.data(FolderInfoMsg)); @@ -223,15 +221,6 @@ void FolderStatusDelegate::paint(QPainter *painter, const QStyleOptionViewItem & auto palette = option.palette; - if (qApp->style()->inherits("QWindowsVistaStyle")) { - // Hack: Windows Vista's light blue is not contrasting enough for white - - // (code from QWindowsVistaStyle::drawControl for CE_ItemViewItem) - palette.setColor(QPalette::All, QPalette::HighlightedText, palette.color(QPalette::Active, QPalette::Text)); - palette.setColor(QPalette::All, QPalette::Highlight, palette.base().color().darker(108)); - } - - QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; @@ -367,7 +356,7 @@ bool FolderStatusDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, case QEvent::MouseButtonPress: case QEvent::MouseMove: if (const auto *view = qobject_cast(option.widget)) { - auto *me = static_cast(event); + auto *me = dynamic_cast(event); QModelIndex index; if (me->buttons()) { index = view->indexAt(me->pos()); @@ -400,7 +389,7 @@ QRect FolderStatusDelegate::optionsButtonRect(QRect within, Qt::LayoutDirection 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); + int margin = QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing); QRect r(QPoint(within.right() - size.width() - margin, within.top() + within.height() / 2 - size.height() / 2), size); diff --git a/src/gui/folderstatusdelegate.h b/src/gui/folderstatusdelegate.h index 63c2903a8..a8ed1c41d 100644 --- a/src/gui/folderstatusdelegate.h +++ b/src/gui/folderstatusdelegate.h @@ -52,7 +52,7 @@ public: }; void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override; - QSize sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const override; + [[nodiscard]] QSize sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const override; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override; diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp index 6969fa29c..2855ef51d 100644 --- a/src/gui/folderstatusmodel.cpp +++ b/src/gui/folderstatusmodel.cpp @@ -60,6 +60,8 @@ static bool sortByFolderHeader(const FolderStatusModel::SubFolderInfo &lhs, cons void FolderStatusModel::setAccountState(const AccountState *accountState) { + connect(accountState->account()->e2e(), &OCC::ClientSideEncryption::initializationFinished, this, &FolderStatusModel::e2eInitializationFinished); + beginResetModel(); _dirty = false; _folders.clear(); @@ -153,41 +155,49 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const return QVariant(); } case SubFolder: { - const auto &x = static_cast(index.internalPointer())->_subs.at(index.row()); - const auto supportsSelectiveSync = x._folder && x._folder->supportsSelectiveSync(); + const auto &subfolderInfo = static_cast(index.internalPointer())->_subs.at(index.row()); + const auto supportsSelectiveSync = subfolderInfo._folder && subfolderInfo._folder->supportsSelectiveSync(); switch (role) { - case Qt::DisplayRole: + case Qt::DisplayRole: { //: Example text: "File.txt (23KB)" - return x._size < 0 ? x._name : tr("%1 (%2)").arg(x._name, Utility::octetsToString(x._size)); + const auto &xParent = static_cast(index.internalPointer()); + const auto suffix = (subfolderInfo._isNonDecryptable && subfolderInfo._checked && (!xParent || !xParent->_isEncrypted)) + ? QStringLiteral(" - ") + tr("Could not decrypt!") + : QString{}; + return subfolderInfo._size < 0 ? QString(subfolderInfo._name + suffix) : QString(tr("%1 (%2)").arg(subfolderInfo._name, Utility::octetsToString(subfolderInfo._size)) + suffix); + } case Qt::ToolTipRole: - return QString(QLatin1String("") + Utility::escape(x._size < 0 ? x._name : tr("%1 (%2)").arg(x._name, Utility::octetsToString(x._size))) + QLatin1String("")); + return QString(QLatin1String("") + Utility::escape(subfolderInfo._size < 0 ? subfolderInfo._name : tr("%1 (%2)").arg(subfolderInfo._name, Utility::octetsToString(subfolderInfo._size))) + QLatin1String("")); case Qt::CheckStateRole: if (supportsSelectiveSync) { - return x._checked; + return subfolderInfo._checked; } else { return QVariant(); } case Qt::DecorationRole: { - if (x._isEncrypted) { + if (subfolderInfo._isNonDecryptable && subfolderInfo._checked) { + return QIcon(QLatin1String(":/client/theme/lock-broken.svg")); + } + if (subfolderInfo._isEncrypted) { return QIcon(QLatin1String(":/client/theme/lock-https.svg")); - } else if (x._size > 0 && isAnyAncestorEncrypted(index)) { + } else if (subfolderInfo._size > 0 && isAnyAncestorEncrypted(index)) { return QIcon(QLatin1String(":/client/theme/lock-broken.svg")); } - return QFileIconProvider().icon(x._isExternal ? QFileIconProvider::Network : QFileIconProvider::Folder); + return QFileIconProvider().icon(subfolderInfo._isExternal ? QFileIconProvider::Network : QFileIconProvider::Folder); } case Qt::ForegroundRole: - if (x._isUndecided) { + if (subfolderInfo._isUndecided || (subfolderInfo._isNonDecryptable && subfolderInfo._checked)) { return QColor(Qt::red); } break; case FileIdRole: - return x._fileId; + return subfolderInfo._fileId; case FolderStatusDelegate::FolderPathRole: { - auto f = x._folder; + auto f = subfolderInfo._folder; if (!f) return QVariant(); - return QVariant(f->path() + x._path); + return QVariant(f->path() + subfolderInfo._path); } } } @@ -742,8 +752,14 @@ void FolderStatusModel::slotUpdateDirectories(const QStringList &list) newInfo._isEncrypted = encryptionMap.value(removeTrailingSlash(path)).toString() == QStringLiteral("1"); newInfo._path = relativePath; + newInfo._isNonDecryptable = newInfo._isEncrypted + && _accountState->account()->e2e() && !_accountState->account()->e2e()->_publicKey.isNull() + && _accountState->account()->e2e()->_privateKey.isNull(); + SyncJournalFileRecord rec; - parentInfo->_folder->journalDb()->getFileRecordByE2eMangledName(removeTrailingSlash(relativePath), &rec); + if (!parentInfo->_folder->journalDb()->getFileRecordByE2eMangledName(removeTrailingSlash(relativePath), &rec)) { + qCWarning(lcFolderStatus) << "Could not get file record by E2E Mangled Name from local DB" << removeTrailingSlash(relativePath); + } if (rec.isValid()) { newInfo._name = removeTrailingSlash(rec._path).split('/').last(); if (rec._isE2eEncrypted && !rec._e2eMangledName.isEmpty()) { @@ -805,7 +821,7 @@ void FolderStatusModel::slotUpdateDirectories(const QStringList &list) } for (int undecidedIndex : qAsConst(undecidedIndexes)) { - suggestExpand(index(undecidedIndex, 0, idx)); + emit suggestExpand(index(undecidedIndex, 0, idx)); } /* Try to remove the the undecided lists the items that are not on the server. */ auto it = std::remove_if(selectiveSyncUndecidedList.begin(), selectiveSyncUndecidedList.end(), @@ -1131,6 +1147,15 @@ void FolderStatusModel::slotSetProgress(const ProgressInfo &progress) emit dataChanged(index(folderIndex), index(folderIndex), roles); } +void FolderStatusModel::e2eInitializationFinished(bool isNewMnemonicGenerated) +{ + Q_UNUSED(isNewMnemonicGenerated); + + for (int i = 0; i < _folders.count(); ++i) { + resetAndFetch(index(i)); + } +} + void FolderStatusModel::slotFolderSyncStateChange(Folder *f) { if (!f) { diff --git a/src/gui/folderstatusmodel.h b/src/gui/folderstatusmodel.h index 9896d5644..e2397295c 100644 --- a/src/gui/folderstatusmodel.h +++ b/src/gui/folderstatusmodel.h @@ -45,17 +45,17 @@ public: ~FolderStatusModel() override; void setAccountState(const AccountState *accountState); - Qt::ItemFlags flags(const QModelIndex &) const override; - QVariant data(const QModelIndex &index, int role) const override; + [[nodiscard]] Qt::ItemFlags flags(const QModelIndex &) const override; + [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &child) const override; - bool canFetchMore(const QModelIndex &parent) const override; + [[nodiscard]] int columnCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QModelIndex parent(const QModelIndex &child) const override; + [[nodiscard]] bool canFetchMore(const QModelIndex &parent) const override; void fetchMore(const QModelIndex &parent) override; void resetAndFetch(const QModelIndex &parent); - bool hasChildren(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] bool hasChildren(const QModelIndex &parent = QModelIndex()) const override; struct SubFolderInfo { @@ -80,15 +80,17 @@ public: Qt::CheckState _checked = Qt::Checked; + bool _isNonDecryptable = false; + // Whether this has a FetchLabel subrow - bool hasLabel() const; + [[nodiscard]] bool hasLabel() const; // Reset all subfolders and fetch status void resetSubs(FolderStatusModel *model, QModelIndex index); struct Progress { - bool isNull() const + [[nodiscard]] bool isNull() const { return _progressString.isEmpty() && _warningCount == 0 && _overallSyncString.isEmpty(); } @@ -106,9 +108,9 @@ public: SubFolder, AddButton, FetchLabel }; - ItemType classify(const QModelIndex &index) const; - SubFolderInfo *infoForIndex(const QModelIndex &index) const; - bool isAnyAncestorEncrypted(const QModelIndex &index) const; + [[nodiscard]] ItemType classify(const QModelIndex &index) const; + [[nodiscard]] SubFolderInfo *infoForIndex(const QModelIndex &index) const; + [[nodiscard]] bool isAnyAncestorEncrypted(const QModelIndex &index) const; // If the selective sync check boxes were changed bool isDirty() { return _dirty; } @@ -119,19 +121,20 @@ public: QModelIndex indexForPath(Folder *f, const QString &path) const; public slots: - void slotUpdateFolderState(Folder *); + void slotUpdateFolderState(OCC::Folder *); void slotApplySelectiveSync(); void resetFolders(); void slotSyncAllPendingBigFolders(); void slotSyncNoPendingBigFolders(); - void slotSetProgress(const ProgressInfo &progress); + void slotSetProgress(const OCC::ProgressInfo &progress); + void e2eInitializationFinished(bool isNewMnemonicGenerated); private slots: void slotUpdateDirectories(const QStringList &); void slotGatherPermissions(const QString &name, const QMap &properties); void slotGatherEncryptionStatus(const QString &href, const QMap &properties); void slotLscolFinishedWithError(QNetworkReply *r); - void slotFolderSyncStateChange(Folder *f); + void slotFolderSyncStateChange(OCC::Folder *f); void slotFolderScheduleQueueChanged(); void slotNewBigFolder(); @@ -142,7 +145,7 @@ private slots: void slotShowFetchProgress(); private: - QStringList createBlackList(const OCC::FolderStatusModel::SubFolderInfo &root, + [[nodiscard]] QStringList createBlackList(const OCC::FolderStatusModel::SubFolderInfo &root, const QStringList &oldBlackList) const; const AccountState *_accountState = nullptr; bool _dirty = false; // If the selective sync checkboxes were changed diff --git a/src/gui/folderstatusview.h b/src/gui/folderstatusview.h index c4efe3883..f123672f6 100644 --- a/src/gui/folderstatusview.h +++ b/src/gui/folderstatusview.h @@ -30,8 +30,8 @@ class FolderStatusView : public QTreeView public: explicit FolderStatusView(QWidget *parent = nullptr); - QModelIndex indexAt(const QPoint &point) const override; - QRect visualRect(const QModelIndex &index) const override; + [[nodiscard]] QModelIndex indexAt(const QPoint &point) const override; + [[nodiscard]] QRect visualRect(const QModelIndex &index) const override; }; } // namespace OCC diff --git a/src/gui/folderwatcher.h b/src/gui/folderwatcher.h index 9972dd50f..957f8a035 100644 --- a/src/gui/folderwatcher.h +++ b/src/gui/folderwatcher.h @@ -70,7 +70,7 @@ public: * For example, this can happen on linux if the inotify user limit from * /proc/sys/fs/inotify/max_user_watches is exceeded. */ - bool isReliable() const; + [[nodiscard]] bool isReliable() const; /** * Triggers a change in the path and verifies a notification arrives. @@ -81,7 +81,7 @@ public: void startNotificatonTest(const QString &path); /// For testing linux behavior only - int testLinuxWatchCount() const; + [[nodiscard]] int testLinuxWatchCount() const; signals: /** Emitted when one of the watched directories or one diff --git a/src/gui/folderwatcher_linux.h b/src/gui/folderwatcher_linux.h index 620e037ed..f251456ea 100644 --- a/src/gui/folderwatcher_linux.h +++ b/src/gui/folderwatcher_linux.h @@ -39,7 +39,7 @@ public: FolderWatcherPrivate(FolderWatcher *p, const QString &path); ~FolderWatcherPrivate() override; - int testWatchCount() const { return _pathToWatch.size(); } + [[nodiscard]] int testWatchCount() const { return _pathToWatch.size(); } /// On linux the watcher is ready when the ctor finished. bool _ready = true; diff --git a/src/gui/folderwatcher_mac.cpp b/src/gui/folderwatcher_mac.cpp index 988d20377..fcce031cd 100644 --- a/src/gui/folderwatcher_mac.cpp +++ b/src/gui/folderwatcher_mac.cpp @@ -101,7 +101,7 @@ void FolderWatcherPrivate::startWatching() CFRelease(pathsToWatch); CFRelease(folderCF); - FSEventStreamScheduleWithRunLoop(_stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + FSEventStreamSetDispatchQueue(_stream, dispatch_get_main_queue()); FSEventStreamStart(_stream); } diff --git a/src/gui/folderwizard.cpp b/src/gui/folderwizard.cpp index cb4fa2a13..e13733398 100644 --- a/src/gui/folderwizard.cpp +++ b/src/gui/folderwizard.cpp @@ -239,7 +239,7 @@ void FolderWizardRemotePath::slotCreateRemoteFolderFinished() qCDebug(lcWizard) << "webdav mkdir request finished"; showWarn(tr("Folder was successfully created on %1.").arg(Theme::instance()->appNameGUI())); slotRefreshFolders(); - _ui.folderEntry->setText(static_cast(sender())->path()); + _ui.folderEntry->setText(dynamic_cast(sender())->path()); slotLsColFolderEntry(); } diff --git a/src/gui/folderwizard.h b/src/gui/folderwizard.h index 72b83e3e3..fb60caca3 100644 --- a/src/gui/folderwizard.h +++ b/src/gui/folderwizard.h @@ -41,7 +41,7 @@ class FormatWarningsWizardPage : public QWizardPage { Q_OBJECT protected: - QString formatWarnings(const QStringList &warnings) const; + [[nodiscard]] QString formatWarnings(const QStringList &warnings) const; }; /** @@ -55,7 +55,7 @@ public: explicit FolderWizardLocalPath(const AccountPtr &account); ~FolderWizardLocalPath() override; - bool isComplete() const override; + [[nodiscard]] bool isComplete() const override; void initializePage() override; void cleanupPage() override; @@ -88,7 +88,7 @@ public: explicit FolderWizardRemotePath(const AccountPtr &account); ~FolderWizardRemotePath() override; - bool isComplete() const override; + [[nodiscard]] bool isComplete() const override; void initializePage() override; void cleanupPage() override; diff --git a/src/gui/generalsettings.cpp b/src/gui/generalsettings.cpp index 235f7e66b..6a5164a26 100644 --- a/src/gui/generalsettings.cpp +++ b/src/gui/generalsettings.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include #define QTLEGACY (QT_VERSION < QT_VERSION_CHECK(5,9,0)) @@ -81,7 +81,7 @@ ZipEntry syncFolderToZipEntry(OCC::Folder *f) return fileInfoToZipEntry(journalInfo); } -QVector createFileList() +QVector createDebugArchiveFileList() { auto list = QVector(); OCC::ConfigFile cfg; @@ -91,8 +91,6 @@ QVector createFileList() const auto logger = OCC::Logger::instance(); if (!logger->logDir().isEmpty()) { - list.append({QString(), QStringLiteral("logs")}); - QDir dir(logger->logDir()); const auto infoList = dir.entryInfoList(QDir::Files); std::transform(std::cbegin(infoList), std::cend(infoList), @@ -112,27 +110,24 @@ QVector createFileList() void createDebugArchive(const QString &filename) { - const auto entries = createFileList(); + const auto entries = createDebugArchiveFileList(); + + KZip zip(filename); + zip.open(QIODevice::WriteOnly); - // TODO: Port away from this private API (best to port to KArchive) - QZipWriter zip(filename); - zip.setCreationPermissions(zip.creationPermissions() | QFile::ReadOther); for (const auto &entry : entries) { - if (entry.localFilename.isEmpty()) { - zip.addDirectory(entry.zipFilename); - } else { - QFile file(entry.localFilename); - if (!file.open(QFile::ReadOnly)) { - continue; - } - zip.addFile(entry.zipFilename, &file); - } + zip.addLocalFile(entry.localFilename, entry.zipFilename); } - zip.addFile("__nextcloud_client_parameters.txt", QCoreApplication::arguments().join(' ').toUtf8()); + const auto clientParameters = QCoreApplication::arguments().join(' ').toUtf8(); + zip.prepareWriting("__nextcloud_client_parameters.txt", {}, {}, clientParameters.size()); + zip.writeData(clientParameters, clientParameters.size()); + zip.finishWriting(clientParameters.size()); - const auto buildInfo = QString(OCC::Theme::instance()->about() + "\n\n" + OCC::Theme::instance()->aboutDetails()); - zip.addFile("__nextcloud_client_buildinfo.txt", buildInfo.toUtf8()); + const auto buildInfo = QString(OCC::Theme::instance()->about() + "\n\n" + OCC::Theme::instance()->aboutDetails()).toUtf8(); + zip.prepareWriting("__nextcloud_client_buildinfo.txt", {}, {}, buildInfo.size()); + zip.writeData(buildInfo, buildInfo.size()); + zip.finishWriting(buildInfo.size()); } } diff --git a/src/gui/generalsettings.h b/src/gui/generalsettings.h index acc8793a9..94688c078 100644 --- a/src/gui/generalsettings.h +++ b/src/gui/generalsettings.h @@ -39,7 +39,7 @@ class GeneralSettings : public QWidget public: explicit GeneralSettings(QWidget *parent = nullptr); ~GeneralSettings() override; - QSize sizeHint() const override; + [[nodiscard]] QSize sizeHint() const override; public slots: void slotStyleChanged(); diff --git a/src/gui/headerbanner.cpp b/src/gui/headerbanner.cpp deleted file mode 100644 index 80fecfb93..000000000 --- a/src/gui/headerbanner.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) by Michael Schuster - * - * 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. - */ - -/**************************************************************************** -** -** Based on Qt sourcecode: -** qt5/qtbase/src/widgets/dialogs/qwizard.cpp -** -** https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qwizard.cpp?h=v5.13.0 -** -** Original license: -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "headerbanner.h" - -#include -#include - -#include -#include -#include - -namespace OCC { - -// These fudge terms were needed a few places to obtain pixel-perfect results -const int GapBetweenLogoAndRightEdge = 5; -const int ModernHeaderTopMargin = 2; - -HeaderBanner::HeaderBanner(QWidget *parent) - : QWidget(parent) -{ - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setBackgroundRole(QPalette::Base); - titleLabel = new QLabel(this); - titleLabel->setBackgroundRole(QPalette::Base); - logoLabel = new QLabel(this); - QFont font = titleLabel->font(); - font.setBold(true); - titleLabel->setFont(font); - layout = new QGridLayout(this); - layout->setContentsMargins(QMargins()); - layout->setSpacing(0); - layout->setRowMinimumHeight(3, 1); - layout->setRowStretch(4, 1); - layout->setColumnStretch(2, 1); - layout->setColumnMinimumWidth(4, 2 * GapBetweenLogoAndRightEdge); - layout->setColumnMinimumWidth(6, GapBetweenLogoAndRightEdge); - layout->addWidget(titleLabel, 1, 1, 5, 1); - layout->addWidget(logoLabel, 1, 5, 5, 1); -} - -void HeaderBanner::setup(const QString &title, const QPixmap &logo, const QPixmap &banner, - const Qt::TextFormat titleFormat, const QString &styleSheet) -{ - QStyle *style = parentWidget()->style(); - //const int layoutHorizontalSpacing = style->pixelMetric(QStyle::PM_LayoutHorizontalSpacing); - int topLevelMarginLeft = style->pixelMetric(QStyle::PM_LayoutLeftMargin, nullptr, parentWidget()); - int topLevelMarginRight = style->pixelMetric(QStyle::PM_LayoutRightMargin, nullptr, parentWidget()); - int topLevelMarginTop = style->pixelMetric(QStyle::PM_LayoutTopMargin, nullptr, parentWidget()); - //int topLevelMarginBottom = style->pixelMetric(QStyle::PM_LayoutBottomMargin, 0, parentWidget()); - - layout->setRowMinimumHeight(0, ModernHeaderTopMargin); - layout->setRowMinimumHeight(1, topLevelMarginTop - ModernHeaderTopMargin - 1); - layout->setRowMinimumHeight(6, 3); - int minColumnWidth0 = topLevelMarginLeft + topLevelMarginRight; - int minColumnWidth1 = topLevelMarginLeft + topLevelMarginRight + 1; - layout->setColumnMinimumWidth(0, minColumnWidth0); - layout->setColumnMinimumWidth(1, minColumnWidth1); - titleLabel->setTextFormat(titleFormat); - titleLabel->setText(title); - if(!styleSheet.isEmpty()) - titleLabel->setStyleSheet(styleSheet); - logoLabel->setPixmap(logo); - bannerPixmap = banner; - if (bannerPixmap.isNull()) { - QSize size = layout->totalMinimumSize(); - setMinimumSize(size); - setMaximumSize(QWIDGETSIZE_MAX, size.height()); - } else { - setFixedHeight(banner.height() + 2); - } - updateGeometry(); -} - -void HeaderBanner::paintEvent(QPaintEvent * /* event */) -{ - QPainter painter(this); - painter.drawPixmap(0, 0, width(), bannerPixmap.height(), bannerPixmap); - int x = width() - 2; - int y = height() - 2; - const QPalette &pal = QGuiApplication::palette(); - painter.setPen(pal.mid().color()); - painter.drawLine(0, y, x, y); - painter.setPen(pal.base().color()); - painter.drawPoint(x + 1, y); - painter.drawLine(0, y + 1, x + 1, y + 1); -} - -} // namespace OCC diff --git a/src/gui/headerbanner.h b/src/gui/headerbanner.h deleted file mode 100644 index dc1e7a3a7..000000000 --- a/src/gui/headerbanner.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) by Michael Schuster - * - * 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. - */ - -/**************************************************************************** -** -** Based on Qt sourcecode: -** qt5/qtbase/src/widgets/dialogs/qwizard.cpp -** -** https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qwizard.cpp?h=v5.13.0 -** -** Original license: -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef HEADERBANNER_H -#define HEADERBANNER_H - -#include - -class QLabel; -class QGridLayout; -class QPixmap; - -namespace OCC { - -class HeaderBanner : public QWidget -{ - Q_OBJECT -public: - HeaderBanner(QWidget *parent = nullptr); - - void setup(const QString &title, const QPixmap &logo, const QPixmap &banner, - const Qt::TextFormat titleFormat, const QString &styleSheet); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - QLabel *titleLabel; - QLabel *logoLabel; - QGridLayout *layout; - QPixmap bannerPixmap; -}; - -} // namespace OCC - -#endif // HEADERBANNER_H diff --git a/src/gui/internallinkwidget.cpp b/src/gui/internallinkwidget.cpp deleted file mode 100644 index e8c65005f..000000000 --- a/src/gui/internallinkwidget.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2022 by Claudio Cambra - * - * 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 "internallinkwidget.h" -#include "accountstate.h" -#include "folderman.h" -#include "theme.h" - -#include "QProgressIndicator.h" -#include - -namespace OCC { - -Q_LOGGING_CATEGORY(lcInternalLink, "nextcloud.gui.internallink", QtInfoMsg) - -InternalLinkWidget::InternalLinkWidget(const QString &localPath, - QWidget *parent) - : QWidget(parent) - , _localPath(localPath) -{ - _ui->setupUi(this); - - const auto folder = FolderMan::instance()->folderForPath(_localPath); - const auto folderRelativePath = _localPath.mid(folder->cleanPath().length() + 1); - const auto serverRelativePath = QDir(folder->remotePath()).filePath(folderRelativePath); - - const auto bindLinkSlot = [this](QString link) { slotLinkFetched(link); }; - - fetchPrivateLinkUrl( - folder->accountState()->account(), - serverRelativePath, - {}, - this, - bindLinkSlot - ); - - _ui->copyInternalLinkButton->setEnabled(false); - _ui->internalLinkProgressIndicator->setVisible(true); - _ui->internalLinkProgressIndicator->startAnimation(); - - connect(_ui->copyInternalLinkButton, &QPushButton::clicked, this, &InternalLinkWidget::slotCopyInternalLink); -} - -void InternalLinkWidget::slotLinkFetched(const QString &url) -{ - _internalUrl = url; - _ui->copyInternalLinkButton->setEnabled(true); - _ui->internalLinkProgressIndicator->setVisible(false); - _ui->internalLinkProgressIndicator->stopAnimation(); - _ui->horizontalSpacer->changeSize(0, 0); - _ui->horizontalSpacer_2->changeSize(0, 0); -} - -void InternalLinkWidget::slotCopyInternalLink() const -{ - QApplication::clipboard()->setText(_internalUrl); -} - -void InternalLinkWidget::setupUiOptions() -{ - customizeStyle(); -} - -void InternalLinkWidget::slotStyleChanged() -{ - customizeStyle(); -} - -void InternalLinkWidget::customizeStyle() -{ - _ui->copyInternalLinkButton->setIcon(Theme::createColorAwareIcon(":/client/theme/copy.svg")); - _ui->internalLinkIconLabel->setPixmap(Theme::createColorAwarePixmap(":/client/theme/external.svg")); -} - -} diff --git a/src/gui/internallinkwidget.h b/src/gui/internallinkwidget.h deleted file mode 100644 index cb343a11e..000000000 --- a/src/gui/internallinkwidget.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2022 by Claudio Cambra - * - * 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 INTERNALLINKWIDGET_H -#define INTERNALLINKWIDGET_H - -#include "QProgressIndicator.h" -#include -#include - -#include "ui_internallinkwidget.h" - -namespace OCC { - -/** - * @brief The ShareDialog class - * @ingroup gui - */ -class InternalLinkWidget : public QWidget -{ - Q_OBJECT - -public: - explicit InternalLinkWidget(const QString &localPath, - QWidget *parent = nullptr); - ~InternalLinkWidget() override = default; - - void setupUiOptions(); - -public slots: - void slotStyleChanged(); - -private slots: - void slotLinkFetched(const QString &url); - void slotCopyInternalLink() const; - -private: - void customizeStyle(); - - std::unique_ptr _ui = std::make_unique(); - QString _localPath; - QString _internalUrl; - - QPushButton *_copyInternalLinkButton{}; -}; -} - -#endif // INTERNALLINKWIDGET_H diff --git a/src/gui/internallinkwidget.ui b/src/gui/internallinkwidget.ui deleted file mode 100644 index 202ec7240..000000000 --- a/src/gui/internallinkwidget.ui +++ /dev/null @@ -1,168 +0,0 @@ - - - OCC::InternalLinkWidget - - - - 0 - 0 - 400 - 238 - - - - - 0 - 0 - - - - - 0 - - - 12 - - - 0 - - - 20 - - - - - 6 - - - 0 - - - - - - - - :/client/theme/external.svg - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - 0 - 0 - - - - Internal link - - - - - - - - 0 - 0 - - - - true - - - color: rgb(118, 118, 118) - - - Only works for users with access to this folder - - - true - - - - - - - - - Qt::Horizontal - - - - 40 - 25 - - - - - - - - - 0 - 0 - - - - - 28 - 27 - - - - - - - - Qt::Horizontal - - - - 40 - 25 - - - - - - - - - - - - :/client/theme/copy.svg:/client/theme/copy.svg - - - false - - - true - - - - - - - - - - - QProgressIndicator - QWidget -
QProgressIndicator.h
- 1 -
-
- - - - -
diff --git a/src/gui/legalnotice.cpp b/src/gui/legalnotice.cpp index 9a8e98208..b19a3be12 100644 --- a/src/gui/legalnotice.cpp +++ b/src/gui/legalnotice.cpp @@ -52,8 +52,8 @@ void LegalNotice::changeEvent(QEvent *e) void LegalNotice::customizeStyle() { - QString notice = tr("

Copyright 2017-2021 Nextcloud GmbH
" - "Copyright 2012-2021 ownCloud GmbH

"); + QString notice = tr("

Copyright 2017-2023 Nextcloud GmbH
" + "Copyright 2012-2023 ownCloud GmbH

"); notice += tr("

Licensed under the GNU General Public License (GPL) Version 2.0 or any later version.

"); diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 7b457366a..d5d106efd 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -16,7 +16,6 @@ #include #include -#include #ifdef Q_OS_UNIX #include @@ -24,14 +23,9 @@ #endif #include "application.h" -#include "fileactivitylistmodel.h" +#include "cocoainitializer.h" #include "theme.h" #include "common/utility.h" -#include "cocoainitializer.h" -#include "userstatusselectormodel.h" -#include "emojimodel.h" -#include "tray/syncstatussummary.h" -#include "tray/unifiedsearchresultslistmodel.h" #if defined(BUILD_UPDATER) #include "updater/updater.h" @@ -67,22 +61,6 @@ int main(int argc, char **argv) Q_INIT_RESOURCE(resources); Q_INIT_RESOURCE(theme); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SyncStatusSummary"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "EmojiModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "UserStatusSelectorModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ActivityListModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "FileActivityListModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "Theme"); - qmlRegisterUncreatableType( - "com.nextcloud.desktopclient", 1, 0, "UnifiedSearchResultsListModel", "UnifiedSearchResultsListModel"); - qRegisterMetaType("UnifiedSearchResultsListModel*"); - - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "UserStatus", "Access to Status enum"); - - qRegisterMetaTypeStreamOperators(); - qRegisterMetaType("UserStatus"); - - // Work around a bug in KDE's qqc2-desktop-style which breaks // buttons with icons not based on a name, by forcing a style name // the platformtheme plugin won't try to force qqc2-desktops-style diff --git a/src/gui/navigationpanehelper.h b/src/gui/navigationpanehelper.h index bb2510ddf..4a0d493ba 100644 --- a/src/gui/navigationpanehelper.h +++ b/src/gui/navigationpanehelper.h @@ -29,7 +29,7 @@ class NavigationPaneHelper : public QObject public: NavigationPaneHelper(FolderMan *folderMan); - bool showInExplorerNavigationPane() const { return _showInExplorerNavigationPane; } + [[nodiscard]] bool showInExplorerNavigationPane() const { return _showInExplorerNavigationPane; } void setShowInExplorerNavigationPane(bool show); void scheduleUpdateCloudStorageRegistry(); diff --git a/src/gui/networksettings.cpp b/src/gui/networksettings.cpp index 7e00b97ac..0be6fa836 100644 --- a/src/gui/networksettings.cpp +++ b/src/gui/networksettings.cpp @@ -252,7 +252,8 @@ void NetworkSettings::checkAccountLocalhost() if (_ui->manualProxyRadioButton->isChecked()) { // Check if at least one account is using localhost, because Qt proxy settings have no // effect for localhost (#7169) - for (const auto &account : AccountManager::instance()->accounts()) { + const auto accounts = AccountManager::instance()->accounts(); + for (const auto &account : accounts) { const auto host = account->account()->url().host(); // Some typical url for localhost if (host == "localhost" || host.startsWith("127.") || host == "[::1]") diff --git a/src/gui/networksettings.h b/src/gui/networksettings.h index 97b892731..8e3a97c44 100644 --- a/src/gui/networksettings.h +++ b/src/gui/networksettings.h @@ -35,7 +35,7 @@ class NetworkSettings : public QWidget public: explicit NetworkSettings(QWidget *parent = nullptr); ~NetworkSettings() override; - QSize sizeHint() const override; + [[nodiscard]] QSize sizeHint() const override; private slots: void saveProxySettings(); diff --git a/src/gui/notificationconfirmjob.cpp b/src/gui/notificationconfirmjob.cpp index 09e147da3..8071aefdd 100644 --- a/src/gui/notificationconfirmjob.cpp +++ b/src/gui/notificationconfirmjob.cpp @@ -56,7 +56,7 @@ bool NotificationConfirmJob::finished() const QString replyStr = reply()->readAll(); if (replyStr.contains("")) { - const QRegularExpression rex("(\\d+)"); + static const QRegularExpression rex("(\\d+)"); const auto rexMatch = rex.match(replyStr); if (rexMatch.hasMatch()) { // this is a error message coming back from ocs. diff --git a/src/gui/ocsjob.cpp b/src/gui/ocsjob.cpp index ab4038c05..68c680b4d 100644 --- a/src/gui/ocsjob.cpp +++ b/src/gui/ocsjob.cpp @@ -40,7 +40,7 @@ void OcsJob::setVerb(const QByteArray &verb) void OcsJob::addParam(const QString &name, const QString &value) { - _params.append(qMakePair(name, value)); + _params.insert(name, value); } void OcsJob::addPassStatusCode(int code) @@ -58,16 +58,21 @@ void OcsJob::addRawHeader(const QByteArray &headerName, const QByteArray &value) _request.setRawHeader(headerName, value); } +QString OcsJob::getParamValue(const QString &key) const +{ + return _params.value(key); +} + static QUrlQuery percentEncodeQueryItems( - const QList> &items) + const QHash &items) { QUrlQuery result; // Note: QUrlQuery::setQueryItems() does not fully percent encode // the query items, see #5042 - foreach (const auto &item, items) { + for (auto it = std::cbegin(items); it != std::cend(items); ++it) { result.addQueryItem( - QUrl::toPercentEncoding(item.first), - QUrl::toPercentEncoding(item.second)); + QUrl::toPercentEncoding(it.key()), + QUrl::toPercentEncoding(it.value())); } return result; } @@ -85,13 +90,13 @@ void OcsJob::start() } else if (_verb == "POST" || _verb == "PUT") { // Url encode the _postParams and put them in a buffer. QByteArray postData; - Q_FOREACH (auto tmp, _params) { + for (auto it = std::cbegin(_params); it != std::cend(_params); ++it) { if (!postData.isEmpty()) { postData.append("&"); } - postData.append(QUrl::toPercentEncoding(tmp.first)); + postData.append(QUrl::toPercentEncoding(it.key())); postData.append("="); - postData.append(QUrl::toPercentEncoding(tmp.second)); + postData.append(QUrl::toPercentEncoding(it.value())); } buffer->setData(postData); } diff --git a/src/gui/ocsjob.h b/src/gui/ocsjob.h index e3b8b475d..6973d7ce0 100644 --- a/src/gui/ocsjob.h +++ b/src/gui/ocsjob.h @@ -19,8 +19,7 @@ #include "abstractnetworkjob.h" #include -#include -#include +#include #include #define OCS_SUCCESS_STATUS_CODE 100 @@ -110,6 +109,8 @@ public: */ void addRawHeader(const QByteArray &headerName, const QByteArray &value); + [[nodiscard]] QString getParamValue(const QString &key) const; + protected slots: @@ -149,7 +150,7 @@ private slots: private: QByteArray _verb; - QList> _params; + QHash _params; QVector _passStatusCodes; QNetworkRequest _request; }; diff --git a/src/gui/ocssharejob.cpp b/src/gui/ocssharejob.cpp index 900074dbc..13c494c4e 100644 --- a/src/gui/ocssharejob.cpp +++ b/src/gui/ocssharejob.cpp @@ -24,16 +24,21 @@ namespace OCC { OcsShareJob::OcsShareJob(AccountPtr account) : OcsJob(account) { - setPath("ocs/v2.php/apps/files_sharing/api/v1/shares"); + setPath(_pathForSharesRequest); connect(this, &OcsJob::jobFinished, this, &OcsShareJob::jobDone); } -void OcsShareJob::getShares(const QString &path) +void OcsShareJob::getShares(const QString &path, const QMap ¶ms) { setVerb("GET"); addParam(QString::fromLatin1("path"), path); addParam(QString::fromLatin1("reshares"), QString("true")); + + for (auto it = std::cbegin(params); it != std::cend(params); ++it) { + addParam(it.key(), it.value()); + } + addPassStatusCode(404); start(); @@ -181,4 +186,6 @@ void OcsShareJob::jobDone(QJsonDocument reply) { emit shareJobFinished(reply, _value); } + +QString const OcsShareJob::_pathForSharesRequest = QStringLiteral("ocs/v2.php/apps/files_sharing/api/v1/shares"); } diff --git a/src/gui/ocssharejob.h b/src/gui/ocssharejob.h index 064706b5c..61d8c1d26 100644 --- a/src/gui/ocssharejob.h +++ b/src/gui/ocssharejob.h @@ -46,7 +46,7 @@ public: * * @param path Path to request shares for (default all shares) */ - void getShares(const QString &path = ""); + void getShares(const QString &path = "", const QMap ¶ms = {}); /** * Delete the current Share @@ -131,6 +131,8 @@ public: */ void getSharedWithMe(); + static const QString _pathForSharesRequest; + signals: /** * Result of the OCS request diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index db4d4e3c6..5ef4b7e4c 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -12,23 +12,33 @@ * for more details. */ -#include "application.h" #include "owncloudgui.h" -#include "theme.h" -#include "folderman.h" -#include "progressdispatcher.h" -#include "owncloudsetupwizard.h" -#include "sharedialog.h" -#include "settingsdialog.h" -#include "logger.h" -#include "logbrowser.h" + #include "account.h" -#include "accountstate.h" -#include "openfilemanager.h" #include "accountmanager.h" -#include "common/syncjournalfilerecord.h" -#include "creds/abstractcredentials.h" +#include "accountstate.h" +#include "application.h" +#include "callstatechecker.h" +#include "emojimodel.h" +#include "fileactivitylistmodel.h" +#include "folderman.h" #include "guiutility.h" +#include "logbrowser.h" +#include "logger.h" +#include "openfilemanager.h" +#include "owncloudsetupwizard.h" +#include "progressdispatcher.h" +#include "settingsdialog.h" +#include "theme.h" +#include "wheelhandler.h" +#include "filedetails/filedetails.h" +#include "filedetails/shareemodel.h" +#include "filedetails/sharemodel.h" +#include "filedetails/sortedsharemodel.h" +#include "tray/sortedactivitylistmodel.h" +#include "tray/syncstatussummary.h" +#include "tray/unifiedsearchresultslistmodel.h" + #ifdef WITH_LIBCLOUDPROVIDERS #include "cloudproviders/cloudprovidermanager.h" #endif @@ -88,11 +98,6 @@ ownCloudGui::ownCloudGui(Application *parent) connect(_tray.data(), &Systray::shutdown, this, &ownCloudGui::slotShutdown); - connect(_tray.data(), &Systray::openShareDialog, - this, [=](const QString &sharePath, const QString &localPath) { - slotShowShareDialog(sharePath, localPath, ShareDialogStartPage::UsersAndGroups); - }); - ProgressDispatcher *pd = ProgressDispatcher::instance(); connect(pd, &ProgressDispatcher::progressInfo, this, &ownCloudGui::slotUpdateProgress); @@ -107,6 +112,35 @@ ownCloudGui::ownCloudGui(Application *parent) this, &ownCloudGui::slotShowOptionalTrayMessage); connect(Logger::instance(), &Logger::guiMessage, this, &ownCloudGui::slotShowGuiMessage); + + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SyncStatusSummary"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "EmojiModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "UserStatusSelectorModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ActivityListModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "FileActivityListModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SortedActivityListModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "WheelHandler"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "CallStateChecker"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "FileDetails"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ShareModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ShareeModel"); + qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SortedShareModel"); + + qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "UnifiedSearchResultsListModel", "UnifiedSearchResultsListModel"); + qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "UserStatus", "Access to Status enum"); + + qRegisterMetaTypeStreamOperators(); + + qRegisterMetaType("ActivityListModel*"); + qRegisterMetaType("UnifiedSearchResultsListModel*"); + qRegisterMetaType("UserStatus"); + qRegisterMetaType("SharePtr"); + qRegisterMetaType("ShareePtr"); + + qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "UserModel", UserModel::instance()); + qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "UserAppsModel", UserAppsModel::instance()); + qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "Theme", Theme::instance()); + qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "Systray", Systray::instance()); } void ownCloudGui::createTray() @@ -164,12 +198,8 @@ void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason) } else if (reason == QSystemTrayIcon::Trigger) { if (OwncloudSetupWizard::bringWizardToFrontIfVisible()) { // brought wizard to front - } else if (_shareDialogs.size() > 0) { - // Share dialog(s) be hidden by other apps, bring them back - Q_FOREACH (const QPointer &shareDialog, _shareDialogs) { - Q_ASSERT(shareDialog.data()); - raiseDialog(shareDialog); - } + } else if (_tray->raiseDialogs()) { + // Brings dialogs hidden by other apps to front, returns true if any raised } else if (_tray->isOpen()) { _tray->hideWindow(); } else { @@ -620,54 +650,14 @@ void ownCloudGui::raiseDialog(QWidget *raiseWidget) } -void ownCloudGui::slotShowShareDialog(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage) +void ownCloudGui::slotShowShareDialog(const QString &localPath) const { - const auto folder = FolderMan::instance()->folderForPath(localPath); - if (!folder) { - qCWarning(lcApplication) << "Could not open share dialog for" << localPath << "no responsible folder found"; - return; - } - - const auto accountState = folder->accountState(); - - const QString file = localPath.mid(folder->cleanPath().length() + 1); - SyncJournalFileRecord fileRecord; - - bool resharingAllowed = true; // lets assume the good - if (folder->journalDb()->getFileRecord(file, &fileRecord) && fileRecord.isValid()) { - // check the permission: Is resharing allowed? - if (!fileRecord._remotePerm.isNull() && !fileRecord._remotePerm.hasPermission(RemotePermissions::CanReshare)) { - resharingAllowed = false; - } - } - - auto maxSharingPermissions = resharingAllowed? SharePermissions(accountState->account()->capabilities().shareDefaultPermissions()) : SharePermissions({}); - - ShareDialog *w = nullptr; - if (_shareDialogs.contains(localPath) && _shareDialogs[localPath]) { - qCInfo(lcApplication) << "Raising share dialog" << sharePath << localPath; - w = _shareDialogs[localPath]; - } else { - qCInfo(lcApplication) << "Opening share dialog" << sharePath << localPath << maxSharingPermissions; - w = new ShareDialog(accountState, sharePath, localPath, maxSharingPermissions, fileRecord.numericFileId(), fileRecord._lockstate, startPage); - w->setAttribute(Qt::WA_DeleteOnClose, true); - - _shareDialogs[localPath] = w; - connect(w, &QObject::destroyed, this, &ownCloudGui::slotRemoveDestroyedShareDialogs); - } - raiseDialog(w); + _tray->createShareDialog(localPath); } -void ownCloudGui::slotRemoveDestroyedShareDialogs() +void ownCloudGui::slotShowFileActivityDialog(const QString &localPath) const { - QMutableMapIterator> it(_shareDialogs); - while (it.hasNext()) { - it.next(); - if (!it.value() || it.value() == sender()) { - it.remove(); - } - } + _tray->createFileActivityDialog(localPath); } - } // end namespace diff --git a/src/gui/owncloudgui.h b/src/gui/owncloudgui.h index 3ffa57cd1..ee38ad496 100644 --- a/src/gui/owncloudgui.h +++ b/src/gui/owncloudgui.h @@ -78,13 +78,13 @@ public slots: void slotShowTrayUpdateMessage(const QString &title, const QString &msg, const QUrl &webUrl); void slotShowOptionalTrayMessage(const QString &title, const QString &msg); void slotFolderOpenAction(const QString &alias); - void slotUpdateProgress(const QString &folder, const ProgressInfo &progress); + void slotUpdateProgress(const QString &folder, const OCC::ProgressInfo &progress); void slotShowGuiMessage(const QString &title, const QString &message); void slotFoldersChanged(); void slotShowSettings(); void slotShowSyncProtocol(); void slotShutdown(); - void slotSyncStateChange(Folder *); + void slotSyncStateChange(OCC::Folder *); void slotTrayClicked(QSystemTrayIcon::ActivationReason reason); void slotToggleLogBrowser(); void slotOpenOwnCloud(); @@ -94,20 +94,17 @@ public slots: void slotHelp(); void slotOpenPath(const QString &path); void slotAccountStateChanged(); - void slotTrayMessageIfServerUnsupported(Account *account); + void slotTrayMessageIfServerUnsupported(OCC::Account *account); /** * Open a share dialog for a file or folder. * - * sharePath is the full remote path to the item, * localPath is the absolute local path to it (so not relative * to the folder). */ - void slotShowShareDialog(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage); - - void slotRemoveDestroyedShareDialogs(); - + void slotShowShareDialog(const QString &localPath) const; + void slotShowFileActivityDialog(const QString &localPath) const; void slotNewAccountWizard(); private slots: @@ -123,8 +120,6 @@ private: QDBusConnection _bus; #endif - QMap> _shareDialogs; - QAction *_actionNewAccountWizard; QAction *_actionSettings; QAction *_actionEstimate; diff --git a/src/gui/owncloudsetupwizard.cpp b/src/gui/owncloudsetupwizard.cpp index 86c4524a8..27f7d6c9f 100644 --- a/src/gui/owncloudsetupwizard.cpp +++ b/src/gui/owncloudsetupwizard.cpp @@ -69,6 +69,12 @@ static QPointer wiz = nullptr; void OwncloudSetupWizard::runWizard(QObject *obj, const char *amember, QWidget *parent) { + ConfigFile cfg; + if (!cfg.overrideServerUrl().isEmpty()) { + Theme::instance()->setOverrideServerUrl(cfg.overrideServerUrl()); + Theme::instance()->setForceOverrideServerUrl(true); + Theme::instance()->setStartLoginFlowAutomatically(true); + } if (!wiz.isNull()) { bringWizardToFrontIfVisible(); return; @@ -109,6 +115,12 @@ void OwncloudSetupWizard::startWizard() } _ocWizard->setProperty("localFolder", localFolder); + { + ConfigFile cfg; + if (!cfg.overrideLocalDir().isEmpty()) { + _ocWizard->setProperty("localFolder", cfg.overrideLocalDir()); + } + } // remember the local folder to compare later if it changed, but clean first QString lf = QDir::fromNativeSeparators(localFolder); @@ -120,15 +132,17 @@ void OwncloudSetupWizard::startWizard() _ocWizard->setRemoteFolder(_remoteFolder); + const auto isEnforcedServerSetup = + Theme::instance()->startLoginFlowAutomatically() && Theme::instance()->forceOverrideServerUrl() && !account->url().isEmpty(); + #ifdef WITH_PROVIDERS - const auto startPage = WizardCommon::Page_Welcome; + const auto startPage = isEnforcedServerSetup ? WizardCommon::Page_ServerSetup : WizardCommon::Page_Welcome; #else // WITH_PROVIDERS const auto startPage = WizardCommon::Page_ServerSetup; #endif // WITH_PROVIDERS _ocWizard->setStartId(startPage); - _ocWizard->restart(); - + _ocWizard->adjustWizardSize(); _ocWizard->open(); _ocWizard->raise(); } diff --git a/src/gui/passwordinputdialog.h b/src/gui/passwordinputdialog.h index 50528a252..614bcbdf7 100644 --- a/src/gui/passwordinputdialog.h +++ b/src/gui/passwordinputdialog.h @@ -30,7 +30,7 @@ public: explicit PasswordInputDialog(const QString &description, const QString &error, QWidget *parent = nullptr); ~PasswordInputDialog() override; - QString password() const; + [[nodiscard]] QString password() const; private: std::unique_ptr _ui; diff --git a/src/gui/proxyauthdialog.h b/src/gui/proxyauthdialog.h index 63a262b8a..75b2ff70a 100644 --- a/src/gui/proxyauthdialog.h +++ b/src/gui/proxyauthdialog.h @@ -38,8 +38,8 @@ public: void setProxyAddress(const QString &address); - QString username() const; - QString password() const; + [[nodiscard]] QString username() const; + [[nodiscard]] QString password() const; /// Resets the dialog for new credential entry. void reset(); diff --git a/src/gui/proxyauthhandler.h b/src/gui/proxyauthhandler.h index 06d28a62a..df9d133c4 100644 --- a/src/gui/proxyauthhandler.h +++ b/src/gui/proxyauthhandler.h @@ -77,8 +77,8 @@ private: int &counter, const QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents); - QString keychainUsernameKey() const; - QString keychainPasswordKey() const; + [[nodiscard]] QString keychainUsernameKey() const; + [[nodiscard]] QString keychainPasswordKey() const; /// The hostname:port of the current proxy, used for detecting switches /// to a different proxy. diff --git a/src/gui/remotewipe.cpp b/src/gui/remotewipe.cpp index 116c9e65c..8a1a0b06d 100644 --- a/src/gui/remotewipe.cpp +++ b/src/gui/remotewipe.cpp @@ -77,7 +77,6 @@ void RemoteWipe::checkJobSlot() //check for errors if (_networkReplyCheck->error() != QNetworkReply::NoError || jsonParseError.error != QJsonParseError::NoError) { - QString errorReason; QString errorFromJson = json["error"].toString(); if (!errorFromJson.isEmpty()) { qCWarning(lcRemoteWipe) << QString("Error returned from the server: %1") @@ -153,7 +152,6 @@ void RemoteWipe::notifyServerSuccessJobSlot() QJsonObject json = QJsonDocument::fromJson(jsonData, &jsonParseError).object(); if (_networkReplySuccess->error() != QNetworkReply::NoError || jsonParseError.error != QJsonParseError::NoError) { - QString errorReason; QString errorFromJson = json["error"].toString(); if (!errorFromJson.isEmpty()) { qCWarning(lcRemoteWipe) << QString("Error returned from the server: %1") diff --git a/src/gui/remotewipe.h b/src/gui/remotewipe.h index b1353e864..f57ec8043 100644 --- a/src/gui/remotewipe.h +++ b/src/gui/remotewipe.h @@ -19,7 +19,7 @@ signals: /** * Notify if wipe was requested */ - void authorized(AccountState*); + void authorized(OCC::AccountState*); /** * Notify if user only needs to login again @@ -44,7 +44,7 @@ private slots: * Once the client has wiped all the required data a POST to * /index.php/core/wipe/success */ - void notifyServerSuccessJob(AccountState *accountState, bool); + void notifyServerSuccessJob(OCC::AccountState *accountState, bool); void notifyServerSuccessJobSlot(); private: @@ -58,4 +58,4 @@ private: friend class ::TestRemoteWipe; }; } -#endif // REMOTEWIPE_H \ No newline at end of file +#endif // REMOTEWIPE_H diff --git a/src/gui/selectivesyncdialog.cpp b/src/gui/selectivesyncdialog.cpp index 3b8a33612..33ad4c064 100644 --- a/src/gui/selectivesyncdialog.cpp +++ b/src/gui/selectivesyncdialog.cpp @@ -163,7 +163,7 @@ void SelectiveSyncWidget::recursiveInsert(QTreeWidgetItem *parent, QStringList p parent->setToolTip(0, path); parent->setData(0, Qt::UserRole, path); } else { - auto *item = static_cast(findFirstChild(parent, pathTrail.first())); + auto *item = dynamic_cast(findFirstChild(parent, pathTrail.first())); if (!item) { item = new SelectiveSyncTreeViewItem(parent); if (parent->checkState(0) == Qt::Checked @@ -201,7 +201,7 @@ void SelectiveSyncWidget::slotUpdateDirectories(QStringList list) QScopedValueRollback isInserting(_inserting); _inserting = true; - auto *root = static_cast(_folderTree->topLevelItem(0)); + auto *root = dynamic_cast(_folderTree->topLevelItem(0)); QUrl url = _account->davUrl(); QString pathToRemove = url.path(); diff --git a/src/gui/selectivesyncdialog.h b/src/gui/selectivesyncdialog.h index d4ecd07e8..d44b957c5 100644 --- a/src/gui/selectivesyncdialog.h +++ b/src/gui/selectivesyncdialog.h @@ -43,7 +43,7 @@ public: /** Returns the oldBlackList passed into setFolderInfo(), except that * a "/" entry is expanded to all top-level folder names. */ - QStringList oldBlackList() const; + [[nodiscard]] QStringList oldBlackList() const; // Estimates the total size of checked items (recursively) qint64 estimatedSize(QTreeWidgetItem *root = nullptr); @@ -52,7 +52,7 @@ public: void setFolderInfo(const QString &folderPath, const QString &rootName, const QStringList &oldBlackList = QStringList()); - QSize sizeHint() const override; + [[nodiscard]] QSize sizeHint() const override; private slots: void slotUpdateDirectories(QStringList); @@ -102,8 +102,8 @@ public: void accept() override; - QStringList createBlackList() const; - QStringList oldBlackList() const; + [[nodiscard]] QStringList createBlackList() const; + [[nodiscard]] QStringList oldBlackList() const; // Estimate the size of the total of sync'ed files from the server qint64 estimatedSize(); diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 611ef236e..ad6f9ea39 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -57,10 +57,7 @@ const float buttonSizeRatio = 1.618f; // golden ratio */ QString shortDisplayNameForSettings(OCC::Account *account, int width) { - QString user = account->davDisplayName(); - if (user.isEmpty()) { - user = account->credentials()->user(); - } + QString user = account->prettyName(); QString host = account->url().host(); int port = account->url().port(); if (port > 0 && port != 80 && port != 443) { @@ -135,6 +132,8 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) auto *networkSettings = new NetworkSettings; _ui->stack->addWidget(networkSettings); + connect(_ui->stack, &QStackedWidget::currentChanged, this, &SettingsDialog::currentPageChanged); + _actionGroupWidgets.insert(generalAction, generalSettings); _actionGroupWidgets.insert(networkAction, networkSettings); @@ -227,7 +226,7 @@ void SettingsDialog::showIssuesList(AccountState *account) const auto userModel = UserModel::instance(); const auto id = userModel->findUserIdForAccount(account); UserModel::instance()->setCurrentUserId(id); - emit Systray::instance()->showWindow(); + Systray::instance()->showWindow(); } void SettingsDialog::accountAdded(AccountState *s) @@ -276,7 +275,7 @@ void SettingsDialog::accountAdded(AccountState *s) void SettingsDialog::slotAccountAvatarChanged() { - auto *account = static_cast(sender()); + auto *account = dynamic_cast(sender()); if (account && _actionForAccount.contains(account)) { QAction *action = _actionForAccount[account]; if (action) { @@ -290,7 +289,7 @@ void SettingsDialog::slotAccountAvatarChanged() void SettingsDialog::slotAccountDisplayNameChanged() { - auto *account = static_cast(sender()); + auto *account = dynamic_cast(sender()); if (account && _actionForAccount.contains(account)) { QAction *action = _actionForAccount[account]; if (action) { diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h index 0d84a1cb1..6034e21bb 100644 --- a/src/gui/settingsdialog.h +++ b/src/gui/settingsdialog.h @@ -45,7 +45,7 @@ class ownCloudGui; class SettingsDialog : public QDialog { Q_OBJECT - Q_PROPERTY(QWidget* currentPage READ currentPage) + Q_PROPERTY(QWidget* currentPage READ currentPage NOTIFY currentPageChanged) public: explicit SettingsDialog(ownCloudGui *gui, QWidget *parent = nullptr); @@ -55,7 +55,7 @@ public: public slots: void showFirstPage(); - void showIssuesList(AccountState *account); + void showIssuesList(OCC::AccountState *account); void slotSwitchPage(QAction *action); void slotAccountAvatarChanged(); void slotAccountDisplayNameChanged(); @@ -63,6 +63,7 @@ public slots: signals: void styleChanged(); void onActivate(); + void currentPageChanged(); protected: void reject() override; @@ -70,8 +71,8 @@ protected: void changeEvent(QEvent *) override; private slots: - void accountAdded(AccountState *); - void accountRemoved(AccountState *); + void accountAdded(OCC::AccountState *); + void accountRemoved(OCC::AccountState *); private: void customizeStyle(); diff --git a/src/gui/sharedialog.cpp b/src/gui/sharedialog.cpp deleted file mode 100644 index 99a0b8356..000000000 --- a/src/gui/sharedialog.cpp +++ /dev/null @@ -1,494 +0,0 @@ -/* - * Copyright (C) by Roeland Jago Douma - * - * 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 "ui_sharedialog.h" -#include "sharedialog.h" -#include "sharee.h" -#include "sharelinkwidget.h" -#include "internallinkwidget.h" -#include "shareusergroupwidget.h" -#include "passwordinputdialog.h" - -#include "sharemanager.h" - -#include "account.h" -#include "accountstate.h" -#include "configfile.h" -#include "theme.h" -#include "thumbnailjob.h" -#include "wordlist.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace { -QString createRandomPassword() -{ - const auto words = OCC::WordList::getRandomWords(10); - - const auto addFirstLetter = [](const QString ¤t, const QString &next) -> QString { - return current + next.at(0); - }; - - return std::accumulate(std::cbegin(words), std::cend(words), QString(), addFirstLetter); -} -} - - -namespace OCC { - -static const int thumbnailSize = 40; - -ShareDialog::ShareDialog(QPointer accountState, - const QString &sharePath, - const QString &localPath, - SharePermissions maxSharingPermissions, - const QByteArray &numericFileId, - SyncJournalFileLockInfo filelockState, - ShareDialogStartPage startPage, - QWidget *parent) - : QDialog(parent) - , _ui(new Ui::ShareDialog) - , _accountState(accountState) - , _sharePath(sharePath) - , _localPath(localPath) - , _maxSharingPermissions(maxSharingPermissions) - , _filelockState(std::move(filelockState)) - , _privateLinkUrl(accountState->account()->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded)) - , _startPage(startPage) -{ - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - setAttribute(Qt::WA_DeleteOnClose); - setObjectName("SharingDialog"); // required as group for saveGeometry call - - _ui->setupUi(this); - - // We want to act on account state changes - connect(_accountState.data(), &AccountState::stateChanged, this, &ShareDialog::slotAccountStateChanged); - - // Set icon - QFileInfo f_info(_localPath); - QFileIconProvider icon_provider; - QIcon icon = icon_provider.icon(f_info); - auto pixmap = icon.pixmap(thumbnailSize, thumbnailSize); - if (pixmap.width() > 0) { - _ui->label_icon->setPixmap(pixmap); - } - - // Set filename - QString fileName = QFileInfo(_sharePath).fileName(); - _ui->label_name->setText(tr("%1").arg(fileName)); - QFont f(_ui->label_name->font()); - f.setPointSize(qRound(f.pointSize() * 1.4)); - _ui->label_name->setFont(f); - - if (_filelockState._locked) { - static constexpr auto SECONDS_PER_MINUTE = 60; - const auto lockExpirationTime = _filelockState._lockTime + _filelockState._lockTimeout; - const auto remainingTime = QDateTime::currentDateTime().secsTo(QDateTime::fromSecsSinceEpoch(lockExpirationTime)); - const auto remainingTimeInMinute = static_cast(remainingTime > 0 ? remainingTime / SECONDS_PER_MINUTE : 0); - _ui->label_lockinfo->setText(tr("Locked by %1 - Expires in %2 minutes", "remaining time before lock expires", remainingTimeInMinute).arg(_filelockState._lockOwnerDisplayName).arg(remainingTimeInMinute)); - } else { - _ui->label_lockinfo->setVisible(false); - } - - QString ocDir(_sharePath); - ocDir.truncate(ocDir.length() - fileName.length()); - - ocDir.replace(QRegularExpression("^/*"), ""); - ocDir.replace(QRegularExpression("/*$"), ""); - - // Laying this out is complex because sharePath - // may be in use or not. - _ui->gridLayout->removeWidget(_ui->label_sharePath); - _ui->gridLayout->removeWidget(_ui->label_name); - if (ocDir.isEmpty()) { - _ui->gridLayout->addWidget(_ui->label_name, 0, 1, 2, 1); - _ui->label_sharePath->setText(QString()); - } else { - _ui->gridLayout->addWidget(_ui->label_name, 0, 1, 1, 1); - _ui->gridLayout->addWidget(_ui->label_sharePath, 1, 1, 1, 1); - _ui->label_sharePath->setText(tr("Folder: %2").arg(ocDir)); - } - - this->setWindowTitle(tr("%1 Sharing").arg(Theme::instance()->appNameGUI())); - - if (!accountState->account()->capabilities().shareAPI()) { - return; - } - - if (QFileInfo(_localPath).isFile()) { - auto *job = new ThumbnailJob(_sharePath, _accountState->account(), this); - connect(job, &ThumbnailJob::jobFinished, this, &ShareDialog::slotThumbnailFetched); - job->start(); - } - - auto job = new PropfindJob(accountState->account(), _sharePath); - job->setProperties( - QList() - << "http://open-collaboration-services.org/ns:share-permissions" - << "http://owncloud.org/ns:fileid" // numeric file id for fallback private link generation - << "http://owncloud.org/ns:privatelink"); - job->setTimeout(10 * 1000); - connect(job, &PropfindJob::result, this, &ShareDialog::slotPropfindReceived); - connect(job, &PropfindJob::finishedWithError, this, &ShareDialog::slotPropfindError); - job->start(); - - initShareManager(); - - _scrollAreaViewPort = new QWidget(_ui->scrollArea); - _scrollAreaLayout = new QVBoxLayout(_scrollAreaViewPort); - _scrollAreaLayout->setContentsMargins(0, 0, 0, 0); - _ui->scrollArea->setWidget(_scrollAreaViewPort); - - _internalLinkWidget = new InternalLinkWidget(localPath, this); - _ui->verticalLayout->addWidget(_internalLinkWidget); - _internalLinkWidget->setupUiOptions(); - connect(this, &ShareDialog::styleChanged, _internalLinkWidget, &InternalLinkWidget::slotStyleChanged); - - adjustScrollWidget(); -} - -ShareLinkWidget *ShareDialog::addLinkShareWidget(const QSharedPointer &linkShare) -{ - const auto linkShareWidget = new ShareLinkWidget(_accountState->account(), _sharePath, _localPath, _maxSharingPermissions, _ui->scrollArea); - _linkWidgetList.append(linkShareWidget); - - linkShareWidget->setLinkShare(linkShare); - - connect(linkShare.data(), &Share::serverError, linkShareWidget, &ShareLinkWidget::slotServerError); - connect(linkShare.data(), &Share::shareDeleted, linkShareWidget, &ShareLinkWidget::slotDeleteShareFetched); - - if(_manager) { - connect(_manager, &ShareManager::serverError, linkShareWidget, &ShareLinkWidget::slotServerError); - } - - // Connect all shares signals to gui slots - connect(this, &ShareDialog::toggleShareLinkAnimation, linkShareWidget, &ShareLinkWidget::slotToggleShareLinkAnimation); - connect(linkShareWidget, &ShareLinkWidget::createLinkShare, this, &ShareDialog::slotCreateLinkShare); - connect(linkShareWidget, &ShareLinkWidget::deleteLinkShare, this, &ShareDialog::slotDeleteShare); - connect(linkShareWidget, &ShareLinkWidget::createPassword, this, &ShareDialog::slotCreatePasswordForLinkShare); - - // Connect styleChanged events to our widget, so it can adapt (Dark-/Light-Mode switching) - connect(this, &ShareDialog::styleChanged, linkShareWidget, &ShareLinkWidget::slotStyleChanged); - - _ui->verticalLayout->insertWidget(_linkWidgetList.size() + 1, linkShareWidget); - _scrollAreaLayout->addWidget(linkShareWidget); - - linkShareWidget->setupUiOptions(); - adjustScrollWidget(); - - return linkShareWidget; -} - -void ShareDialog::initLinkShareWidget() -{ - if(_linkWidgetList.size() == 0) { - _emptyShareLinkWidget = new ShareLinkWidget(_accountState->account(), _sharePath, _localPath, _maxSharingPermissions, _ui->scrollArea); - _linkWidgetList.append(_emptyShareLinkWidget); - - _emptyShareLinkWidget->slotStyleChanged(); // Get the initial customizeStyle() to happen - - connect(this, &ShareDialog::toggleShareLinkAnimation, _emptyShareLinkWidget, &ShareLinkWidget::slotToggleShareLinkAnimation); - connect(this, &ShareDialog::styleChanged, _emptyShareLinkWidget, &ShareLinkWidget::slotStyleChanged); - - connect(_emptyShareLinkWidget, &ShareLinkWidget::createLinkShare, this, &ShareDialog::slotCreateLinkShare); - connect(_emptyShareLinkWidget, &ShareLinkWidget::createPassword, this, &ShareDialog::slotCreatePasswordForLinkShare); - - _ui->verticalLayout->insertWidget(_linkWidgetList.size()+1, _emptyShareLinkWidget); - _scrollAreaLayout->addWidget(_emptyShareLinkWidget); - _emptyShareLinkWidget->show(); - } else if (_emptyShareLinkWidget) { - _emptyShareLinkWidget->hide(); - _ui->verticalLayout->removeWidget(_emptyShareLinkWidget); - _linkWidgetList.removeAll(_emptyShareLinkWidget); - _emptyShareLinkWidget = nullptr; - } - - adjustScrollWidget(); -} - -void ShareDialog::slotAddLinkShareWidget(const QSharedPointer &linkShare) -{ - emit toggleShareLinkAnimation(true); - const auto addedLinkShareWidget = addLinkShareWidget(linkShare); - initLinkShareWidget(); - if (linkShare->isPasswordSet()) { - addedLinkShareWidget->focusPasswordLineEdit(); - } - emit toggleShareLinkAnimation(false); -} - -void ShareDialog::slotSharesFetched(const QList> &shares) -{ - emit toggleShareLinkAnimation(true); - - const QString versionString = _accountState->account()->serverVersion(); - qCInfo(lcSharing) << versionString << "Fetched" << shares.count() << "shares"; - - foreach (auto share, shares) { - if (share->getShareType() != Share::TypeLink || share->getUidOwner() != share->account()->davUser()) { - continue; - } - - QSharedPointer linkShare = qSharedPointerDynamicCast(share); - addLinkShareWidget(linkShare); - } - - initLinkShareWidget(); - emit toggleShareLinkAnimation(false); -} - -void ShareDialog::adjustScrollWidget() -{ - _ui->scrollArea->setVisible(_scrollAreaLayout->count() > 0); - - // Sometimes the contentRect returns a height of 0, so we need a backup plan - const auto scrollAreaContentHeight = _scrollAreaLayout->contentsRect().height(); - - auto linkWidgetHeights = 0; - - if(scrollAreaContentHeight == 0 && !_linkWidgetList.empty()) { - for (const auto linkWidget : _linkWidgetList) { - linkWidgetHeights += linkWidget->height() - 10; - } - } - - const auto overAvailableHeight = scrollAreaContentHeight > _ui->scrollArea->height() || - linkWidgetHeights > _ui->scrollArea->height(); - - _ui->scrollArea->setFrameShape(overAvailableHeight ? QFrame::StyledPanel : QFrame::NoFrame); - _ui->verticalLayout->setSpacing(overAvailableHeight ? 10 : 0); -} - -ShareDialog::~ShareDialog() -{ - _linkWidgetList.clear(); - delete _ui; -} - -void ShareDialog::done(int r) -{ - ConfigFile cfg; - cfg.saveGeometry(this); - QDialog::done(r); -} - -void ShareDialog::slotPropfindReceived(const QVariantMap &result) -{ - const QVariant receivedPermissions = result["share-permissions"]; - if (!receivedPermissions.toString().isEmpty()) { - _maxSharingPermissions = static_cast(receivedPermissions.toInt()); - qCInfo(lcSharing) << "Received sharing permissions for" << _sharePath << _maxSharingPermissions; - } - auto privateLinkUrl = result["privatelink"].toString(); - auto numericFileId = result["fileid"].toByteArray(); - if (!privateLinkUrl.isEmpty()) { - qCInfo(lcSharing) << "Received private link url for" << _sharePath << privateLinkUrl; - _privateLinkUrl = privateLinkUrl; - } else if (!numericFileId.isEmpty()) { - qCInfo(lcSharing) << "Received numeric file id for" << _sharePath << numericFileId; - _privateLinkUrl = _accountState->account()->deprecatedPrivateLinkUrl(numericFileId).toString(QUrl::FullyEncoded); - } - - showSharingUi(); -} - -void ShareDialog::slotPropfindError() -{ - // On error show the share ui anyway. The user can still see shares, - // delete them and so on, even though adding new shares or granting - // some of the permissions might fail. - - showSharingUi(); -} - -void ShareDialog::showSharingUi() -{ - auto theme = Theme::instance(); - - // There's no difference between being unable to reshare and - // being unable to reshare with reshare permission. - bool canReshare = _maxSharingPermissions & SharePermissionShare; - - if (!canReshare) { - auto label = new QLabel(this); - label->setText(tr("The file cannot be shared because it does not have sharing permission.")); - label->setWordWrap(true); - _ui->verticalLayout->insertWidget(1, label); - return; - } - - if (theme->userGroupSharing()) { - _userGroupWidget = new ShareUserGroupWidget(_accountState->account(), _sharePath, _localPath, _maxSharingPermissions, _privateLinkUrl, _ui->scrollArea); - _userGroupWidget->getShares(); - - // Connect styleChanged events to our widget, so it can adapt (Dark-/Light-Mode switching) - connect(this, &ShareDialog::styleChanged, _userGroupWidget, &ShareUserGroupWidget::slotStyleChanged); - - _userGroupWidget->slotStyleChanged(); - - _ui->verticalLayout->insertWidget(1, _userGroupWidget); - _scrollAreaLayout->addLayout(_userGroupWidget->shareUserGroupLayout()); - } - - initShareManager(); - - if (theme->linkSharing()) { - if(_manager) { - _manager->fetchShares(_sharePath); - } - } - - adjustScrollWidget(); -} - -void ShareDialog::initShareManager() -{ - bool sharingPossible = true; - if (!_accountState->account()->capabilities().sharePublicLink()) { - qCWarning(lcSharing) << "Link shares have been disabled"; - sharingPossible = false; - } else if (!(_maxSharingPermissions & SharePermissionShare)) { - qCWarning(lcSharing) << "The file cannot be shared because it does not have sharing permission."; - sharingPossible = false; - } - - if (!_manager && sharingPossible) { - _manager = new ShareManager(_accountState->account(), this); - connect(_manager, &ShareManager::sharesFetched, this, &ShareDialog::slotSharesFetched); - connect(_manager, &ShareManager::linkShareCreated, this, &ShareDialog::slotAddLinkShareWidget); - connect(_manager, &ShareManager::linkShareRequiresPassword, this, &ShareDialog::slotLinkShareRequiresPassword); - } -} - -void ShareDialog::slotCreateLinkShare() -{ - if(_manager) { - const auto askOptionalPassword = _accountState->account()->capabilities().sharePublicLinkAskOptionalPassword(); - const auto password = askOptionalPassword ? createRandomPassword() : QString(); - _manager->createLinkShare(_sharePath, QString(), password); - } -} - -void ShareDialog::slotCreatePasswordForLinkShare(const QString &password) -{ - const auto shareLinkWidget = qobject_cast(sender()); - Q_ASSERT(shareLinkWidget); - if (shareLinkWidget) { - connect(_manager, &ShareManager::linkShareRequiresPassword, shareLinkWidget, &ShareLinkWidget::slotCreateShareRequiresPassword); - connect(shareLinkWidget, &ShareLinkWidget::createPasswordProcessed, this, &ShareDialog::slotCreatePasswordForLinkShareProcessed); - shareLinkWidget->getLinkShare()->setPassword(password); - } else { - qCCritical(lcSharing) << "shareLinkWidget is not a sender!"; - } -} - -void ShareDialog::slotCreatePasswordForLinkShareProcessed() -{ - const auto shareLinkWidget = qobject_cast(sender()); - Q_ASSERT(shareLinkWidget); - if (shareLinkWidget) { - disconnect(_manager, &ShareManager::linkShareRequiresPassword, shareLinkWidget, &ShareLinkWidget::slotCreateShareRequiresPassword); - disconnect(shareLinkWidget, &ShareLinkWidget::createPasswordProcessed, this, &ShareDialog::slotCreatePasswordForLinkShareProcessed); - } else { - qCCritical(lcSharing) << "shareLinkWidget is not a sender!"; - } -} - -void ShareDialog::slotLinkShareRequiresPassword(const QString &message) -{ - const auto passwordInputDialog = new PasswordInputDialog(tr("Please enter a password for your link share:"), message, this); - passwordInputDialog->setWindowTitle(tr("Password for share required")); - passwordInputDialog->setAttribute(Qt::WA_DeleteOnClose); - passwordInputDialog->open(); - - connect(passwordInputDialog, &QDialog::finished, this, [this, passwordInputDialog](const int result) { - if (result == QDialog::Accepted && _manager) { - // Try to create the link share again with the newly entered password - _manager->createLinkShare(_sharePath, QString(), passwordInputDialog->password()); - return; - } - emit toggleShareLinkAnimation(false); - }); -} - -void ShareDialog::slotDeleteShare() -{ - auto sharelinkWidget = dynamic_cast(sender()); - sharelinkWidget->hide(); - _ui->verticalLayout->removeWidget(sharelinkWidget); - _scrollAreaLayout->removeWidget(sharelinkWidget); - _linkWidgetList.removeAll(sharelinkWidget); - initLinkShareWidget(); -} - -void ShareDialog::slotThumbnailFetched(const int &statusCode, const QByteArray &reply) -{ - if (statusCode != 200) { - qCWarning(lcSharing) << "Thumbnail status code: " << statusCode; - return; - } - - QPixmap p; - p.loadFromData(reply, "PNG"); - p = p.scaledToHeight(thumbnailSize, Qt::SmoothTransformation); - _ui->label_icon->setPixmap(p); - _ui->label_icon->show(); -} - -void ShareDialog::slotAccountStateChanged(int state) -{ - bool enabled = (state == AccountState::State::Connected); - qCDebug(lcSharing) << "Account connected?" << enabled; - - if (_userGroupWidget) { - _userGroupWidget->setEnabled(enabled); - } - - if(_linkWidgetList.size() > 0){ - foreach(ShareLinkWidget *widget, _linkWidgetList){ - widget->setEnabled(state); - } - } -} - -void ShareDialog::changeEvent(QEvent *e) -{ - switch (e->type()) { - case QEvent::StyleChange: - case QEvent::PaletteChange: - case QEvent::ThemeChange: - // Notify the other widgets (Dark-/Light-Mode switching) - emit styleChanged(); - break; - default: - break; - } - - QDialog::changeEvent(e); -} - -void ShareDialog::resizeEvent(QResizeEvent *event) -{ - adjustScrollWidget(); - QDialog::resizeEvent(event); -} - -} // namespace OCC diff --git a/src/gui/sharedialog.h b/src/gui/sharedialog.h deleted file mode 100644 index 89bb2ef70..000000000 --- a/src/gui/sharedialog.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) by Roeland Jago Douma - * - * 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 SHAREDIALOG_H -#define SHAREDIALOG_H - -#include "accountstate.h" -#include "sharepermissions.h" -#include "owncloudgui.h" -#include "common/syncjournalfilerecord.h" - -#include -#include -#include -#include -#include - -class QProgressIndicator; -class QVBoxLayout; - -namespace OCC { - -namespace Ui { - class ShareDialog; -} - -class ShareLinkWidget; -class InternalLinkWidget; -class ShareUserGroupWidget; -class ShareManager; -class LinkShare; -class Share; - -class ShareDialog : public QDialog -{ - Q_OBJECT - -public: - explicit ShareDialog(QPointer accountState, - const QString &sharePath, - const QString &localPath, - SharePermissions maxSharingPermissions, - const QByteArray &numericFileId, - SyncJournalFileLockInfo filelockState, - ShareDialogStartPage startPage, - QWidget *parent = nullptr); - ~ShareDialog() override; - -private slots: - void done(int r) override; - void slotPropfindReceived(const QVariantMap &result); - void slotPropfindError(); - void slotThumbnailFetched(const int &statusCode, const QByteArray &reply); - void slotAccountStateChanged(int state); - - void slotSharesFetched(const QList> &shares); - void slotAddLinkShareWidget(const QSharedPointer &linkShare); - void slotDeleteShare(); - void slotCreateLinkShare(); - void slotCreatePasswordForLinkShare(const QString &password); - void slotCreatePasswordForLinkShareProcessed(); - void slotLinkShareRequiresPassword(const QString &message); - -signals: - void toggleShareLinkAnimation(bool start); - void styleChanged(); - -protected: - void changeEvent(QEvent *) override; - void resizeEvent(QResizeEvent *event) override; - -private: - void showSharingUi(); - void initShareManager(); - ShareLinkWidget *addLinkShareWidget(const QSharedPointer &linkShare); - void initLinkShareWidget(); - void adjustScrollWidget(); - - Ui::ShareDialog *_ui; - - QPointer _accountState; - QString _sharePath; - QString _localPath; - SharePermissions _maxSharingPermissions; - QByteArray _numericFileId; - SyncJournalFileLockInfo _filelockState; - QString _privateLinkUrl; - ShareDialogStartPage _startPage; - ShareManager *_manager = nullptr; - - QList _linkWidgetList; - ShareLinkWidget* _emptyShareLinkWidget = nullptr; - InternalLinkWidget* _internalLinkWidget = nullptr; - ShareUserGroupWidget *_userGroupWidget = nullptr; - QProgressIndicator *_progressIndicator = nullptr; - - QWidget *_scrollAreaViewPort = nullptr; - QVBoxLayout *_scrollAreaLayout = nullptr; -}; - -} // namespace OCC - -#endif // SHAREDIALOG_H diff --git a/src/gui/sharedialog.ui b/src/gui/sharedialog.ui deleted file mode 100644 index 8e4bbbfd8..000000000 --- a/src/gui/sharedialog.ui +++ /dev/null @@ -1,217 +0,0 @@ - - - OCC::ShareDialog - - - - 0 - 0 - 385 - 400 - - - - - 0 - 0 - - - - - 320 - 240 - - - - - 0 - - - QLayout::SetMinimumSize - - - - - 0 - - - QLayout::SetDefaultConstraint - - - - - 0 - - - 0 - - - 0 - - - 2 - - - - - - 0 - 0 - - - - - 315 - 0 - - - - share label - - - Qt::PlainText - - - true - - - - - - - - 0 - 0 - - - - - 315 - 0 - - - - TextLabel - - - Qt::PlainText - - - true - - - - - - - - 0 - 0 - - - - - 315 - 0 - - - - - false - - - - Nextcloud Path: - - - Qt::PlainText - - - true - - - - - - - - 0 - 0 - - - - - 40 - 40 - - - - - 16777215 - 16777215 - - - - Icon - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Plain - - - Qt::ScrollBarAsNeeded - - - Qt::ScrollBarAlwaysOff - - - QAbstractScrollArea::AdjustToContentsOnFirstShow - - - true - - - - - 0 - 0 - 359 - 320 - - - - - 0 - 0 - - - - - - - - - - - - diff --git a/src/gui/sharee.cpp b/src/gui/sharee.cpp index ed447e2a8..206a9d0e6 100644 --- a/src/gui/sharee.cpp +++ b/src/gui/sharee.cpp @@ -66,160 +66,4 @@ Sharee::Type Sharee::type() const return _type; } -ShareeModel::ShareeModel(const AccountPtr &account, const QString &type, QObject *parent) - : QAbstractListModel(parent) - , _account(account) - , _type(type) -{ -} - -void ShareeModel::fetch(const QString &search, const ShareeSet &blacklist, LookupMode lookupMode) -{ - _search = search; - _shareeBlacklist = blacklist; - auto *job = new OcsShareeJob(_account); - connect(job, &OcsShareeJob::shareeJobFinished, this, &ShareeModel::shareesFetched); - connect(job, &OcsJob::ocsError, this, &ShareeModel::displayErrorMessage); - job->getSharees(_search, _type, 1, 50, lookupMode == GlobalSearch ? true : false); -} - -void ShareeModel::shareesFetched(const QJsonDocument &reply) -{ - QVector> newSharees; - - { - const QStringList shareeTypes {"users", "groups", "emails", "remotes", "circles", "rooms"}; - - const auto appendSharees = [this, &shareeTypes](const QJsonObject &data, QVector>& out) { - for (const auto &shareeType : shareeTypes) { - const auto category = data.value(shareeType).toArray(); - for (const auto &sharee : category) { - out.append(parseSharee(sharee.toObject())); - } - } - }; - - appendSharees(reply.object().value("ocs").toObject().value("data").toObject(), newSharees); - appendSharees(reply.object().value("ocs").toObject().value("data").toObject().value("exact").toObject(), newSharees); - } - - // Filter sharees that we have already shared with - QVector> filteredSharees; - foreach (const auto &sharee, newSharees) { - bool found = false; - foreach (const auto &blacklistSharee, _shareeBlacklist) { - if (sharee->type() == blacklistSharee->type() && sharee->shareWith() == blacklistSharee->shareWith()) { - found = true; - break; - } - } - - if (found == false) { - filteredSharees.append(sharee); - } - } - - setNewSharees(filteredSharees); - shareesReady(); -} - -QSharedPointer ShareeModel::parseSharee(const QJsonObject &data) -{ - QString displayName = data.value("label").toString(); - const QString shareWith = data.value("value").toObject().value("shareWith").toString(); - Sharee::Type type = (Sharee::Type)data.value("value").toObject().value("shareType").toInt(); - const QString additionalInfo = data.value("value").toObject().value("shareWithAdditionalInfo").toString(); - if (!additionalInfo.isEmpty()) { - displayName = tr("%1 (%2)", "sharee (shareWithAdditionalInfo)").arg(displayName, additionalInfo); - } - - return QSharedPointer(new Sharee(shareWith, displayName, type)); -} - - -// Helper function for setNewSharees (could be a lambda when we can use them) -static QSharedPointer shareeFromModelIndex(const QModelIndex &idx) -{ - return idx.data(Qt::UserRole).value>(); -} - -struct FindShareeHelper -{ - const QSharedPointer &sharee; - bool operator()(const QSharedPointer &s2) const - { - return s2->format() == sharee->format() && s2->displayName() == sharee->format(); - } -}; - -/* Set the new sharee - - Do that while preserving the model index so the selection stays -*/ -void ShareeModel::setNewSharees(const QVector> &newSharees) -{ - layoutAboutToBeChanged(); - const auto persistent = persistentIndexList(); - QVector> oldPersistantSharee; - oldPersistantSharee.reserve(persistent.size()); - - std::transform(persistent.begin(), persistent.end(), std::back_inserter(oldPersistantSharee), - shareeFromModelIndex); - - _sharees = newSharees; - - QModelIndexList newPersistant; - newPersistant.reserve(persistent.size()); - foreach (const QSharedPointer &sharee, oldPersistantSharee) { - FindShareeHelper helper = { sharee }; - auto it = std::find_if(_sharees.constBegin(), _sharees.constEnd(), helper); - if (it == _sharees.constEnd()) { - newPersistant << QModelIndex(); - } else { - newPersistant << index(std::distance(_sharees.constBegin(), it)); - } - } - - changePersistentIndexList(persistent, newPersistant); - layoutChanged(); -} - - -int ShareeModel::rowCount(const QModelIndex &) const -{ - return _sharees.size(); -} - -QVariant ShareeModel::data(const QModelIndex &index, int role) const -{ - if (index.row() < 0 || index.row() > _sharees.size()) { - return QVariant(); - } - - const auto &sharee = _sharees.at(index.row()); - if (role == Qt::DisplayRole) { - return sharee->format(); - - } else if (role == Qt::EditRole) { - // This role is used by the completer - it should match - // the full name and the user name and thus we include both - // in the output here. But we need to take care this string - // doesn't leak to the user. - return QString(sharee->displayName() + " (" + sharee->shareWith() + ")"); - - } else if (role == Qt::UserRole) { - return QVariant::fromValue(sharee); - } - - return QVariant(); -} - -QSharedPointer ShareeModel::getSharee(int at) -{ - if (at < 0 || at > _sharees.size()) { - return QSharedPointer(nullptr); - } - - return _sharees.at(at); -} } diff --git a/src/gui/sharee.h b/src/gui/sharee.h index 2e69552c8..2139a9117 100644 --- a/src/gui/sharee.h +++ b/src/gui/sharee.h @@ -50,10 +50,10 @@ public: const QString displayName, const Type type); - QString format() const; - QString shareWith() const; - QString displayName() const; - Type type() const; + [[nodiscard]] QString format() const; + [[nodiscard]] QString shareWith() const; + [[nodiscard]] QString displayName() const; + [[nodiscard]] Type type() const; private: QString _shareWith; @@ -61,47 +61,9 @@ private: Type _type; }; - -class ShareeModel : public QAbstractListModel -{ - Q_OBJECT -public: - enum LookupMode { - LocalSearch = 0, - GlobalSearch = 1 - }; - - explicit ShareeModel(const AccountPtr &account, const QString &type, QObject *parent = nullptr); - - using ShareeSet = QVector>; // FIXME: make it a QSet when Sharee can be compared - void fetch(const QString &search, const ShareeSet &blacklist, LookupMode lookupMode); - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role) const override; - - QSharedPointer getSharee(int at); - - QString currentSearch() const { return _search; } - -signals: - void shareesReady(); - void displayErrorMessage(int code, const QString &); - -private slots: - void shareesFetched(const QJsonDocument &reply); - -private: - QSharedPointer parseSharee(const QJsonObject &data); - void setNewSharees(const QVector> &newSharees); - - AccountPtr _account; - QString _search; - QString _type; - - QVector> _sharees; - QVector> _shareeBlacklist; -}; +using ShareePtr = QSharedPointer; } -Q_DECLARE_METATYPE(QSharedPointer) +Q_DECLARE_METATYPE(OCC::ShareePtr) #endif //SHAREE_H diff --git a/src/gui/sharelinkwidget.cpp b/src/gui/sharelinkwidget.cpp deleted file mode 100644 index 3f6b437a6..000000000 --- a/src/gui/sharelinkwidget.cpp +++ /dev/null @@ -1,625 +0,0 @@ -/* - * Copyright (C) by Roeland Jago Douma - * Copyright (C) 2015 by Klaas Freitag - * - * 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 "ui_sharelinkwidget.h" -#include "sharelinkwidget.h" -#include "account.h" -#include "capabilities.h" -#include "guiutility.h" -#include "sharemanager.h" -#include "theme.h" -#include "elidedlabel.h" - -#include "QProgressIndicator.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace { - const char *passwordIsSetPlaceholder = "●●●●●●●●"; -} - -namespace OCC { - -Q_LOGGING_CATEGORY(lcShareLink, "nextcloud.gui.sharelink", QtInfoMsg) - -ShareLinkWidget::ShareLinkWidget(AccountPtr account, - const QString &sharePath, - const QString &localPath, - SharePermissions maxSharingPermissions, - QWidget *parent) - : QWidget(parent) - , _ui(new Ui::ShareLinkWidget) - , _account(account) - , _sharePath(sharePath) - , _localPath(localPath) - , _linkShare(nullptr) - , _passwordRequired(false) - , _expiryRequired(false) - , _namesSupported(true) - , _noteRequired(false) - , _linkContextMenu(nullptr) - , _readOnlyLinkAction(nullptr) - , _allowEditingLinkAction(nullptr) - , _allowUploadEditingLinkAction(nullptr) - , _allowUploadLinkAction(nullptr) - , _passwordProtectLinkAction(nullptr) - , _expirationDateLinkAction(nullptr) - , _unshareLinkAction(nullptr) - , _noteLinkAction(nullptr) -{ - _ui->setupUi(this); - - _ui->shareLinkToolButton->hide(); - - //Is this a file or folder? - QFileInfo fi(localPath); - _isFile = fi.isFile(); - - connect(_ui->enableShareLink, &QPushButton::clicked, this, &ShareLinkWidget::slotCreateShareLink); - connect(_ui->lineEdit_password, &QLineEdit::returnPressed, this, &ShareLinkWidget::slotCreatePassword); - connect(_ui->confirmPassword, &QAbstractButton::clicked, this, &ShareLinkWidget::slotCreatePassword); - connect(_ui->confirmNote, &QAbstractButton::clicked, this, &ShareLinkWidget::slotCreateNote); - connect(_ui->confirmExpirationDate, &QAbstractButton::clicked, this, &ShareLinkWidget::slotSetExpireDate); - - _ui->errorLabel->hide(); - - if (!_account->capabilities().sharePublicLink()) { - qCWarning(lcShareLink) << "Link shares have been disabled"; - } else if (!(maxSharingPermissions & SharePermissionShare)) { - qCWarning(lcShareLink) << "The file can not be shared because it was shared without sharing permission."; - } - - _ui->enableShareLink->setChecked(false); - _ui->shareLinkToolButton->setEnabled(false); - _ui->shareLinkToolButton->hide(); - - // Older servers don't support multiple public link shares - if (!_account->capabilities().sharePublicLinkMultiple()) { - _namesSupported = false; - } - - togglePasswordOptions(false); - toggleExpireDateOptions(false); - toggleNoteOptions(false); - - _ui->noteProgressIndicator->setVisible(false); - _ui->passwordProgressIndicator->setVisible(false); - _ui->expirationDateProgressIndicator->setVisible(false); - _ui->sharelinkProgressIndicator->setVisible(false); - - // check if the file is already inside of a synced folder - if (sharePath.isEmpty()) { - qCWarning(lcShareLink) << "Unable to share files not in a sync folder."; - return; - } -} - -ShareLinkWidget::~ShareLinkWidget() -{ - delete _ui; -} - -void ShareLinkWidget::slotToggleShareLinkAnimation(const bool start) -{ - _ui->sharelinkProgressIndicator->setVisible(start); - if (start) { - if (!_ui->sharelinkProgressIndicator->isAnimated()) { - _ui->sharelinkProgressIndicator->startAnimation(); - } - } else { - _ui->sharelinkProgressIndicator->stopAnimation(); - } -} - -void ShareLinkWidget::toggleButtonAnimation(QToolButton *button, QProgressIndicator *progressIndicator, const QAction *checkedAction) const -{ - auto startAnimation = false; - const auto actionIsChecked = checkedAction->isChecked(); - if (!progressIndicator->isAnimated() && actionIsChecked) { - progressIndicator->startAnimation(); - startAnimation = true; - } else { - progressIndicator->stopAnimation(); - } - - button->setVisible(!startAnimation && actionIsChecked); - progressIndicator->setVisible(startAnimation && actionIsChecked); -} - -void ShareLinkWidget::setLinkShare(QSharedPointer linkShare) -{ - _linkShare = linkShare; -} - -QSharedPointer ShareLinkWidget::getLinkShare() -{ - return _linkShare; -} - -void ShareLinkWidget::focusPasswordLineEdit() -{ - _ui->lineEdit_password->setFocus(); -} - -void ShareLinkWidget::setupUiOptions() -{ - connect(_linkShare.data(), &LinkShare::noteSet, this, &ShareLinkWidget::slotNoteSet); - connect(_linkShare.data(), &LinkShare::passwordSet, this, &ShareLinkWidget::slotPasswordSet); - connect(_linkShare.data(), &LinkShare::passwordSetError, this, &ShareLinkWidget::slotPasswordSetError); - connect(_linkShare.data(), &LinkShare::labelSet, this, &ShareLinkWidget::slotLabelSet); - - // Prepare permissions check and create group action - const QDate expireDate = _linkShare.data()->getExpireDate().isValid() ? _linkShare.data()->getExpireDate() : QDate(); - const SharePermissions perm = _linkShare.data()->getPermissions(); - auto checked = false; - auto *permissionsGroup = new QActionGroup(this); - - // Prepare sharing menu - _linkContextMenu = new QMenu(this); - - // radio button style - permissionsGroup->setExclusive(true); - - if (_isFile) { - checked = (perm & SharePermissionRead) && (perm & SharePermissionUpdate); - _allowEditingLinkAction = _linkContextMenu->addAction(tr("Allow editing")); - _allowEditingLinkAction->setCheckable(true); - _allowEditingLinkAction->setChecked(checked); - - } else { - checked = (perm == SharePermissionRead); - _readOnlyLinkAction = permissionsGroup->addAction(tr("View only")); - _readOnlyLinkAction->setCheckable(true); - _readOnlyLinkAction->setChecked(checked); - - checked = (perm & SharePermissionRead) && (perm & SharePermissionCreate) - && (perm & SharePermissionUpdate) && (perm & SharePermissionDelete); - _allowUploadEditingLinkAction = permissionsGroup->addAction(tr("Allow upload and editing")); - _allowUploadEditingLinkAction->setCheckable(true); - _allowUploadEditingLinkAction->setChecked(checked); - - checked = (perm == SharePermissionCreate); - _allowUploadLinkAction = permissionsGroup->addAction(tr("File drop (upload only)")); - _allowUploadLinkAction->setCheckable(true); - _allowUploadLinkAction->setChecked(checked); - } - - _shareLinkElidedLabel = new OCC::ElidedLabel(this); - _shareLinkElidedLabel->setElideMode(Qt::ElideRight); - displayShareLinkLabel(); - _ui->horizontalLayout->insertWidget(2, _shareLinkElidedLabel); - - _shareLinkLayout = new QHBoxLayout(this); - - _shareLinkLabel = new QLabel(this); - _shareLinkLabel->setPixmap(QString(":/client/theme/black/edit.svg")); - _shareLinkLayout->addWidget(_shareLinkLabel); - - _shareLinkEdit = new QLineEdit(this); - connect(_shareLinkEdit, &QLineEdit::returnPressed, this, &ShareLinkWidget::slotCreateLabel); - _shareLinkEdit->setPlaceholderText(tr("Link name")); - _shareLinkEdit->setText(_linkShare.data()->getLabel()); - _shareLinkLayout->addWidget(_shareLinkEdit); - - _shareLinkButton = new QToolButton(this); - connect(_shareLinkButton, &QToolButton::clicked, this, &ShareLinkWidget::slotCreateLabel); - _shareLinkButton->setIcon(QIcon(":/client/theme/confirm.svg")); - _shareLinkButton->setToolButtonStyle(Qt::ToolButtonIconOnly); - _shareLinkLayout->addWidget(_shareLinkButton); - - _shareLinkProgressIndicator = new QProgressIndicator(this); - _shareLinkProgressIndicator->setVisible(false); - _shareLinkLayout->addWidget(_shareLinkProgressIndicator); - - _shareLinkDefaultWidget = new QWidget(this); - _shareLinkDefaultWidget->setLayout(_shareLinkLayout); - - _shareLinkWidgetAction = new QWidgetAction(this); - _shareLinkWidgetAction->setDefaultWidget(_shareLinkDefaultWidget); - _shareLinkWidgetAction->setCheckable(true); - _linkContextMenu->addAction(_shareLinkWidgetAction); - - // Adds permissions actions (radio button style) - if (_isFile) { - _linkContextMenu->addAction(_allowEditingLinkAction); - } else { - _linkContextMenu->addAction(_readOnlyLinkAction); - _linkContextMenu->addAction(_allowUploadEditingLinkAction); - _linkContextMenu->addAction(_allowUploadLinkAction); - } - - // Adds action to display note widget (check box) - _noteLinkAction = _linkContextMenu->addAction(tr("Note to recipient")); - _noteLinkAction->setCheckable(true); - - if (_linkShare->getNote().isSimpleText() && !_linkShare->getNote().isEmpty()) { - _ui->textEdit_note->setText(_linkShare->getNote()); - _noteLinkAction->setChecked(true); - toggleNoteOptions(); - } - - // Adds action to display password widget (check box) - _passwordProtectLinkAction = _linkContextMenu->addAction(tr("Password protect")); - _passwordProtectLinkAction->setCheckable(true); - - if (_linkShare.data()->isPasswordSet()) { - _passwordProtectLinkAction->setChecked(true); - _ui->lineEdit_password->setPlaceholderText(QString::fromUtf8(passwordIsSetPlaceholder)); - togglePasswordOptions(); - } - - // If password is enforced then don't allow users to disable it - if (_account->capabilities().sharePublicLinkEnforcePassword()) { - if (_linkShare.data()->isPasswordSet()) { - _passwordProtectLinkAction->setChecked(true); - _passwordProtectLinkAction->setEnabled(false); - } - _passwordRequired = true; - } - - // Adds action to display expiration date widget (check box) - _expirationDateLinkAction = _linkContextMenu->addAction(tr("Set expiration date")); - _expirationDateLinkAction->setCheckable(true); - if (!expireDate.isNull()) { - _ui->calendar->setDate(expireDate); - _expirationDateLinkAction->setChecked(true); - toggleExpireDateOptions(); - } - connect(_ui->calendar, &QDateTimeEdit::dateChanged, this, &ShareLinkWidget::slotSetExpireDate); - connect(_linkShare.data(), &LinkShare::expireDateSet, this, &ShareLinkWidget::slotExpireDateSet); - - - // If expiredate is enforced do not allow disable and set max days - if (_account->capabilities().sharePublicLinkEnforceExpireDate()) { - _ui->calendar->setMaximumDate(QDate::currentDate().addDays( - _account->capabilities().sharePublicLinkExpireDateDays())); - _expirationDateLinkAction->setChecked(true); - _expirationDateLinkAction->setEnabled(false); - _expiryRequired = true; - } - - // Adds action to unshare widget (check box) - _unshareLinkAction.reset(_linkContextMenu->addAction(QIcon(":/client/theme/delete.svg"), - tr("Delete link"))); - - _linkContextMenu->addSeparator(); - - _addAnotherLinkAction.reset(_linkContextMenu->addAction(QIcon(":/client/theme/add.svg"), - tr("Add another link"))); - - _ui->enableShareLink->setIcon(QIcon(":/client/theme/copy.svg")); - disconnect(_ui->enableShareLink, &QPushButton::clicked, this, &ShareLinkWidget::slotCreateShareLink); - connect(_ui->enableShareLink, &QPushButton::clicked, this, &ShareLinkWidget::slotCopyLinkShare); - - connect(_linkContextMenu, &QMenu::triggered, - this, &ShareLinkWidget::slotLinkContextMenuActionTriggered); - - _ui->shareLinkToolButton->setMenu(_linkContextMenu); - _ui->shareLinkToolButton->setEnabled(true); - _ui->enableShareLink->setEnabled(true); - _ui->enableShareLink->setChecked(true); - - // show sharing options - _ui->shareLinkToolButton->show(); - - customizeStyle(); -} - -void ShareLinkWidget::slotCreateNote() -{ - const auto note = _ui->textEdit_note->toPlainText(); - if (!_linkShare || _linkShare->getNote() == note || note.isEmpty()) { - return; - } - - toggleButtonAnimation(_ui->confirmNote, _ui->noteProgressIndicator, _noteLinkAction); - _ui->errorLabel->hide(); - _linkShare->setNote(note); -} - -void ShareLinkWidget::slotNoteSet() -{ - toggleButtonAnimation(_ui->confirmNote, _ui->noteProgressIndicator, _noteLinkAction); -} - -void ShareLinkWidget::slotCopyLinkShare(const bool clicked) const -{ - Q_UNUSED(clicked); - - QApplication::clipboard()->setText(_linkShare->getLink().toString()); -} - -void ShareLinkWidget::slotExpireDateSet() -{ - toggleButtonAnimation(_ui->confirmExpirationDate, _ui->expirationDateProgressIndicator, _expirationDateLinkAction); -} - -void ShareLinkWidget::slotSetExpireDate() -{ - if (!_linkShare) { - return; - } - - toggleButtonAnimation(_ui->confirmExpirationDate, _ui->expirationDateProgressIndicator, _expirationDateLinkAction); - _ui->errorLabel->hide(); - _linkShare->setExpireDate(_ui->calendar->date()); -} - -void ShareLinkWidget::slotCreatePassword() -{ - if (!_linkShare || _ui->lineEdit_password->text().isEmpty()) { - return; - } - - toggleButtonAnimation(_ui->confirmPassword, _ui->passwordProgressIndicator, _passwordProtectLinkAction); - _ui->errorLabel->hide(); - emit createPassword(_ui->lineEdit_password->text()); -} - -void ShareLinkWidget::slotCreateShareLink(const bool clicked) -{ - Q_UNUSED(clicked); - slotToggleShareLinkAnimation(true); - emit createLinkShare(); -} - -void ShareLinkWidget::slotPasswordSet() -{ - toggleButtonAnimation(_ui->confirmPassword, _ui->passwordProgressIndicator, _passwordProtectLinkAction); - - _ui->lineEdit_password->setText({}); - - if (_linkShare->isPasswordSet()) { - _ui->lineEdit_password->setEnabled(true); - _ui->lineEdit_password->setPlaceholderText(QString::fromUtf8(passwordIsSetPlaceholder)); - } else { - _ui->lineEdit_password->setPlaceholderText({}); - } - - emit createPasswordProcessed(); -} - -void ShareLinkWidget::slotPasswordSetError(const int code, const QString &message) -{ - toggleButtonAnimation(_ui->confirmPassword, _ui->passwordProgressIndicator, _passwordProtectLinkAction); - - slotServerError(code, message); - togglePasswordOptions(); - _ui->lineEdit_password->setFocus(); - emit createPasswordProcessed(); -} - -void ShareLinkWidget::slotDeleteShareFetched() -{ - slotToggleShareLinkAnimation(false); - - _linkShare.clear(); - togglePasswordOptions(false); - toggleNoteOptions(false); - toggleExpireDateOptions(false); - emit deleteLinkShare(); -} - -void ShareLinkWidget::toggleNoteOptions(const bool enable) -{ - _ui->noteLabel->setVisible(enable); - _ui->textEdit_note->setVisible(enable); - _ui->confirmNote->setVisible(enable); - _ui->textEdit_note->setText(enable && _linkShare ? _linkShare->getNote() : QString()); - - if (!enable && _linkShare && !_linkShare->getNote().isEmpty()) { - _linkShare->setNote({}); - } -} - -void ShareLinkWidget::slotCreateLabel() -{ - const auto labelText = _shareLinkEdit->text(); - if (!_linkShare || _linkShare->getLabel() == labelText || labelText.isEmpty()) { - return; - } - _shareLinkWidgetAction->setChecked(true); - toggleButtonAnimation(_shareLinkButton, _shareLinkProgressIndicator, _shareLinkWidgetAction); - _ui->errorLabel->hide(); - _linkShare->setLabel(_shareLinkEdit->text()); -} - -void ShareLinkWidget::slotLabelSet() -{ - toggleButtonAnimation(_shareLinkButton, _shareLinkProgressIndicator, _shareLinkWidgetAction); - displayShareLinkLabel(); -} - -void ShareLinkWidget::slotCreateShareRequiresPassword(const QString &message) -{ - slotToggleShareLinkAnimation(message.isEmpty()); - - if (!message.isEmpty()) { - _ui->errorLabel->setText(message); - _ui->errorLabel->show(); - } - - _passwordRequired = true; - - togglePasswordOptions(); -} - -void ShareLinkWidget::togglePasswordOptions(const bool enable) -{ - _ui->passwordLabel->setVisible(enable); - _ui->lineEdit_password->setVisible(enable); - _ui->confirmPassword->setVisible(enable); - _ui->lineEdit_password->setFocus(); - - if (!enable && _linkShare && _linkShare->isPasswordSet()) { - _linkShare->setPassword({}); - } -} - -void ShareLinkWidget::toggleExpireDateOptions(const bool enable) -{ - _ui->expirationLabel->setVisible(enable); - _ui->calendar->setVisible(enable); - _ui->confirmExpirationDate->setVisible(enable); - - const auto date = enable ? _linkShare->getExpireDate() : QDate::currentDate().addDays(1); - _ui->calendar->setDate(date); - _ui->calendar->setMinimumDate(QDate::currentDate().addDays(1)); - - if(_account->capabilities().sharePublicLinkEnforceExpireDate()) { - _ui->calendar->setMaximumDate(QDate::currentDate().addDays(_account->capabilities().sharePublicLinkExpireDateDays())); - } - - _ui->calendar->setFocus(); - - if (!enable && _linkShare && _linkShare->getExpireDate().isValid()) { - _linkShare->setExpireDate({}); - } -} - -void ShareLinkWidget::confirmAndDeleteShare() -{ - auto messageBox = new QMessageBox( - QMessageBox::Question, - tr("Confirm Link Share Deletion"), - tr("

Do you really want to delete the public link share %1?

" - "

Note: This action cannot be undone.

") - .arg(shareName()), - QMessageBox::NoButton, - this); - QPushButton *yesButton = - messageBox->addButton(tr("Delete"), QMessageBox::YesRole); - messageBox->addButton(tr("Cancel"), QMessageBox::NoRole); - - connect(messageBox, &QMessageBox::finished, this, - [messageBox, yesButton, this]() { - if (messageBox->clickedButton() == yesButton) { - this->slotToggleShareLinkAnimation(true); - this->_linkShare->deleteShare(); - } - }); - messageBox->open(); -} - -QString ShareLinkWidget::shareName() const -{ - QString name = _linkShare->getName(); - if (!name.isEmpty()) - return name; - if (!_namesSupported) - return tr("Public link"); - return _linkShare->getToken(); -} - -void ShareLinkWidget::slotContextMenuButtonClicked() -{ - _linkContextMenu->exec(QCursor::pos()); -} - -void ShareLinkWidget::slotLinkContextMenuActionTriggered(QAction *action) -{ - const auto state = action->isChecked(); - SharePermissions perm = SharePermissionRead; - - if (action == _addAnotherLinkAction.data()) { - emit createLinkShare(); - - } else if (action == _readOnlyLinkAction && state) { - _linkShare->setPermissions(perm); - - } else if (action == _allowEditingLinkAction && state) { - perm |= SharePermissionUpdate; - _linkShare->setPermissions(perm); - - } else if (action == _allowUploadEditingLinkAction && state) { - perm |= SharePermissionCreate | SharePermissionUpdate | SharePermissionDelete; - _linkShare->setPermissions(perm); - - } else if (action == _allowUploadLinkAction && state) { - perm = SharePermissionCreate; - _linkShare->setPermissions(perm); - - } else if (action == _passwordProtectLinkAction) { - togglePasswordOptions(state); - - } else if (action == _expirationDateLinkAction) { - toggleExpireDateOptions(state); - - } else if (action == _noteLinkAction) { - toggleNoteOptions(state); - - } else if (action == _unshareLinkAction.data()) { - confirmAndDeleteShare(); - } -} - -void ShareLinkWidget::slotServerError(const int code, const QString &message) -{ - slotToggleShareLinkAnimation(false); - - qCWarning(lcSharing) << "Error from server" << code << message; - displayError(message); -} - -void ShareLinkWidget::displayError(const QString &errMsg) -{ - _ui->errorLabel->setText(errMsg); - _ui->errorLabel->show(); -} - -void ShareLinkWidget::slotStyleChanged() -{ - customizeStyle(); -} - -void ShareLinkWidget::customizeStyle() -{ - if(_unshareLinkAction) { - _unshareLinkAction->setIcon(Theme::createColorAwareIcon(":/client/theme/delete.svg")); - } - - if(_addAnotherLinkAction) { - _addAnotherLinkAction->setIcon(Theme::createColorAwareIcon(":/client/theme/add.svg")); - } - - _ui->enableShareLink->setIcon(Theme::createColorAwareIcon(":/client/theme/copy.svg")); - - _ui->shareLinkIconLabel->setPixmap(Theme::createColorAwarePixmap(":/client/theme/public.svg")); - - _ui->shareLinkToolButton->setIcon(Theme::createColorAwareIcon(":/client/theme/more.svg")); - - _ui->confirmNote->setIcon(Theme::createColorAwareIcon(":/client/theme/confirm.svg")); - _ui->confirmPassword->setIcon(Theme::createColorAwareIcon(":/client/theme/confirm.svg")); - _ui->confirmExpirationDate->setIcon(Theme::createColorAwareIcon(":/client/theme/confirm.svg")); - - _ui->passwordProgressIndicator->setColor(QGuiApplication::palette().color(QPalette::Text)); -} - -void ShareLinkWidget::displayShareLinkLabel() -{ - _shareLinkElidedLabel->clear(); - if (!_linkShare->getLabel().isEmpty()) { - _shareLinkElidedLabel->setText(QString("(%1)").arg(_linkShare->getLabel())); - } -} - -} diff --git a/src/gui/sharelinkwidget.h b/src/gui/sharelinkwidget.h deleted file mode 100644 index 186b6fe2b..000000000 --- a/src/gui/sharelinkwidget.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) by Roeland Jago Douma - * Copyright (C) 2015 by Klaas Freitag - * - * 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 SHARELINKWIDGET_H -#define SHARELINKWIDGET_H - -#include "accountfwd.h" -#include "sharepermissions.h" -#include "QProgressIndicator.h" -#include -#include -#include -#include -#include -#include -#include -#include - -class QMenu; -class QTableWidgetItem; - -namespace OCC { - -namespace Ui { - class ShareLinkWidget; -} - -class AbstractCredentials; -class SyncResult; -class LinkShare; -class Share; -class ElidedLabel; - -/** - * @brief The ShareDialog class - * @ingroup gui - */ -class ShareLinkWidget : public QWidget -{ - Q_OBJECT - -public: - explicit ShareLinkWidget(AccountPtr account, - const QString &sharePath, - const QString &localPath, - SharePermissions maxSharingPermissions, - QWidget *parent = nullptr); - ~ShareLinkWidget() override; - - void toggleButton(bool show); - void setupUiOptions(); - - void setLinkShare(QSharedPointer linkShare); - QSharedPointer getLinkShare(); - - void focusPasswordLineEdit(); - -public slots: - void slotDeleteShareFetched(); - void slotToggleShareLinkAnimation(const bool start); - void slotServerError(const int code, const QString &message); - void slotCreateShareRequiresPassword(const QString &message); - void slotStyleChanged(); - -private slots: - void slotCreateShareLink(const bool clicked); - void slotCopyLinkShare(const bool clicked) const; - - void slotCreatePassword(); - void slotPasswordSet(); - void slotPasswordSetError(const int code, const QString &message); - - void slotCreateNote(); - void slotNoteSet(); - - void slotSetExpireDate(); - void slotExpireDateSet(); - - void slotContextMenuButtonClicked(); - void slotLinkContextMenuActionTriggered(QAction *action); - - void slotCreateLabel(); - void slotLabelSet(); - -signals: - void createLinkShare(); - void deleteLinkShare(); - void visualDeletionDone(); - void createPassword(const QString &password); - void createPasswordProcessed(); - -private: - void displayError(const QString &errMsg); - - void togglePasswordOptions(const bool enable = true); - void toggleNoteOptions(const bool enable = true); - void toggleExpireDateOptions(const bool enable = true); - void toggleButtonAnimation(QToolButton *button, QProgressIndicator *progressIndicator, const QAction *checkedAction) const; - - /** Confirm with the user and then delete the share */ - void confirmAndDeleteShare(); - - /** Retrieve a share's name, accounting for _namesSupported */ - QString shareName() const; - - void customizeStyle(); - - void displayShareLinkLabel(); - - Ui::ShareLinkWidget *_ui; - AccountPtr _account; - QString _sharePath; - QString _localPath; - QString _shareUrl; - - QSharedPointer _linkShare; - - bool _isFile; - bool _passwordRequired; - bool _expiryRequired; - bool _namesSupported; - bool _noteRequired; - - QMenu *_linkContextMenu; - QAction *_readOnlyLinkAction; - QAction *_allowEditingLinkAction; - QAction *_allowUploadEditingLinkAction; - QAction *_allowUploadLinkAction; - QAction *_passwordProtectLinkAction; - QAction *_expirationDateLinkAction; - QScopedPointer _unshareLinkAction; - QScopedPointer _addAnotherLinkAction; - QAction *_noteLinkAction; - QHBoxLayout *_shareLinkLayout{}; - QLabel *_shareLinkLabel{}; - ElidedLabel *_shareLinkElidedLabel{}; - QLineEdit *_shareLinkEdit{}; - QToolButton *_shareLinkButton{}; - QProgressIndicator *_shareLinkProgressIndicator{}; - QWidget *_shareLinkDefaultWidget{}; - QWidgetAction *_shareLinkWidgetAction{}; -}; -} - -#endif // SHARELINKWIDGET_H diff --git a/src/gui/sharelinkwidget.ui b/src/gui/sharelinkwidget.ui deleted file mode 100644 index a0d5f3df9..000000000 --- a/src/gui/sharelinkwidget.ui +++ /dev/null @@ -1,439 +0,0 @@ - - - OCC::ShareLinkWidget - - - - 0 - 0 - 400 - 238 - - - - - 0 - 0 - - - - - 0 - - - 12 - - - 0 - - - 20 - - - 0 - - - - - 6 - - - 0 - - - - - - - - :/client/theme/public.svg - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Share link - - - - - - - Qt::Horizontal - - - - 40 - 25 - - - - - - - - - 0 - 0 - - - - - 28 - 27 - - - - - - - - Qt::Horizontal - - - - 40 - 25 - - - - - - - - - - - - :/client/theme/add.svg:/client/theme/add.svg - - - false - - - true - - - - - - - false - - - - 0 - 0 - - - - - :/client/theme/more.svg:/client/theme/more.svg - - - QToolButton::InstantPopup - - - true - - - - - - - - - 22 - - - - - - 0 - 0 - - - - - 78 - 0 - - - - Note - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 0 - - - - - - - - 0 - 0 - - - - - 0 - 60 - - - - QAbstractScrollArea::AdjustToContents - - - - - - - - 28 - 27 - - - - - :/client/theme/confirm.svg:/client/theme/confirm.svg - - - true - - - - - - - - 0 - 0 - - - - - 28 - 27 - - - - - - - - - 0 - 0 - - - - - 78 - 0 - - - - Set password - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 0 - - - - - - - - 1 - 0 - - - - QLineEdit::Password - - - - - - - - 28 - 27 - - - - - :/client/theme/confirm.svg:/client/theme/confirm.svg - - - true - - - - - - - - 0 - 0 - - - - - 28 - 27 - - - - - - - - - 0 - 0 - - - - - 78 - 0 - - - - Expires - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 0 - - - - - - - - 1 - 0 - - - - - - - - - 28 - 27 - - - - - :/client/theme/confirm.svg:/client/theme/confirm.svg - - - true - - - - - - - - 0 - 0 - - - - - 28 - 27 - - - - - - - - - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 123 - 121 - 134 - - - - - - - - TextLabel - - - Qt::PlainText - - - true - - - - - - - - - - - QProgressIndicator - QWidget -
QProgressIndicator.h
- 1 -
-
- - - - -
diff --git a/src/gui/sharemanager.cpp b/src/gui/sharemanager.cpp index 154bcbec3..621ab6c47 100644 --- a/src/gui/sharemanager.cpp +++ b/src/gui/sharemanager.cpp @@ -58,7 +58,7 @@ Share::Share(AccountPtr account, const ShareType shareType, bool isPasswordSet, const Permissions permissions, - const QSharedPointer shareWith) + const ShareePtr shareWith) : _account(account) , _id(id) , _uidowner(uidowner) @@ -101,7 +101,7 @@ Share::ShareType Share::getShareType() const return _shareType; } -QSharedPointer Share::getShareWith() const +ShareePtr Share::getShareWith() const { return _shareWith; } @@ -316,7 +316,7 @@ UserGroupShare::UserGroupShare(AccountPtr account, const ShareType shareType, bool isPasswordSet, const Permissions permissions, - const QSharedPointer shareWith, + const ShareePtr shareWith, const QDate &expireDate, const QString ¬e) : Share(account, id, owner, ownerDisplayName, path, shareType, isPasswordSet, permissions, shareWith) @@ -461,7 +461,7 @@ void ShareManager::slotShareCreated(const QJsonDocument &reply) { //Parse share auto data = reply.object().value("ocs").toObject().value("data").toObject(); - QSharedPointer share(parseShare(data)); + SharePtr share(parseShare(data)); emit shareCreated(share); @@ -478,18 +478,19 @@ void ShareManager::fetchShares(const QString &path) void ShareManager::slotSharesFetched(const QJsonDocument &reply) { + qDebug() << reply; auto tmpShares = reply.object().value("ocs").toObject().value("data").toArray(); const QString versionString = _account->serverVersion(); qCDebug(lcSharing) << versionString << "Fetched" << tmpShares.count() << "shares"; - QList> shares; + QList shares; foreach (const auto &share, tmpShares) { auto data = share.toObject(); auto shareType = data.value("share_type").toInt(); - QSharedPointer newShare; + SharePtr newShare; if (shareType == Share::TypeLink) { newShare = parseLinkShare(data); @@ -499,7 +500,7 @@ void ShareManager::slotSharesFetched(const QJsonDocument &reply) newShare = parseShare(data); } - shares.append(QSharedPointer(newShare)); + shares.append(SharePtr(newShare)); } qCDebug(lcSharing) << "Sending " << shares.count() << "shares"; @@ -508,7 +509,7 @@ void ShareManager::slotSharesFetched(const QJsonDocument &reply) QSharedPointer ShareManager::parseUserGroupShare(const QJsonObject &data) { - QSharedPointer sharee(new Sharee(data.value("share_with").toString(), + ShareePtr sharee(new Sharee(data.value("share_with").toString(), data.value("share_with_displayname").toString(), static_cast(data.value("share_type").toInt()))); @@ -577,13 +578,13 @@ QSharedPointer ShareManager::parseLinkShare(const QJsonObject &data) data.value("label").toString())); } -QSharedPointer ShareManager::parseShare(const QJsonObject &data) +SharePtr ShareManager::parseShare(const QJsonObject &data) const { - QSharedPointer sharee(new Sharee(data.value("share_with").toString(), + ShareePtr sharee(new Sharee(data.value("share_with").toString(), data.value("share_with_displayname").toString(), (Sharee::Type)data.value("share_type").toInt())); - return QSharedPointer(new Share(_account, + return SharePtr(new Share(_account, data.value("id").toVariant().toString(), // "id" used to be an integer, support both data.value("uid_owner").toVariant().toString(), data.value("displayname_owner").toVariant().toString(), diff --git a/src/gui/sharemanager.h b/src/gui/sharemanager.h index a69ec449d..e03628936 100644 --- a/src/gui/sharemanager.h +++ b/src/gui/sharemanager.h @@ -36,6 +36,15 @@ class OcsShareJob; class Share : public QObject { Q_OBJECT + Q_PROPERTY(AccountPtr account READ account CONSTANT) + Q_PROPERTY(QString path READ path CONSTANT) + Q_PROPERTY(QString id READ getId CONSTANT) + Q_PROPERTY(QString uidOwner READ getUidOwner CONSTANT) + Q_PROPERTY(QString ownerDisplayName READ getOwnerDisplayName CONSTANT) + Q_PROPERTY(ShareType shareType READ getShareType CONSTANT) + Q_PROPERTY(ShareePtr shareWith READ getShareWith CONSTANT) + Q_PROPERTY(Permissions permissions READ getPermissions WRITE setPermissions NOTIFY permissionsSet) + Q_PROPERTY(bool isPasswordSet READ isPasswordSet NOTIFY passwordSet) public: /** @@ -43,14 +52,17 @@ public: * Need to be in sync with Sharee::Type */ enum ShareType { + TypeInternalLink = -2, + TypePlaceholderLink = -1, TypeUser = Sharee::User, TypeGroup = Sharee::Group, TypeLink = 3, TypeEmail = Sharee::Email, TypeRemote = Sharee::Federated, TypeCircle = Sharee::Circle, - TypeRoom = Sharee::Room + TypeRoom = Sharee::Room, }; + Q_ENUM(ShareType); using Permissions = SharePermissions; @@ -65,63 +77,63 @@ public: const ShareType shareType, bool isPasswordSet = false, const Permissions permissions = SharePermissionDefault, - const QSharedPointer shareWith = QSharedPointer(nullptr)); + const ShareePtr shareWith = ShareePtr(nullptr)); /** * The account the share is defined on. */ - AccountPtr account() const; + [[nodiscard]] AccountPtr account() const; - QString path() const; + [[nodiscard]] QString path() const; /* * Get the id */ - QString getId() const; + [[nodiscard]] QString getId() const; /* * Get the uid_owner */ - QString getUidOwner() const; + [[nodiscard]] QString getUidOwner() const; /* * Get the owner display name */ - QString getOwnerDisplayName() const; + [[nodiscard]] QString getOwnerDisplayName() const; /* * Get the shareType */ - ShareType getShareType() const; + [[nodiscard]] ShareType getShareType() const; /* * Get the shareWith */ - QSharedPointer getShareWith() const; + [[nodiscard]] ShareePtr getShareWith() const; /* * Get permissions */ - Permissions getPermissions() const; + [[nodiscard]] Permissions getPermissions() const; /* - * Set the permissions of a share - * - * On success the permissionsSet signal is emitted - * In case of a server error the serverError signal is emitted. + * Get whether the share has a password set */ - void setPermissions(Permissions permissions); + [[nodiscard]] Q_REQUIRED_RESULT bool isPasswordSet() const; - /* - * Set the password for remote share - * - * On success the passwordSet signal is emitted - * In case of a server error the passwordSetError signal is emitted. + /* + * Is it a share with a user or group (local or remote) */ - void setPassword(const QString &password); + [[nodiscard]] static bool isShareTypeUserGroupEmailRoomOrRemote(const ShareType type); - bool isPasswordSet() const; +signals: + void permissionsSet(); + void shareDeleted(); + void serverError(int code, const QString &message); + void passwordSet(); + void passwordSetError(int statusCode, const QString &message); +public slots: /* * Deletes a share * @@ -130,17 +142,21 @@ public: */ void deleteShare(); - /* - * Is it a share with a user or group (local or remote) + /* + * Set the permissions of a share + * + * On success the permissionsSet signal is emitted + * In case of a server error the serverError signal is emitted. */ - static bool isShareTypeUserGroupEmailRoomOrRemote(const ShareType type); + void setPermissions(OCC::Share::Permissions permissions); -signals: - void permissionsSet(); - void shareDeleted(); - void serverError(int code, const QString &message); - void passwordSet(); - void passwordSetError(int statusCode, const QString &message); + /* + * Set the password for remote share + * + * On success the passwordSet signal is emitted + * In case of a server error the passwordSetError signal is emitted. + */ + void setPassword(const QString &password); protected: AccountPtr _account; @@ -151,7 +167,7 @@ protected: ShareType _shareType; bool _isPasswordSet; Permissions _permissions; - QSharedPointer _shareWith; + ShareePtr _shareWith; protected slots: void slotOcsError(int statusCode, const QString &message); @@ -163,6 +179,8 @@ private slots: void slotPermissionsSet(const QJsonDocument &, const QVariant &value); }; +using SharePtr = QSharedPointer; + /** * A Link share is just like a regular share but then slightly different. * There are several methods in the API that either work differently for @@ -171,6 +189,16 @@ private slots: class LinkShare : public Share { Q_OBJECT + Q_PROPERTY(QUrl link READ getLink CONSTANT) + Q_PROPERTY(QUrl directDownloadLink READ getDirectDownloadLink CONSTANT) + Q_PROPERTY(bool publicCanUpload READ getPublicUpload CONSTANT) + Q_PROPERTY(bool publicCanReadDirectory READ getShowFileListing CONSTANT) + Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameSet) + Q_PROPERTY(QString note READ getNote WRITE setNote NOTIFY noteSet) + Q_PROPERTY(QString label READ getLabel WRITE setLabel NOTIFY labelSet) + Q_PROPERTY(QDate expireDate READ getExpireDate WRITE setExpireDate NOTIFY expireDateSet) + Q_PROPERTY(QString token READ getToken CONSTANT) + public: explicit LinkShare(AccountPtr account, const QString &id, @@ -189,38 +217,55 @@ public: /* * Get the share link */ - QUrl getLink() const; + [[nodiscard]] QUrl getLink() const; /* * The share's link for direct downloading. */ - QUrl getDirectDownloadLink() const; + [[nodiscard]] QUrl getDirectDownloadLink() const; /* * Get the publicUpload status of this share */ - bool getPublicUpload() const; + [[nodiscard]] bool getPublicUpload() const; /* * Whether directory listings are available (READ permission) */ - bool getShowFileListing() const; + [[nodiscard]] bool getShowFileListing() const; /* * Returns the name of the link share. Can be empty. */ - QString getName() const; + [[nodiscard]] QString getName() const; /* * Returns the note of the link share. */ - QString getNote() const; + [[nodiscard]] QString getNote() const; /* * Returns the label of the link share. */ - QString getLabel() const; + [[nodiscard]] QString getLabel() const; + /* + * Returns the token of the link share. + */ + [[nodiscard]] QString getToken() const; + + /* + * Get the expiration date + */ + [[nodiscard]] QDate getExpireDate() const; + + /* + * Create OcsShareJob and connect to signal/slots + */ + template + OcsShareJob *createShareJob(const LinkShareSlot slotFunction); + +public slots: /* * Set the name of the link share. * @@ -233,16 +278,6 @@ public: */ void setNote(const QString ¬e); - /* - * Returns the token of the link share. - */ - QString getToken() const; - - /* - * Get the expiration date - */ - QDate getExpireDate() const; - /* * Set the expiration date * @@ -250,19 +285,12 @@ public: * In case of a server error the serverError signal is emitted. */ void setExpireDate(const QDate &expireDate); - + /* * Set the label of the share link. */ void setLabel(const QString &label); - /* - * Create OcsShareJob and connect to signal/slots - */ - template - OcsShareJob *createShareJob(const LinkShareSlot slotFunction); - - signals: void expireDateSet(); void noteSet(); @@ -287,6 +315,8 @@ private: class UserGroupShare : public Share { Q_OBJECT + Q_PROPERTY(QString note READ getNote WRITE setNote NOTIFY noteSet) + Q_PROPERTY(QDate expireDate READ getExpireDate WRITE setExpireDate NOTIFY expireDateSet) public: UserGroupShare(AccountPtr account, const QString &id, @@ -296,27 +326,26 @@ public: const ShareType shareType, bool isPasswordSet, const Permissions permissions, - const QSharedPointer shareWith, + const ShareePtr shareWith, const QDate &expireDate, const QString ¬e); - void setNote(const QString ¬e); - - QString getNote() const; - - void slotNoteSet(const QJsonDocument &, const QVariant ¬e); + [[nodiscard]] QString getNote() const; + [[nodiscard]] QDate getExpireDate() const; +public slots: + void setNote(const QString ¬e); void setExpireDate(const QDate &date); - QDate getExpireDate() const; - - void slotExpireDateSet(const QJsonDocument &reply, const QVariant &value); - signals: void noteSet(); void noteSetError(); void expireDateSet(); +private slots: + void slotNoteSet(const QJsonDocument &json, const QVariant ¬e); + void slotExpireDateSet(const QJsonDocument &reply, const QVariant &value); + private: QString _note; QDate _expireDate; @@ -375,9 +404,9 @@ public: void fetchShares(const QString &path); signals: - void shareCreated(const QSharedPointer &share); - void linkShareCreated(const QSharedPointer &share); - void sharesFetched(const QList> &shares); + void shareCreated(const OCC::SharePtr &share); + void linkShareCreated(const QSharedPointer &share); + void sharesFetched(const QList &shares); void serverError(int code, const QString &message); /** Emitted when creating a link share with password fails. @@ -396,10 +425,12 @@ private slots: private: QSharedPointer parseLinkShare(const QJsonObject &data); QSharedPointer parseUserGroupShare(const QJsonObject &data); - QSharedPointer parseShare(const QJsonObject &data); + SharePtr parseShare(const QJsonObject &data) const; AccountPtr _account; }; } +Q_DECLARE_METATYPE(OCC::SharePtr) + #endif // SHAREMANAGER_H diff --git a/src/gui/sharepermissions.h b/src/gui/sharepermissions.h index 92ce95766..28028e9dd 100644 --- a/src/gui/sharepermissions.h +++ b/src/gui/sharepermissions.h @@ -35,4 +35,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(SharePermissions) } // namespace OCC +Q_DECLARE_METATYPE(OCC::SharePermission) + #endif diff --git a/src/gui/shareusergroupwidget.cpp b/src/gui/shareusergroupwidget.cpp deleted file mode 100644 index 024e1266e..000000000 --- a/src/gui/shareusergroupwidget.cpp +++ /dev/null @@ -1,1129 +0,0 @@ -/* - * Copyright (C) by Roeland Jago Douma - * - * 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 "ocsprofileconnector.h" -#include "sharee.h" -#include "tray/usermodel.h" -#include "ui_shareusergroupwidget.h" -#include "ui_shareuserline.h" -#include "shareusergroupwidget.h" -#include "account.h" -#include "folderman.h" -#include "folder.h" -#include "accountmanager.h" -#include "theme.h" -#include "configfile.h" -#include "capabilities.h" -#include "guiutility.h" -#include "thumbnailjob.h" -#include "sharemanager.h" -#include "theme.h" -#include "iconutils.h" - -#include "QProgressIndicator.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace { -const char *passwordIsSetPlaceholder = "●●●●●●●●"; - -} - -namespace OCC { - -AvatarEventFilter::AvatarEventFilter(QObject *parent) - : QObject(parent) -{ -} - - -bool AvatarEventFilter::eventFilter(QObject *obj, QEvent *event) -{ - if (event->type() == QEvent::ContextMenu) { - const auto contextMenuEvent = dynamic_cast(event); - if (!contextMenuEvent) { - return false; - } - emit contextMenu(contextMenuEvent->globalPos()); - return true; - } - return QObject::eventFilter(obj, event); -} - -ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account, - const QString &sharePath, - const QString &localPath, - SharePermissions maxSharingPermissions, - const QString &privateLinkUrl, - QWidget *parent) - : QWidget(parent) - , _ui(new Ui::ShareUserGroupWidget) - , _account(account) - , _sharePath(sharePath) - , _localPath(localPath) - , _maxSharingPermissions(maxSharingPermissions) - , _privateLinkUrl(privateLinkUrl) - , _disableCompleterActivated(false) -{ - setAttribute(Qt::WA_DeleteOnClose); - setObjectName("SharingDialogUG"); // required as group for saveGeometry call - - _ui->setupUi(this); - - //Is this a file or folder? - _isFile = QFileInfo(localPath).isFile(); - - _completer = new QCompleter(this); - _completerModel = new ShareeModel(_account, - _isFile ? QLatin1String("file") : QLatin1String("folder"), - _completer); - connect(_completerModel, &ShareeModel::shareesReady, this, &ShareUserGroupWidget::slotShareesReady); - connect(_completerModel, &ShareeModel::displayErrorMessage, this, &ShareUserGroupWidget::displayError); - - _completer->setModel(_completerModel); - _completer->setCaseSensitivity(Qt::CaseInsensitive); - _completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); - _ui->shareeLineEdit->setCompleter(_completer); - - _searchGloballyAction.reset(new QAction(_ui->shareeLineEdit)); - _searchGloballyAction->setIcon(Theme::createColorAwareIcon(":/client/theme/magnifying-glass.svg")); - _searchGloballyAction->setToolTip(tr("Search globally")); - - connect(_searchGloballyAction.data(), &QAction::triggered, this, [this]() { - searchForSharees(ShareeModel::GlobalSearch); - }); - - _ui->shareeLineEdit->addAction(_searchGloballyAction.data(), QLineEdit::LeadingPosition); - - _manager = new ShareManager(_account, this); - connect(_manager, &ShareManager::sharesFetched, this, &ShareUserGroupWidget::slotSharesFetched); - connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::slotShareCreated); - connect(_manager, &ShareManager::serverError, this, &ShareUserGroupWidget::displayError); - connect(_ui->shareeLineEdit, &QLineEdit::returnPressed, this, &ShareUserGroupWidget::slotLineEditReturn); - connect(_ui->confirmShare, &QAbstractButton::clicked, this, &ShareUserGroupWidget::slotLineEditReturn); - //TODO connect(_ui->privateLinkText, &QLabel::linkActivated, this, &ShareUserGroupWidget::slotPrivateLinkShare); - - // By making the next two QueuedConnections we can override - // the strings the completer sets on the line edit. - connect(_completer, SIGNAL(activated(QModelIndex)), SLOT(slotCompleterActivated(QModelIndex)), - Qt::QueuedConnection); - connect(_completer, SIGNAL(highlighted(QModelIndex)), SLOT(slotCompleterHighlighted(QModelIndex)), - Qt::QueuedConnection); - - // Queued connection so this signal is recieved after textChanged - connect(_ui->shareeLineEdit, &QLineEdit::textEdited, - this, &ShareUserGroupWidget::slotLineEditTextEdited, Qt::QueuedConnection); - _ui->shareeLineEdit->installEventFilter(this); - connect(&_completionTimer, &QTimer::timeout, this, [this]() { - searchForSharees(ShareeModel::LocalSearch); - }); - _completionTimer.setSingleShot(true); - _completionTimer.setInterval(600); - - _ui->errorLabel->hide(); - - _parentScrollArea = parentWidget()->findChild("scrollArea"); - _shareUserGroup = new QVBoxLayout(_parentScrollArea); - _shareUserGroup->setContentsMargins(0, 0, 0, 0); - customizeStyle(); -} - -QVBoxLayout *ShareUserGroupWidget::shareUserGroupLayout() -{ - return _shareUserGroup; -} - -ShareUserGroupWidget::~ShareUserGroupWidget() -{ - delete _ui; -} - -void ShareUserGroupWidget::on_shareeLineEdit_textChanged(const QString &) -{ - _completionTimer.stop(); - emit togglePublicLinkShare(false); -} - -void ShareUserGroupWidget::slotLineEditTextEdited(const QString &text) -{ - _disableCompleterActivated = false; - // First textChanged is called first and we stopped the timer when the text is changed, programatically or not - // Then we restart the timer here if the user touched a key - if (!text.isEmpty()) { - _completionTimer.start(); - emit togglePublicLinkShare(true); - } -} - -void ShareUserGroupWidget::slotLineEditReturn() -{ - _disableCompleterActivated = false; - // did the user type in one of the options? - const auto text = _ui->shareeLineEdit->text(); - for (int i = 0; i < _completerModel->rowCount(); ++i) { - const auto sharee = _completerModel->getSharee(i); - if (sharee->format() == text - || sharee->displayName() == text - || sharee->shareWith() == text) { - slotCompleterActivated(_completerModel->index(i)); - // make sure we do not send the same item twice (because return is called when we press - // return to activate an item inthe completer) - _disableCompleterActivated = true; - return; - } - } - - // nothing found? try to refresh completion - _completionTimer.start(); -} - -void ShareUserGroupWidget::searchForSharees(ShareeModel::LookupMode lookupMode) -{ - if (_ui->shareeLineEdit->text().isEmpty()) { - return; - } - - _ui->shareeLineEdit->setEnabled(false); - _completionTimer.stop(); - _pi_sharee.startAnimation(); - ShareeModel::ShareeSet blacklist; - - // Add the current user to _sharees since we can't share with ourself - QSharedPointer currentUser(new Sharee(_account->credentials()->user(), "", Sharee::Type::User)); - blacklist << currentUser; - - foreach (auto sw, _parentScrollArea->findChildren()) { - blacklist << sw->share()->getShareWith(); - } - _ui->errorLabel->hide(); - _completerModel->fetch(_ui->shareeLineEdit->text(), blacklist, lookupMode); -} - -void ShareUserGroupWidget::getShares() -{ - _manager->fetchShares(_sharePath); -} - -void ShareUserGroupWidget::slotShareCreated(const QSharedPointer &share) -{ - if (share && _account->capabilities().shareEmailPasswordEnabled() && !_account->capabilities().shareEmailPasswordEnforced()) { - // remember this share Id so we can set it's password Line Edit to focus later - _lastCreatedShareId = share->getId(); - } - // fetch all shares including the one we've just created - getShares(); -} - -void ShareUserGroupWidget::slotSharesFetched(const QList> &shares) -{ - int x = 0; - QList linkOwners({}); - - ShareUserLine *justCreatedShareThatNeedsPassword = nullptr; - - while (QLayoutItem *shareUserLine = _shareUserGroup->takeAt(0)) { - delete shareUserLine->widget(); - delete shareUserLine; - } - - foreach (const auto &share, shares) { - // We don't handle link shares, only TypeUser or TypeGroup - if (share->getShareType() == Share::TypeLink) { - if(!share->getUidOwner().isEmpty() && - share->getUidOwner() != share->account()->davUser()){ - linkOwners.append(share->getOwnerDisplayName()); - } - continue; - } - - // the owner of the file that shared it first - // leave out if it's the current user - if(x == 0 && !share->getUidOwner().isEmpty() && !(share->getUidOwner() == _account->credentials()->user())) { - _ui->mainOwnerLabel->setText(QString("Shared with you by ").append(share->getOwnerDisplayName())); - } - - - Q_ASSERT(Share::isShareTypeUserGroupEmailRoomOrRemote(share->getShareType())); - auto userGroupShare = qSharedPointerDynamicCast(share); - auto *s = new ShareUserLine(_account, userGroupShare, _maxSharingPermissions, _isFile, _parentScrollArea); - connect(s, &ShareUserLine::visualDeletionDone, this, &ShareUserGroupWidget::getShares); - s->setBackgroundRole(_shareUserGroup->count() % 2 == 0 ? QPalette::Base : QPalette::AlternateBase); - - // Connect styleChanged events to our widget, so it can adapt (Dark-/Light-Mode switching) - connect(this, &ShareUserGroupWidget::styleChanged, s, &ShareUserLine::slotStyleChanged); - _shareUserGroup->addWidget(s); - - if (!_lastCreatedShareId.isEmpty() && share->getId() == _lastCreatedShareId) { - _lastCreatedShareId = QString(); - if (_account->capabilities().shareEmailPasswordEnabled() && !_account->capabilities().shareEmailPasswordEnforced()) { - justCreatedShareThatNeedsPassword = s; - } - } - - x++; - } - - foreach (const QString &owner, linkOwners) { - auto ownerLabel = new QLabel(QString(owner + " shared via link")); - _shareUserGroup->addWidget(ownerLabel); - ownerLabel->setVisible(true); - } - - _disableCompleterActivated = false; - activateShareeLineEdit(); - - if (justCreatedShareThatNeedsPassword) { - // always set focus to a password Line Edit when the new email share is created on a server with optional passwords enabled for email shares - justCreatedShareThatNeedsPassword->focusPasswordLineEdit(); - } -} - -void ShareUserGroupWidget::slotPrivateLinkShare() -{ - auto menu = new QMenu(this); - menu->setAttribute(Qt::WA_DeleteOnClose); - - // this icon is not handled by slotStyleChanged() -> customizeStyle but we can live with that - menu->addAction(Theme::createColorAwareIcon(":/client/theme/copy.svg"), - tr("Copy link"), - this, SLOT(slotPrivateLinkCopy())); - - menu->exec(QCursor::pos()); -} - -void ShareUserGroupWidget::slotShareesReady() -{ - activateShareeLineEdit(); - - _pi_sharee.stopAnimation(); - if (_completerModel->rowCount() == 0) { - displayError(0, tr("No results for \"%1\"").arg(_completerModel->currentSearch())); - } - - // if no rows are present in the model - complete() will hide the completer - _completer->complete(); -} - -void ShareUserGroupWidget::slotCompleterActivated(const QModelIndex &index) -{ - if (_disableCompleterActivated) - return; - // The index is an index from the QCompletion model which is itelf a proxy - // model proxying the _completerModel - auto sharee = qvariant_cast>(index.data(Qt::UserRole)); - if (sharee.isNull()) { - return; - } - - /* - * Don't send the reshare permissions for federated shares for servers <9.1 - * https://github.com/owncloud/core/issues/22122#issuecomment-185637344 - * https://github.com/owncloud/client/issues/4996 - */ - _lastCreatedShareId = QString(); - - QString password; - if (sharee->type() == Sharee::Email && _account->capabilities().shareEmailPasswordEnforced()) { - _ui->shareeLineEdit->clear(); - // always show a dialog for password-enforced email shares - bool ok = false; - - do { - password = QInputDialog::getText( - this, - tr("Password for share required"), - tr("Please enter a password for your email share:"), - QLineEdit::Password, - QString(), - &ok); - } while (password.isEmpty() && ok); - - if (!ok) { - return; - } - } - - _manager->createShare(_sharePath, Share::ShareType(sharee->type()), - sharee->shareWith(), _maxSharingPermissions, password); - - _ui->shareeLineEdit->setEnabled(false); - _ui->shareeLineEdit->clear(); -} - -void ShareUserGroupWidget::slotCompleterHighlighted(const QModelIndex &index) -{ - // By default the completer would set the text to EditRole, - // override that here. - _ui->shareeLineEdit->setText(index.data(Qt::DisplayRole).toString()); -} - -void ShareUserGroupWidget::displayError(int code, const QString &message) -{ - _pi_sharee.stopAnimation(); - - // Also remove the spinner in the widget list, if any - foreach (auto pi, _parentScrollArea->findChildren()) { - delete pi; - } - - qCWarning(lcSharing) << "Sharing error from server" << code << message; - _ui->errorLabel->setText(message); - _ui->errorLabel->show(); - activateShareeLineEdit(); -} - -void ShareUserGroupWidget::slotPrivateLinkOpenBrowser() -{ - Utility::openBrowser(_privateLinkUrl, this); -} - -void ShareUserGroupWidget::slotPrivateLinkCopy() -{ - QApplication::clipboard()->setText(_privateLinkUrl); -} - -void ShareUserGroupWidget::slotPrivateLinkEmail() -{ - Utility::openEmailComposer( - tr("I shared something with you"), - _privateLinkUrl, - this); -} - -void ShareUserGroupWidget::slotStyleChanged() -{ - customizeStyle(); - - // Notify the other widgets (ShareUserLine in this case, Dark-/Light-Mode switching) - emit styleChanged(); -} - -void ShareUserGroupWidget::customizeStyle() -{ - _searchGloballyAction->setIcon(Theme::createColorAwareIcon(":/client/theme/magnifying-glass.svg")); - - _ui->confirmShare->setIcon(Theme::createColorAwareIcon(":/client/theme/confirm.svg")); - - _pi_sharee.setColor(QGuiApplication::palette().color(QPalette::Text)); - - foreach (auto pi, _parentScrollArea->findChildren()) { - pi->setColor(QGuiApplication::palette().color(QPalette::Text));; - } -} - -void ShareUserGroupWidget::activateShareeLineEdit() -{ - _ui->shareeLineEdit->setEnabled(true); - _ui->shareeLineEdit->setFocus(); -} - -ShareUserLine::ShareUserLine(AccountPtr account, QSharedPointer share, - SharePermissions maxSharingPermissions, bool isFile, QWidget *parent) - : QWidget(parent) - , _ui(new Ui::ShareUserLine) - , _account(account) - , _share(share) - , _isFile(isFile) - , _profilePageMenu(account, share->getShareWith()->shareWith()) -{ - Q_ASSERT(_share); - _ui->setupUi(this); - - _ui->sharedWith->setElideMode(Qt::ElideRight); - _ui->sharedWith->setText(share->getShareWith()->format()); - - // adds permissions - // can edit permission - bool enabled = (maxSharingPermissions & SharePermissionUpdate); - if(!_isFile) enabled = enabled && (maxSharingPermissions & SharePermissionCreate && - maxSharingPermissions & SharePermissionDelete); - _ui->permissionsEdit->setEnabled(enabled); - connect(_ui->permissionsEdit, &QAbstractButton::clicked, this, &ShareUserLine::slotEditPermissionsChanged); - connect(_ui->noteConfirmButton, &QAbstractButton::clicked, this, &ShareUserLine::onNoteConfirmButtonClicked); - connect(_ui->calendar, &QDateTimeEdit::dateChanged, this, &ShareUserLine::setExpireDate); - - connect(_share.data(), &UserGroupShare::noteSet, this, &ShareUserLine::disableProgessIndicatorAnimation); - connect(_share.data(), &UserGroupShare::noteSetError, this, &ShareUserLine::disableProgessIndicatorAnimation); - connect(_share.data(), &UserGroupShare::expireDateSet, this, &ShareUserLine::disableProgessIndicatorAnimation); - - connect(_ui->confirmPassword, &QToolButton::clicked, this, &ShareUserLine::slotConfirmPasswordClicked); - connect(_ui->lineEdit_password, &QLineEdit::returnPressed, this, &ShareUserLine::slotLineEditPasswordReturnPressed); - - // create menu with checkable permissions - auto *menu = new QMenu(this); - _permissionReshare= new QAction(tr("Can reshare"), this); - _permissionReshare->setCheckable(true); - _permissionReshare->setEnabled(maxSharingPermissions & SharePermissionShare); - menu->addAction(_permissionReshare); - connect(_permissionReshare, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged); - - showNoteOptions(false); - - const bool isNoteSupported = _share->getShareType() != Share::ShareType::TypeEmail && _share->getShareType() != Share::ShareType::TypeRoom; - - if (isNoteSupported) { - _noteLinkAction = new QAction(tr("Note to recipient")); - _noteLinkAction->setCheckable(true); - menu->addAction(_noteLinkAction); - connect(_noteLinkAction, &QAction::triggered, this, &ShareUserLine::toggleNoteOptions); - if (!_share->getNote().isEmpty()) { - _noteLinkAction->setChecked(true); - showNoteOptions(true); - } - } - - showExpireDateOptions(false); - - const bool isExpirationDateSupported = _share->getShareType() != Share::ShareType::TypeEmail; - - if (isExpirationDateSupported) { - // email shares do not support expiration dates - _expirationDateLinkAction = new QAction(tr("Set expiration date")); - _expirationDateLinkAction->setCheckable(true); - menu->addAction(_expirationDateLinkAction); - connect(_expirationDateLinkAction, &QAction::triggered, this, &ShareUserLine::toggleExpireDateOptions); - const auto expireDate = _share->getExpireDate().isValid() ? share.data()->getExpireDate() : QDate(); - if (!expireDate.isNull()) { - _expirationDateLinkAction->setChecked(true); - showExpireDateOptions(true, expireDate); - } - } - - menu->addSeparator(); - - // Adds action to delete share widget - QIcon deleteicon = QIcon::fromTheme(QLatin1String("user-trash"),QIcon(QLatin1String(":/client/theme/delete.svg"))); - _deleteShareButton= new QAction(deleteicon,tr("Unshare"), this); - - menu->addAction(_deleteShareButton); - connect(_deleteShareButton, &QAction::triggered, this, &ShareUserLine::on_deleteShareButton_clicked); - - /* - * Files can't have create or delete permissions - */ - if (!_isFile) { - _permissionCreate = new QAction(tr("Can create"), this); - _permissionCreate->setCheckable(true); - _permissionCreate->setEnabled(maxSharingPermissions & SharePermissionCreate); - menu->addAction(_permissionCreate); - connect(_permissionCreate, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged); - - _permissionChange = new QAction(tr("Can change"), this); - _permissionChange->setCheckable(true); - _permissionChange->setEnabled(maxSharingPermissions & SharePermissionUpdate); - menu->addAction(_permissionChange); - connect(_permissionChange, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged); - - _permissionDelete = new QAction(tr("Can delete"), this); - _permissionDelete->setCheckable(true); - _permissionDelete->setEnabled(maxSharingPermissions & SharePermissionDelete); - menu->addAction(_permissionDelete); - connect(_permissionDelete, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged); - } - - // Adds action to display password widget (check box) - if (_share->getShareType() == Share::TypeEmail && (_share->isPasswordSet() || _account->capabilities().shareEmailPasswordEnabled())) { - _passwordProtectLinkAction = new QAction(tr("Password protect"), this); - _passwordProtectLinkAction->setCheckable(true); - _passwordProtectLinkAction->setChecked(_share->isPasswordSet()); - // checkbox can be checked/unchedkec if the password is not yet set or if it's not enforced - _passwordProtectLinkAction->setEnabled(!_share->isPasswordSet() || !_account->capabilities().shareEmailPasswordEnforced()); - - menu->addAction(_passwordProtectLinkAction); - connect(_passwordProtectLinkAction, &QAction::triggered, this, &ShareUserLine::slotPasswordCheckboxChanged); - - refreshPasswordLineEditPlaceholder(); - - connect(_share.data(), &Share::passwordSet, this, &ShareUserLine::slotPasswordSet); - connect(_share.data(), &Share::passwordSetError, this, &ShareUserLine::slotPasswordSetError); - } - - refreshPasswordOptions(); - - _ui->errorLabel->hide(); - - _ui->permissionToolButton->setMenu(menu); - _ui->permissionToolButton->setPopupMode(QToolButton::InstantPopup); - - _ui->passwordProgressIndicator->setVisible(false); - - // Set the permissions checkboxes - displayPermissions(); - - /* - * We don't show permission share for federated shares with server <9.1 - * https://github.com/owncloud/core/issues/22122#issuecomment-185637344 - * https://github.com/owncloud/client/issues/4996 - */ - if (share->getShareType() == Share::TypeRemote - && share->account()->serverVersionInt() < Account::makeServerVersion(9, 1, 0)) { - _permissionReshare->setVisible(false); - _ui->permissionToolButton->setVisible(false); - } - - connect(share.data(), &Share::permissionsSet, this, &ShareUserLine::slotPermissionsSet); - connect(share.data(), &Share::shareDeleted, this, &ShareUserLine::slotShareDeleted); - - if (!share->account()->capabilities().shareResharing()) { - _permissionReshare->setVisible(false); - } - - const auto avatarEventFilter = new AvatarEventFilter(_ui->avatar); - connect(avatarEventFilter, &AvatarEventFilter::contextMenu, this, &ShareUserLine::onAvatarContextMenu); - _ui->avatar->installEventFilter(avatarEventFilter); - - loadAvatar(); - - customizeStyle(); -} - -void ShareUserLine::onAvatarContextMenu(const QPoint &globalPosition) -{ - if (_share->getShareType() == Share::TypeUser) { - _profilePageMenu.exec(globalPosition); - } -} - -void ShareUserLine::loadAvatar() -{ - const int avatarSize = 36; - - // Set size of the placeholder - _ui->avatar->setMinimumHeight(avatarSize); - _ui->avatar->setMinimumWidth(avatarSize); - _ui->avatar->setMaximumHeight(avatarSize); - _ui->avatar->setMaximumWidth(avatarSize); - _ui->avatar->setAlignment(Qt::AlignCenter); - - setDefaultAvatar(avatarSize); - - /* Start the network job to fetch the avatar data. - * - * Currently only regular users can have avatars. - */ - if (_share->getShareWith()->type() == Sharee::User) { - auto *job = new AvatarJob(_share->account(), _share->getShareWith()->shareWith(), avatarSize, this); - connect(job, &AvatarJob::avatarPixmap, this, &ShareUserLine::slotAvatarLoaded); - job->start(); - } -} - -void ShareUserLine::setDefaultAvatar(int avatarSize) -{ - /* Create the fallback avatar. - * - * This will be shown until the avatar image data arrives. - */ - - // See core/js/placeholder.js for details on colors and styling - const auto backgroundColor = backgroundColorForShareeType(_share->getShareWith()->type()); - const QString style = QString(R"(* { - color: #fff; - background-color: %1; - border-radius: %2px; - text-align: center; - line-height: %2px; - font-size: %2px; - })").arg(backgroundColor.name(), QString::number(avatarSize / 2)); - _ui->avatar->setStyleSheet(style); - - const auto pixmap = pixmapForShareeType(_share->getShareWith()->type(), backgroundColor); - - if (!pixmap.isNull()) { - _ui->avatar->setPixmap(pixmap); - } else { - qCDebug(lcSharing) << "pixmap is null for share type: " << _share->getShareWith()->type(); - - // The avatar label is the first character of the user name. - const auto text = _share->getShareWith()->displayName(); - _ui->avatar->setText(text.at(0).toUpper()); - } -} - -void ShareUserLine::slotAvatarLoaded(QImage avatar) -{ - if (avatar.isNull()) - return; - - avatar = AvatarJob::makeCircularAvatar(avatar); - _ui->avatar->setPixmap(QPixmap::fromImage(avatar)); - - // Remove the stylesheet for the fallback avatar - _ui->avatar->setStyleSheet(""); -} - -void ShareUserLine::on_deleteShareButton_clicked() -{ - setEnabled(false); - _share->deleteShare(); -} - -ShareUserLine::~ShareUserLine() -{ - delete _ui; -} - -void ShareUserLine::slotEditPermissionsChanged() -{ - setEnabled(false); - - // Can never manually be set to "partial". - // This works because the state cycle for clicking is - // unchecked -> partial -> checked -> unchecked. - if (_ui->permissionsEdit->checkState() == Qt::PartiallyChecked) { - _ui->permissionsEdit->setCheckState(Qt::Checked); - } - - Share::Permissions permissions = SharePermissionRead; - - // folders edit = CREATE, READ, UPDATE, DELETE - // files edit = READ + UPDATE - if (_ui->permissionsEdit->checkState() == Qt::Checked) { - - /* - * Files can't have create or delete permisisons - */ - if (!_isFile) { - if (_permissionChange->isEnabled()) - permissions |= SharePermissionUpdate; - if (_permissionCreate->isEnabled()) - permissions |= SharePermissionCreate; - if (_permissionDelete->isEnabled()) - permissions |= SharePermissionDelete; - } else { - permissions |= SharePermissionUpdate; - } - } - - if(_isFile && _permissionReshare->isEnabled() && _permissionReshare->isChecked()) - permissions |= SharePermissionShare; - - _share->setPermissions(permissions); -} - -void ShareUserLine::slotPermissionsChanged() -{ - setEnabled(false); - - Share::Permissions permissions = SharePermissionRead; - - if (_permissionReshare->isChecked()) - permissions |= SharePermissionShare; - - if (!_isFile) { - if (_permissionChange->isChecked()) - permissions |= SharePermissionUpdate; - if (_permissionCreate->isChecked()) - permissions |= SharePermissionCreate; - if (_permissionDelete->isChecked()) - permissions |= SharePermissionDelete; - } else { - if (_ui->permissionsEdit->isChecked()) - permissions |= SharePermissionUpdate; - } - - _share->setPermissions(permissions); -} - -void ShareUserLine::slotPasswordCheckboxChanged() -{ - if (!_passwordProtectLinkAction->isChecked()) { - _ui->errorLabel->hide(); - _ui->errorLabel->clear(); - - if (!_share->isPasswordSet()) { - _ui->lineEdit_password->clear(); - refreshPasswordOptions(); - } else { - // do not call refreshPasswordOptions here, as it will be called after the network request is complete - togglePasswordSetProgressAnimation(true); - _share->setPassword(QString()); - } - } else { - refreshPasswordOptions(); - - if (_ui->lineEdit_password->isVisible() && _ui->lineEdit_password->isEnabled()) { - focusPasswordLineEdit(); - } - } -} - -void ShareUserLine::slotDeleteAnimationFinished() -{ - emit resizeRequested(); - emit visualDeletionDone(); - deleteLater(); - - // There is a painting bug where a small line of this widget isn't - // properly cleared. This explicit repaint() call makes sure any trace of - // the share widget is removed once it's destroyed. #4189 - connect(this, SIGNAL(destroyed(QObject *)), parentWidget(), SLOT(repaint())); -} - -void ShareUserLine::refreshPasswordOptions() -{ - const bool isPasswordEnabled = _share->getShareType() == Share::TypeEmail && _passwordProtectLinkAction->isChecked(); - - _ui->passwordLabel->setVisible(isPasswordEnabled); - _ui->lineEdit_password->setEnabled(isPasswordEnabled); - _ui->lineEdit_password->setVisible(isPasswordEnabled); - _ui->confirmPassword->setVisible(isPasswordEnabled); - - emit resizeRequested(); -} - -void ShareUserLine::refreshPasswordLineEditPlaceholder() -{ - if (_share->isPasswordSet()) { - _ui->lineEdit_password->setPlaceholderText(QString::fromUtf8(passwordIsSetPlaceholder)); - } else { - _ui->lineEdit_password->setPlaceholderText(""); - } -} - -void ShareUserLine::slotPasswordSet() -{ - togglePasswordSetProgressAnimation(false); - _ui->lineEdit_password->setEnabled(true); - _ui->confirmPassword->setEnabled(true); - - _ui->lineEdit_password->setText(""); - - _passwordProtectLinkAction->setEnabled(!_share->isPasswordSet() || !_account->capabilities().shareEmailPasswordEnforced()); - - refreshPasswordLineEditPlaceholder(); - - refreshPasswordOptions(); -} - -void ShareUserLine::slotPasswordSetError(int statusCode, const QString &message) -{ - qCWarning(lcSharing) << "Error from server" << statusCode << message; - - togglePasswordSetProgressAnimation(false); - - _ui->lineEdit_password->setEnabled(true); - _ui->confirmPassword->setEnabled(true); - - refreshPasswordLineEditPlaceholder(); - - refreshPasswordOptions(); - - focusPasswordLineEdit(); - - _ui->errorLabel->show(); - _ui->errorLabel->setText(message); - - emit resizeRequested(); -} - -void ShareUserLine::slotShareDeleted() -{ - auto *animation = new QPropertyAnimation(this, "maximumHeight", this); - - animation->setDuration(500); - animation->setStartValue(height()); - animation->setEndValue(0); - - connect(animation, &QAbstractAnimation::finished, this, &ShareUserLine::slotDeleteAnimationFinished); - connect(animation, &QVariantAnimation::valueChanged, this, &ShareUserLine::resizeRequested); - - animation->start(); -} - -void ShareUserLine::slotPermissionsSet() -{ - displayPermissions(); - setEnabled(true); -} - -QSharedPointer ShareUserLine::share() const -{ - return _share; -} - -void ShareUserLine::displayPermissions() -{ - auto perm = _share->getPermissions(); - -// folders edit = CREATE, READ, UPDATE, DELETE -// files edit = READ + UPDATE - if (perm & SharePermissionUpdate && (_isFile || - (perm & SharePermissionCreate && perm & SharePermissionDelete))) { - _ui->permissionsEdit->setCheckState(Qt::Checked); - } else if (!_isFile && perm & (SharePermissionUpdate | SharePermissionCreate | SharePermissionDelete)) { - _ui->permissionsEdit->setCheckState(Qt::PartiallyChecked); - } else if(perm & SharePermissionRead) { - _ui->permissionsEdit->setCheckState(Qt::Unchecked); - } - -// edit is independent of reshare - if (perm & SharePermissionShare) - _permissionReshare->setChecked(true); - - if(!_isFile){ - _permissionCreate->setChecked(perm & SharePermissionCreate); - _permissionChange->setChecked(perm & SharePermissionUpdate); - _permissionDelete->setChecked(perm & SharePermissionDelete); - } -} - -void ShareUserLine::slotStyleChanged() -{ - customizeStyle(); -} - -void ShareUserLine::focusPasswordLineEdit() -{ - _ui->lineEdit_password->setFocus(); -} - -void ShareUserLine::customizeStyle() -{ - _ui->permissionToolButton->setIcon(Theme::createColorAwareIcon(":/client/theme/more.svg")); - - QIcon deleteicon = QIcon::fromTheme(QLatin1String("user-trash"),Theme::createColorAwareIcon(QLatin1String(":/client/theme/delete.svg"))); - _deleteShareButton->setIcon(deleteicon); - - _ui->noteConfirmButton->setIcon(Theme::createColorAwareIcon(":/client/theme/confirm.svg")); - _ui->progressIndicator->setColor(QGuiApplication::palette().color(QPalette::WindowText)); - - // make sure to force BackgroundRole to QPalette::WindowText for a lable, because it's parent always has a different role set that applies to children unless customized - _ui->errorLabel->setBackgroundRole(QPalette::WindowText); -} - -QPixmap ShareUserLine::pixmapForShareeType(Sharee::Type type, const QColor &backgroundColor) const -{ - switch (type) { - case Sharee::Room: - return Ui::IconUtils::pixmapForBackground(QStringLiteral("talk-app.svg"), backgroundColor); - case Sharee::Email: - return Ui::IconUtils::pixmapForBackground(QStringLiteral("email.svg"), backgroundColor); - case Sharee::Group: - case Sharee::Federated: - case Sharee::Circle: - case Sharee::User: - break; - } - - return {}; -} - -QColor ShareUserLine::backgroundColorForShareeType(Sharee::Type type) const -{ - switch (type) { - case Sharee::Room: - return Theme::instance()->wizardHeaderBackgroundColor(); - case Sharee::Email: - return Theme::instance()->wizardHeaderTitleColor(); - case Sharee::Group: - case Sharee::Federated: - case Sharee::Circle: - case Sharee::User: - break; - } - - const auto calculateBackgroundBasedOnText = [this]() { - const auto hash = QCryptographicHash::hash(_ui->sharedWith->text().toUtf8(), QCryptographicHash::Md5); - Q_ASSERT(hash.size() > 0); - if (hash.size() == 0) { - qCWarning(lcSharing) << "Failed to calculate hash color for share:" << _share->path(); - return QColor{}; - } - const double hue = static_cast(hash[0]) / 255.; - return QColor::fromHslF(hue, 0.7, 0.68); - }; - - return calculateBackgroundBasedOnText(); -} - -void ShareUserLine::showNoteOptions(bool show) -{ - _ui->noteLabel->setVisible(show); - _ui->noteTextEdit->setVisible(show); - _ui->noteConfirmButton->setVisible(show); - - if (show) { - const auto note = _share->getNote(); - _ui->noteTextEdit->setText(note); - _ui->noteTextEdit->setFocus(); - } - - emit resizeRequested(); -} - - -void ShareUserLine::toggleNoteOptions(bool enable) -{ - showNoteOptions(enable); - - if (!enable) { - // Delete note - _share->setNote(QString()); - } -} - -void ShareUserLine::onNoteConfirmButtonClicked() -{ - setNote(_ui->noteTextEdit->toPlainText()); -} - -void ShareUserLine::setNote(const QString ¬e) -{ - enableProgessIndicatorAnimation(true); - _share->setNote(note); -} - -void ShareUserLine::toggleExpireDateOptions(bool enable) -{ - showExpireDateOptions(enable); - - if (!enable) { - _share->setExpireDate(QDate()); - } -} - -void ShareUserLine::showExpireDateOptions(bool show, const QDate &initialDate) -{ - _ui->expirationLabel->setVisible(show); - _ui->calendar->setVisible(show); - - if (show) { - _ui->calendar->setMinimumDate(QDate::currentDate().addDays(1)); - _ui->calendar->setDate(initialDate.isValid() ? initialDate : _ui->calendar->minimumDate()); - _ui->calendar->setFocus(); - - if (enforceExpirationDateForShare(_share->getShareType())) { - _ui->calendar->setMaximumDate(maxExpirationDateForShare(_share->getShareType(), _ui->calendar->maximumDate())); - _expirationDateLinkAction->setChecked(true); - _expirationDateLinkAction->setEnabled(false); - } - } - - emit resizeRequested(); -} - -void ShareUserLine::setExpireDate() -{ - enableProgessIndicatorAnimation(true); - _share->setExpireDate(_ui->calendar->date()); -} - -void ShareUserLine::enableProgessIndicatorAnimation(bool enable) -{ - if (enable) { - if (!_ui->progressIndicator->isAnimated()) { - _ui->progressIndicator->startAnimation(); - } - } else { - _ui->progressIndicator->stopAnimation(); - } -} - -void ShareUserLine::togglePasswordSetProgressAnimation(bool show) -{ - // button and progress indicator are interchanged depending on if the network request is in progress or not - _ui->confirmPassword->setVisible(!show && _passwordProtectLinkAction->isChecked()); - _ui->passwordProgressIndicator->setVisible(show); - if (show) { - if (!_ui->passwordProgressIndicator->isAnimated()) { - _ui->passwordProgressIndicator->startAnimation(); - } - } else { - _ui->passwordProgressIndicator->stopAnimation(); - } -} - -void ShareUserLine::disableProgessIndicatorAnimation() -{ - enableProgessIndicatorAnimation(false); -} - -QDate ShareUserLine::maxExpirationDateForShare(const Share::ShareType type, const QDate &fallbackDate) const -{ - auto daysToExpire = 0; - if (type == Share::ShareType::TypeRemote) { - daysToExpire = _account->capabilities().shareRemoteExpireDateDays(); - } else if (type == Share::ShareType::TypeEmail) { - daysToExpire = _account->capabilities().sharePublicLinkExpireDateDays(); - } else { - daysToExpire = _account->capabilities().shareInternalExpireDateDays(); - } - - if (daysToExpire > 0) { - return QDate::currentDate().addDays(daysToExpire); - } - - return fallbackDate; -} - -bool ShareUserLine::enforceExpirationDateForShare(const Share::ShareType type) const -{ - if (type == Share::ShareType::TypeRemote) { - return _account->capabilities().shareRemoteEnforceExpireDate(); - } else if (type == Share::ShareType::TypeEmail) { - return _account->capabilities().sharePublicLinkEnforceExpireDate(); - } - - return _account->capabilities().shareInternalEnforceExpireDate(); -} - -void ShareUserLine::setPasswordConfirmed() -{ - if (_ui->lineEdit_password->text().isEmpty()) { - return; - } - - _ui->lineEdit_password->setEnabled(false); - _ui->confirmPassword->setEnabled(false); - - _ui->errorLabel->hide(); - _ui->errorLabel->clear(); - - togglePasswordSetProgressAnimation(true); - _share->setPassword(_ui->lineEdit_password->text()); -} - -void ShareUserLine::slotLineEditPasswordReturnPressed() -{ - setPasswordConfirmed(); -} - -void ShareUserLine::slotConfirmPasswordClicked() -{ - setPasswordConfirmed(); -} -} diff --git a/src/gui/shareusergroupwidget.h b/src/gui/shareusergroupwidget.h deleted file mode 100644 index 512c5f7ca..000000000 --- a/src/gui/shareusergroupwidget.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) by Roeland Jago Douma - * - * 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 SHAREUSERGROUPWIDGET_H -#define SHAREUSERGROUPWIDGET_H - -#include "accountfwd.h" -#include "sharemanager.h" -#include "sharepermissions.h" -#include "sharee.h" -#include "profilepagewidget.h" -#include "QProgressIndicator.h" -#include -#include -#include -#include -#include -#include -#include -#include - -class QAction; -class QCompleter; -class QModelIndex; - -namespace OCC { - -namespace Ui { - class ShareUserGroupWidget; - class ShareUserLine; -} - -class AbstractCredentials; -class SyncResult; -class Share; -class ShareManager; - -class AvatarEventFilter : public QObject -{ - Q_OBJECT - -public: - explicit AvatarEventFilter(QObject *parent = nullptr); - -signals: - void clicked(); - void contextMenu(const QPoint &globalPosition); - -protected: - bool eventFilter(QObject *obj, QEvent *event) override; -}; - -/** - * @brief The ShareDialog (user/group) class - * @ingroup gui - */ -class ShareUserGroupWidget : public QWidget -{ - Q_OBJECT - -public: - explicit ShareUserGroupWidget(AccountPtr account, - const QString &sharePath, - const QString &localPath, - SharePermissions maxSharingPermissions, - const QString &privateLinkUrl, - QWidget *parent = nullptr); - ~ShareUserGroupWidget() override; - - QVBoxLayout *shareUserGroupLayout(); - -signals: - void togglePublicLinkShare(bool); - void styleChanged(); - -public slots: - void getShares(); - void slotShareCreated(const QSharedPointer &share); - void slotStyleChanged(); - -private slots: - void slotSharesFetched(const QList> &shares); - - void on_shareeLineEdit_textChanged(const QString &text); - void searchForSharees(ShareeModel::LookupMode lookupMode); - void slotLineEditTextEdited(const QString &text); - - void slotLineEditReturn(); - void slotCompleterActivated(const QModelIndex &index); - void slotCompleterHighlighted(const QModelIndex &index); - void slotShareesReady(); - void slotPrivateLinkShare(); - void displayError(int code, const QString &message); - - void slotPrivateLinkOpenBrowser(); - void slotPrivateLinkCopy(); - void slotPrivateLinkEmail(); - -private: - void customizeStyle(); - - void activateShareeLineEdit(); - - Ui::ShareUserGroupWidget *_ui; - QScopedPointer _searchGloballyAction; - QScrollArea *_parentScrollArea; - QVBoxLayout *_shareUserGroup; - AccountPtr _account; - QString _sharePath; - QString _localPath; - SharePermissions _maxSharingPermissions; - QString _privateLinkUrl; - - QCompleter *_completer; - ShareeModel *_completerModel; - QTimer _completionTimer; - - bool _isFile; - bool _disableCompleterActivated; // in order to avoid that we share the contents twice - ShareManager *_manager; - - QProgressIndicator _pi_sharee; - - QString _lastCreatedShareId; -}; - -/** - * The widget displayed for each user/group share - */ -class ShareUserLine : public QWidget -{ - Q_OBJECT - -public: - explicit ShareUserLine(AccountPtr account, - QSharedPointer Share, - SharePermissions maxSharingPermissions, - bool isFile, - QWidget *parent = nullptr); - ~ShareUserLine() override; - - QSharedPointer share() const; - -signals: - void visualDeletionDone(); - void resizeRequested(); - -public slots: - void slotStyleChanged(); - - void focusPasswordLineEdit(); - -private slots: - void on_deleteShareButton_clicked(); - void slotPermissionsChanged(); - void slotEditPermissionsChanged(); - void slotPasswordCheckboxChanged(); - void slotDeleteAnimationFinished(); - - void refreshPasswordOptions(); - - void refreshPasswordLineEditPlaceholder(); - - void slotPasswordSet(); - void slotPasswordSetError(int statusCode, const QString &message); - - void slotShareDeleted(); - void slotPermissionsSet(); - - void slotAvatarLoaded(QImage avatar); - - void setPasswordConfirmed(); - - void slotLineEditPasswordReturnPressed(); - - void slotConfirmPasswordClicked(); - - void onAvatarContextMenu(const QPoint &globalPosition); - -private: - void displayPermissions(); - void loadAvatar(); - void setDefaultAvatar(int avatarSize); - void customizeStyle(); - - QPixmap pixmapForShareeType(Sharee::Type type, const QColor &backgroundColor = QColor()) const; - QColor backgroundColorForShareeType(Sharee::Type type) const; - - void showNoteOptions(bool show); - void toggleNoteOptions(bool enable); - void onNoteConfirmButtonClicked(); - void setNote(const QString ¬e); - - void toggleExpireDateOptions(bool enable); - void showExpireDateOptions(bool show, const QDate &initialDate = QDate()); - void setExpireDate(); - - void togglePasswordSetProgressAnimation(bool show); - - void enableProgessIndicatorAnimation(bool enable); - void disableProgessIndicatorAnimation(); - - QDate maxExpirationDateForShare(const Share::ShareType type, const QDate &fallbackDate) const; - bool enforceExpirationDateForShare(const Share::ShareType type) const; - - Ui::ShareUserLine *_ui; - AccountPtr _account; - QSharedPointer _share; - bool _isFile; - - ProfilePageMenu _profilePageMenu; - - // _permissionEdit is a checkbox - QAction *_permissionReshare; - QAction *_deleteShareButton; - QAction *_permissionCreate; - QAction *_permissionChange; - QAction *_permissionDelete; - QAction *_noteLinkAction; - QAction *_expirationDateLinkAction; - QAction *_passwordProtectLinkAction; -}; -} - -#endif // SHAREUSERGROUPWIDGET_H diff --git a/src/gui/shareusergroupwidget.ui b/src/gui/shareusergroupwidget.ui deleted file mode 100644 index 38c45a23d..000000000 --- a/src/gui/shareusergroupwidget.ui +++ /dev/null @@ -1,154 +0,0 @@ - - - OCC::ShareUserGroupWidget - - - - 0 - 0 - 350 - 106 - - - - - 0 - 0 - - - - - 6 - - - 6 - - - 6 - - - 6 - - - 6 - - - - - - 0 - 0 - - - - - - - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - Share with users or groups … - - - - - - - - :/client/theme/confirm.svg:/client/theme/confirm.svg - - - true - - - - - - - - - - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 123 - 121 - 134 - - - - - - - - Placeholder for Error text - - - Qt::PlainText - - - true - - - - - - - - - - - diff --git a/src/gui/shellextensionsserver.cpp b/src/gui/shellextensionsserver.cpp index fa97a1b62..b01583116 100644 --- a/src/gui/shellextensionsserver.cpp +++ b/src/gui/shellextensionsserver.cpp @@ -16,29 +16,56 @@ #include "account.h" #include "accountstate.h" #include "common/shellextensionutils.h" +#include #include "folder.h" #include "folderman.h" #include +#include #include +#include #include +namespace { +constexpr auto isSharedInvalidationInterval = 2 * 60 * 1000; // 2 minutes, so we don't make fetch sharees requests too often +} + namespace OCC { +Q_LOGGING_CATEGORY(lcShellExtServer, "nextcloud.gui.shellextensions.server", QtInfoMsg) + ShellExtensionsServer::ShellExtensionsServer(QObject *parent) : QObject(parent) { + _isSharedInvalidationInterval = isSharedInvalidationInterval; _localServer.listen(VfsShellExtensions::serverNameForApplicationNameDefault()); connect(&_localServer, &QLocalServer::newConnection, this, &ShellExtensionsServer::slotNewConnection); } ShellExtensionsServer::~ShellExtensionsServer() { + for (const auto &connection : _customStateSocketConnections) { + if (connection) { + QObject::disconnect(connection); + } + } + _customStateSocketConnections.clear(); + if (!_localServer.isListening()) { return; } _localServer.close(); } +QString ShellExtensionsServer::getFetchThumbnailPath() +{ + return QStringLiteral("/index.php/core/preview"); +} + +void ShellExtensionsServer::setIsSharedInvalidationInterval(qint64 interval) +{ + _isSharedInvalidationInterval = interval; +} + void ShellExtensionsServer::sendJsonMessageWithVersion(QLocalSocket *socket, const QVariantMap &message) { socket->write(VfsShellExtensions::Protocol::createJsonMessage(message)); @@ -60,6 +87,143 @@ void ShellExtensionsServer::closeSession(QLocalSocket *socket) socket->disconnectFromServer(); } +void ShellExtensionsServer::processCustomStateRequest(QLocalSocket *socket, const CustomStateRequestInfo &customStateRequestInfo) +{ + if (!customStateRequestInfo.isValid()) { + sendEmptyDataAndCloseSession(socket); + return; + } + + const auto folder = FolderMan::instance()->folder(customStateRequestInfo.folderAlias); + + if (!folder) { + sendEmptyDataAndCloseSession(socket); + return; + } + + const auto filePathRelative = QString(customStateRequestInfo.path).remove(folder->path()); + + SyncJournalFileRecord record; + if (!folder->journalDb()->getFileRecord(filePathRelative, &record) || !record.isValid() || record.path().isEmpty()) { + qCWarning(lcShellExtServer) << "Record not found in SyncJournal for: " << filePathRelative; + sendEmptyDataAndCloseSession(socket); + return; + } + + const auto composeMessageReplyFromRecord = [](const SyncJournalFileRecord &record) { + QVariantList states; + if (record._lockstate._locked) { + states.push_back(QString(CUSTOM_STATE_ICON_LOCKED_INDEX).toInt() - QString(CUSTOM_STATE_ICON_INDEX_OFFSET).toInt()); + } + if (record._isShared) { + states.push_back(QString(CUSTOM_STATE_ICON_SHARED_INDEX).toInt() - QString(CUSTOM_STATE_ICON_INDEX_OFFSET).toInt()); + } + return QVariantMap{{VfsShellExtensions::Protocol::CustomStateDataKey, + QVariantMap{{VfsShellExtensions::Protocol::CustomStateStatesKey, states}}}}; + }; + + if (QDateTime::currentMSecsSinceEpoch() - record._lastShareStateFetchedTimestamp < _isSharedInvalidationInterval) { + qCInfo(lcShellExtServer) << record.path() << " record._lastShareStateFetchedTimestamp has less than " << _isSharedInvalidationInterval << " ms difference with QDateTime::currentMSecsSinceEpoch(). Returning data from SyncJournal."; + sendJsonMessageWithVersion(socket, composeMessageReplyFromRecord(record)); + closeSession(socket); + return; + } + + const auto lsColJobPath = [folder, &filePathRelative]() { + const auto filePathRelativeRemote = QDir(folder->remotePath()).filePath(filePathRelative); + // either get parent's path, or, return '/' if we are in the root folder + auto recordPathSplit = filePathRelativeRemote.split(QLatin1Char('/'), Qt::SkipEmptyParts); + if (recordPathSplit.size() > 1) { + recordPathSplit.removeLast(); + return recordPathSplit.join(QLatin1Char('/')); + } + return QStringLiteral("/"); + }(); + + if (_runningLsColJobsForPaths.contains(lsColJobPath)) { + qCInfo(lcShellExtServer) << "LsColJob is already running for path: " << lsColJobPath; + sendJsonMessageWithVersion(socket, composeMessageReplyFromRecord(record)); + closeSession(socket); + return; + } + + _customStateSocketConnections.insert(socket->socketDescriptor(), QObject::connect(this, &ShellExtensionsServer::directoryListingIterationFinished, [this, socket, filePathRelative, composeMessageReplyFromRecord](const QString &folderAlias) { + { + const auto connection = _customStateSocketConnections[socket->socketDescriptor()]; + if (connection) { + QObject::disconnect(connection); + } + _customStateSocketConnections.remove(socket->socketDescriptor()); + } + + const auto folder = FolderMan::instance()->folder(folderAlias); + SyncJournalFileRecord record; + if (!folder || !folder->journalDb()->getFileRecord(filePathRelative, &record) || !record.isValid()) { + qCWarning(lcShellExtServer) << "Record not found in SyncJournal for: " << filePathRelative; + sendEmptyDataAndCloseSession(socket); + return; + } + qCInfo(lcShellExtServer) << "Sending reply from LsColJob for socket: " << socket->socketDescriptor() << " and record: " << record.path(); + sendJsonMessageWithVersion(socket, composeMessageReplyFromRecord(record)); + closeSession(socket); + })); + + auto *const lsColJob = new LsColJob(folder->accountState()->account(), QDir::cleanPath(folder->remotePath() + lsColJobPath), this); + lsColJob->setProperties({QByteArrayLiteral("http://owncloud.org/ns:share-types"), QByteArrayLiteral("http://owncloud.org/ns:permissions")}); + + const auto folderAlias = customStateRequestInfo.folderAlias; + + QObject::connect(lsColJob, &LsColJob::directoryListingIterated, this, [this, folderAlias, lsColJobPath](const QString &name, const QMap &properties) { + const auto folder = FolderMan::instance()->folder(folderAlias); + + if (!folder) { + qCWarning(lcShellExtServer) << "No folder found for folderAlias: " << folderAlias; + return; + } + + SyncJournalFileRecord record; + const auto filePathWithoutDavPath = QString(name).remove(folder->accountState()->account()->davPathRoot()); + const auto filePathAdjusted = (filePathWithoutDavPath.size() > 1 && filePathWithoutDavPath.startsWith(QLatin1Char('/'))) ? filePathWithoutDavPath.mid(1) : filePathWithoutDavPath; + if (filePathAdjusted.isEmpty() || filePathAdjusted == lsColJobPath) { + // we are skipping the first item as it is the current path, but we are interested in nested items + return; + } + if (!folder || !folder->journalDb()->getFileRecord(filePathAdjusted, &record) || !record.isValid()) { + return; + } + + const auto isIncomingShare = properties.contains(QStringLiteral("permissions")) && RemotePermissions::fromServerString(properties.value(QStringLiteral("permissions"))).hasPermission(OCC::RemotePermissions::IsShared); + + const auto sharedByMe = !properties.value(QStringLiteral("share-types")).isEmpty(); + + record._sharedByMe = sharedByMe; + + record._isShared = isIncomingShare || sharedByMe; + record._lastShareStateFetchedTimestamp = QDateTime::currentMSecsSinceEpoch(); + + if (!folder->journalDb()->setFileRecord(record)) { + qCWarning(lcShellExtServer) << "Could not set file record for path: " << record._path; + emit directoryListingIterationFinished(folderAlias); + return; + } + }); + + QObject::connect(lsColJob, &LsColJob::finishedWithError, this, [this, folderAlias, lsColJobPath](QNetworkReply *reply) { + _runningLsColJobsForPaths.removeOne(lsColJobPath); + const auto httpCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + qCWarning(lcShellExtServer) << "LSCOL job error" << reply->errorString() << httpCode << reply->error(); + emit directoryListingIterationFinished(folderAlias); + }); + + QObject::connect(lsColJob, &LsColJob::finishedWithoutError, this, [this, folderAlias, lsColJobPath]() { + _runningLsColJobsForPaths.removeOne(lsColJobPath); + emit directoryListingIterationFinished(folderAlias); + }); + + _runningLsColJobsForPaths.push_back(lsColJobPath); + lsColJob->start(); +} + void ShellExtensionsServer::processThumbnailRequest(QLocalSocket *socket, const ThumbnailRequestInfo &thumbnailRequestInfo) { if (!thumbnailRequestInfo.isValid()) { @@ -87,7 +251,7 @@ void ShellExtensionsServer::processThumbnailRequest(QLocalSocket *socket, const queryItems.addQueryItem(QStringLiteral("fileId"), record._fileId); queryItems.addQueryItem(QStringLiteral("x"), QString::number(thumbnailRequestInfo.size.width())); queryItems.addQueryItem(QStringLiteral("y"), QString::number(thumbnailRequestInfo.size.height())); - const QUrl jobUrl = Utility::concatUrlPath(folder->accountState()->account()->url(), QStringLiteral("/index.php/core/preview"), queryItems); + const QUrl jobUrl = Utility::concatUrlPath(folder->accountState()->account()->url(), getFetchThumbnailPath(), queryItems); const auto job = new SimpleNetworkJob(folder->accountState()->account()); job->startRequest(QByteArrayLiteral("GET"), jobUrl); connect(job, &SimpleNetworkJob::finishedSignal, this, [socket, this](QNetworkReply *reply) { @@ -121,8 +285,53 @@ void ShellExtensionsServer::slotNewConnection() return; } + if (message.contains(VfsShellExtensions::Protocol::ThumbnailProviderRequestKey)) { + parseThumbnailRequest(socket, message); + return; + } else if (message.contains(VfsShellExtensions::Protocol::CustomStateProviderRequestKey)) { + parseCustomStateRequest(socket, message); + return; + } + qCWarning(lcShellExtServer) << "Invalid message received from shell extension: " << message; + sendEmptyDataAndCloseSession(socket); + return; +} + +void ShellExtensionsServer::parseCustomStateRequest(QLocalSocket *socket, const QVariantMap &message) +{ + const auto customStateRequestMessage = message.value(VfsShellExtensions::Protocol::CustomStateProviderRequestKey).toMap(); + const auto itemFilePath = QDir::fromNativeSeparators(customStateRequestMessage.value(VfsShellExtensions::Protocol::FilePathKey).toString()); + + if (itemFilePath.isEmpty()) { + sendEmptyDataAndCloseSession(socket); + return; + } + + QString foundFolderAlias; + for (const auto folder : FolderMan::instance()->map()) { + if (itemFilePath.startsWith(folder->path())) { + foundFolderAlias = folder->alias(); + break; + } + } + + if (foundFolderAlias.isEmpty()) { + sendEmptyDataAndCloseSession(socket); + return; + } + + const auto customStateRequestInfo = CustomStateRequestInfo { + itemFilePath, + foundFolderAlias + }; + + processCustomStateRequest(socket, customStateRequestInfo); +} + +void ShellExtensionsServer::parseThumbnailRequest(QLocalSocket *socket, const QVariantMap &message) +{ const auto thumbnailRequestMessage = message.value(VfsShellExtensions::Protocol::ThumbnailProviderRequestKey).toMap(); - const auto thumbnailFilePath = QDir::fromNativeSeparators(thumbnailRequestMessage.value(VfsShellExtensions::Protocol::ThumbnailProviderRequestFilePathKey).toString()); + const auto thumbnailFilePath = QDir::fromNativeSeparators(thumbnailRequestMessage.value(VfsShellExtensions::Protocol::FilePathKey).toString()); const auto thumbnailFileSize = thumbnailRequestMessage.value(VfsShellExtensions::Protocol::ThumbnailProviderRequestFileSizeKey).toMap(); if (thumbnailFilePath.isEmpty() || thumbnailFileSize.isEmpty()) { diff --git a/src/gui/shellextensionsserver.h b/src/gui/shellextensionsserver.h index 0699219ba..9b22716bf 100644 --- a/src/gui/shellextensionsserver.h +++ b/src/gui/shellextensionsserver.h @@ -16,9 +16,13 @@ #include #include +#include #include +#include +class QJsonDocument; class QLocalSocket; +class QNetworkReply; namespace OCC { class ShellExtensionsServer : public QObject @@ -29,7 +33,15 @@ class ShellExtensionsServer : public QObject QSize size; QString folderAlias; - bool isValid() const { return !path.isEmpty() && !size.isEmpty() && !folderAlias.isEmpty(); } + [[nodiscard]] bool isValid() const { return !path.isEmpty() && !size.isEmpty() && !folderAlias.isEmpty(); } + }; + + struct CustomStateRequestInfo + { + QString path; + QString folderAlias; + + bool isValid() const { return !path.isEmpty() && !folderAlias.isEmpty(); } }; Q_OBJECT @@ -37,16 +49,30 @@ public: ShellExtensionsServer(QObject *parent = nullptr); ~ShellExtensionsServer() override; + static QString getFetchThumbnailPath(); + + void setIsSharedInvalidationInterval(qint64 interval); + +signals: + void directoryListingIterationFinished(const QString &folderAlias); + private: void sendJsonMessageWithVersion(QLocalSocket *socket, const QVariantMap &message); void sendEmptyDataAndCloseSession(QLocalSocket *socket); void closeSession(QLocalSocket *socket); + void processCustomStateRequest(QLocalSocket *socket, const CustomStateRequestInfo &customStateRequestInfo); void processThumbnailRequest(QLocalSocket *socket, const ThumbnailRequestInfo &thumbnailRequestInfo); + void parseCustomStateRequest(QLocalSocket *socket, const QVariantMap &message); + void parseThumbnailRequest(QLocalSocket *socket, const QVariantMap &message); + private slots: void slotNewConnection(); private: QLocalServer _localServer; + QStringList _runningLsColJobsForPaths; + QMap _customStateSocketConnections; + qint64 _isSharedInvalidationInterval = 0; }; } // namespace OCC diff --git a/src/gui/socketapi/socketapi.cpp b/src/gui/socketapi/socketapi.cpp index be105088e..add45e0a9 100644 --- a/src/gui/socketapi/socketapi.cpp +++ b/src/gui/socketapi/socketapi.cpp @@ -23,8 +23,10 @@ #include "config.h" #include "configfile.h" +#include "deletejob.h" #include "folderman.h" #include "folder.h" +#include "encryptfolderjob.h" #include "theme.h" #include "common/syncjournalfilerecord.h" #include "syncengine.h" @@ -81,6 +83,11 @@ // The second number should be changed when there are new features. #define MIRALL_SOCKET_API_VERSION "1.1" +namespace { +constexpr auto encryptJobPropertyFolder = "folder"; +constexpr auto encryptJobPropertyPath = "path"; +} + namespace { const QLatin1Char RecordSeparator() @@ -338,7 +345,7 @@ void SocketApi::onLostConnection() void SocketApi::slotSocketDestroyed(QObject *obj) { - auto *socket = static_cast(obj); + auto *socket = dynamic_cast(obj); _listeners.remove(socket); } @@ -497,10 +504,65 @@ void SocketApi::broadcastMessage(const QString &msg, bool doWait) void SocketApi::processFileActivityRequest(const QString &localFile) { const auto fileData = FileData::get(localFile); - emit fileActivityCommandReceived(fileData.serverRelativePath, fileData.journalRecord().numericFileId().toInt()); + emit fileActivityCommandReceived(fileData.localPath); +} + +void SocketApi::processEncryptRequest(const QString &localFile) +{ + Q_ASSERT(QFileInfo(localFile).isDir()); + + const auto fileData = FileData::get(localFile); + + const auto folder = fileData.folder; + Q_ASSERT(folder); + + const auto account = folder->accountState()->account(); + Q_ASSERT(account); + + const auto rec = fileData.journalRecord(); + Q_ASSERT(rec.isValid()); + + if (!account->e2e() || account->e2e()->_mnemonic.isEmpty()) { + const int ret = QMessageBox::critical(nullptr, + tr("Failed to encrypt folder at \"%1\"").arg(fileData.folderRelativePath), + tr("The account %1 does not have end-to-end encryption configured. " + "Please configure this in your account settings to enable folder encryption.").arg(account->prettyName())); + Q_UNUSED(ret) + return; + } + + auto path = rec._path; + // Folder records have directory paths in Foo/Bar/ convention... + // But EncryptFolderJob expects directory path Foo/Bar convention + auto choppedPath = path; + if (choppedPath.endsWith('/') && choppedPath != QStringLiteral("/")) { + choppedPath.chop(1); + } + if (choppedPath.startsWith('/') && choppedPath != QStringLiteral("/")) { + choppedPath = choppedPath.mid(1); + } + + auto job = new OCC::EncryptFolderJob(account, folder->journalDb(), choppedPath, rec.numericFileId(), this); + connect(job, &OCC::EncryptFolderJob::finished, this, [fileData, job](const int status) { + if (status == OCC::EncryptFolderJob::Error) { + const int ret = QMessageBox::critical(nullptr, + tr("Failed to encrypt folder"), + tr("Could not encrypt the following folder: \"%1\".\n\n" + "Server replied with error: %2").arg(fileData.folderRelativePath, job->errorString())); + Q_UNUSED(ret) + } else { + const int ret = QMessageBox::information(nullptr, + tr("Folder encrypted successfully").arg(fileData.folderRelativePath), + tr("The following folder was encrypted successfully: \"%1\"").arg(fileData.folderRelativePath)); + Q_UNUSED(ret) + } + }); + job->setProperty(encryptJobPropertyFolder, QVariant::fromValue(folder)); + job->setProperty(encryptJobPropertyPath, QVariant::fromValue(path)); + job->start(); } -void SocketApi::processShareRequest(const QString &localFile, SocketListener *listener, ShareDialogStartPage startPage) +void SocketApi::processShareRequest(const QString &localFile, SocketListener *listener) { auto theme = Theme::instance(); @@ -537,10 +599,16 @@ void SocketApi::processShareRequest(const QString &localFile, SocketListener *li const QString message = QLatin1String("SHARE:OK:") + QDir::toNativeSeparators(localFile); listener->sendMessage(message); - emit shareCommandReceived(remotePath, fileData.localPath, startPage); + emit shareCommandReceived(fileData.localPath); } } +void SocketApi::processLeaveShareRequest(const QString &localFile, SocketListener *listener) +{ + Q_UNUSED(listener) + FolderMan::instance()->leaveShare(QDir::fromNativeSeparators(localFile)); +} + void SocketApi::broadcastStatusPushMessage(const QString &systemPath, SyncFileStatus fileStatus) { QString msg = buildMessage(QLatin1String("STATUS"), systemPath, fileStatus.toSocketAPIString()); @@ -581,7 +649,12 @@ void SocketApi::command_RETRIEVE_FILE_STATUS(const QString &argument, SocketList void SocketApi::command_SHARE(const QString &localFile, SocketListener *listener) { - processShareRequest(localFile, listener, ShareDialogStartPage::UsersAndGroups); + processShareRequest(localFile, listener); +} + +void SocketApi::command_LEAVESHARE(const QString &localFile, SocketListener *listener) +{ + processLeaveShareRequest(localFile, listener); } void SocketApi::command_ACTIVITY(const QString &localFile, SocketListener *listener) @@ -591,9 +664,16 @@ void SocketApi::command_ACTIVITY(const QString &localFile, SocketListener *liste processFileActivityRequest(localFile); } +void SocketApi::command_ENCRYPT(const QString &localFile, SocketListener *listener) +{ + Q_UNUSED(listener); + + processEncryptRequest(localFile); +} + void SocketApi::command_MANAGE_PUBLIC_LINKS(const QString &localFile, SocketListener *listener) { - processShareRequest(localFile, listener, ShareDialogStartPage::PublicLinks); + processShareRequest(localFile, listener); } void SocketApi::command_VERSION(const QString &, SocketListener *listener) @@ -673,7 +753,7 @@ public: } private slots: - void sharesFetched(const QList> &shares) + void sharesFetched(const QList &shares) { auto shareName = SocketApi::tr("Context menu share"); @@ -694,7 +774,7 @@ private slots: _shareManager.createLinkShare(_localFile, shareName, QString()); } - void linkShareCreated(const QSharedPointer &share) + void linkShareCreated(const QSharedPointer &share) { qCDebug(lcPublicLink) << "New share created"; success(share->getLink().toString()); @@ -783,7 +863,7 @@ void SocketApi::command_COPY_PUBLIC_LINK(const QString &localFile, SocketListene connect(job, &GetOrCreatePublicLinkShare::done, this, [](const QString &url) { copyUrlToClipboard(url); }); connect(job, &GetOrCreatePublicLinkShare::error, this, - [=]() { emit shareCommandReceived(fileData.serverRelativePath, fileData.localPath, ShareDialogStartPage::PublicLinks); }); + [=]() { emit shareCommandReceived(fileData.localPath); }); job->run(); } @@ -982,12 +1062,16 @@ void SocketApi::setFileLock(const QString &localFile, const SyncFileItem::LockSt } shareFolder->accountState()->account()->setLockFileState(fileData.serverRelativePath, shareFolder->journalDb(), lockState); + + shareFolder->journalDb()->schedulePathForRemoteDiscovery(fileData.serverRelativePath); + shareFolder->scheduleThisFolderSoon(); } void SocketApi::command_V2_LIST_ACCOUNTS(const QSharedPointer &job) const { QJsonArray out; - for (auto acc : AccountManager::instance()->accounts()) { + const auto accounts = AccountManager::instance()->accounts(); + for (auto acc : accounts) { // TODO: Use uuid once https://github.com/owncloud/client/pull/8397 is merged out << QJsonObject({ { "name", acc->account()->displayName() }, { "id", acc->account()->id() } }); } @@ -1043,6 +1127,10 @@ void SocketApi::sendSharingContextMenuOptions(const FileData &fileData, SocketLi if (!capabilities.shareAPI() || !(theme->userGroupSharing() || (theme->linkSharing() && capabilities.sharePublicLink()))) return; + if (record._isShared && !record._sharedByMe) { + listener->sendMessage(QLatin1String("MENU_ITEM:LEAVESHARE") + flagString + tr("Leave this share")); + } + // 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)) { @@ -1073,6 +1161,39 @@ void SocketApi::sendSharingContextMenuOptions(const FileData &fileData, SocketLi //listener->sendMessage(QLatin1String("MENU_ITEM:EMAIL_PRIVATE_LINK") + flagString + tr("Send private link by email …")); } +void SocketApi::sendEncryptFolderCommandMenuEntries(const QFileInfo &fileInfo, + const FileData &fileData, + const bool isE2eEncryptedPath, + const OCC::SocketListener* const listener) const +{ + if (!listener || + !fileData.folder || + !fileData.folder->accountState() || + !fileData.folder->accountState()->account() || + !fileData.folder->accountState()->account()->capabilities().clientSideEncryptionAvailable() || + !fileInfo.isDir() || + isE2eEncryptedPath) { + return; + } + + bool anyAncestorEncrypted = false; + auto ancestor = fileData.parentFolder(); + while (ancestor.journalRecord().isValid()) { + if (ancestor.journalRecord()._isE2eEncrypted) { + anyAncestorEncrypted = true; + break; + } + + ancestor = ancestor.parentFolder(); + } + + if (!anyAncestorEncrypted) { + const auto isOnTheServer = fileData.journalRecord().isValid(); + const auto flagString = isOnTheServer ? QLatin1String("::") : QLatin1String(":d:"); + listener->sendMessage(QStringLiteral("MENU_ITEM:ENCRYPT") + flagString + tr("Encrypt")); + } +} + void SocketApi::sendLockFileCommandMenuEntries(const QFileInfo &fileInfo, Folder* const syncFolder, const FileData &fileData, @@ -1149,7 +1270,9 @@ SyncJournalFileRecord SocketApi::FileData::journalRecord() const SyncJournalFileRecord record; if (!folder) return record; - folder->journalDb()->getFileRecord(folderRelativePath, &record); + if (!folder->journalDb()->getFileRecord(folderRelativePath, &record)) { + qCWarning(lcSocketApi) << "Failed to get journal record for path" << folderRelativePath; + } return record; } @@ -1193,6 +1316,7 @@ void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListe const QFileInfo fileInfo(fileData.localPath); sendLockFileInfoMenuEntries(fileInfo, syncFolder, fileData, listener, record); + if (!fileInfo.isDir()) { listener->sendMessage(QLatin1String("MENU_ITEM:ACTIVITY") + flagString + tr("Activity")); } @@ -1205,6 +1329,7 @@ void SocketApi::command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListe listener->sendMessage(QLatin1String("MENU_ITEM:OPEN_PRIVATE_LINK") + flagString + tr("Open in browser")); } + sendEncryptFolderCommandMenuEntries(fileInfo, fileData, isE2eEncryptedPath, listener); sendLockFileCommandMenuEntries(fileInfo, syncFolder, fileData, listener); sendSharingContextMenuOptions(fileData, listener, !isE2eEncryptedPath); diff --git a/src/gui/socketapi/socketapi.h b/src/gui/socketapi/socketapi.h index 1f36d6cef..0806158a2 100644 --- a/src/gui/socketapi/socketapi.h +++ b/src/gui/socketapi/socketapi.h @@ -15,10 +15,9 @@ #ifndef SOCKETAPI_H #define SOCKETAPI_H -#include "syncfileitem.h" #include "common/syncfilestatus.h" -#include "sharedialog.h" // for the ShareDialogStartPage #include "common/syncjournalfilerecord.h" +#include "syncfileitem.h" #include "config.h" @@ -29,8 +28,8 @@ class QLocalSocket; class QStringList; class QFileInfo; -namespace OCC { - +namespace OCC +{ class SyncFileStatus; class Folder; class SocketListener; @@ -57,14 +56,14 @@ public: ~SocketApi() override; public slots: - void slotUpdateFolderView(Folder *f); + void slotUpdateFolderView(OCC::Folder *f); void slotUnregisterPath(const QString &alias); void slotRegisterPath(const QString &alias); - void broadcastStatusPushMessage(const QString &systemPath, SyncFileStatus fileStatus); + void broadcastStatusPushMessage(const QString &systemPath, OCC::SyncFileStatus fileStatus); signals: - void shareCommandReceived(const QString &sharePath, const QString &localPath, ShareDialogStartPage startPage); - void fileActivityCommandReceived(const QString &objectName, const int objectId); + void shareCommandReceived(const QString &localPath); + void fileActivityCommandReceived(const QString &localPath); private slots: void slotNewConnection(); @@ -83,12 +82,12 @@ private: struct FileData { static FileData get(const QString &localFile); - SyncFileStatus syncFileStatus() const; - SyncJournalFileRecord journalRecord() const; - FileData parentFolder() const; + [[nodiscard]] SyncFileStatus syncFileStatus() const; + [[nodiscard]] SyncJournalFileRecord journalRecord() const; + [[nodiscard]] FileData parentFolder() const; // Relative path of the file locally, without any vfs suffix - QString folderRelativePathNoVfsSuffix() const; + [[nodiscard]] QString folderRelativePathNoVfsSuffix() const; Folder *folder; // Absolute path of the file locally. (May be a virtual file) @@ -102,63 +101,72 @@ private: void broadcastMessage(const QString &msg, bool doWait = false); // opens share dialog, sends reply - void processShareRequest(const QString &localFile, SocketListener *listener, ShareDialogStartPage startPage); + void processShareRequest(const QString &localFile, SocketListener *listener); + void processLeaveShareRequest(const QString &localFile, SocketListener *listener); void processFileActivityRequest(const QString &localFile); + void processEncryptRequest(const QString &localFile); - 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_RETRIEVE_FOLDER_STATUS(const QString &argument, OCC::SocketListener *listener); + Q_INVOKABLE void command_RETRIEVE_FILE_STATUS(const QString &argument, OCC::SocketListener *listener); - Q_INVOKABLE void command_VERSION(const QString &argument, SocketListener *listener); + Q_INVOKABLE void command_VERSION(const QString &argument, OCC::SocketListener *listener); - Q_INVOKABLE void command_SHARE_MENU_TITLE(const QString &argument, SocketListener *listener); + Q_INVOKABLE void command_SHARE_MENU_TITLE(const QString &argument, OCC::SocketListener *listener); // The context menu actions - Q_INVOKABLE void command_ACTIVITY(const QString &localFile, SocketListener *listener); - 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_MAKE_AVAILABLE_LOCALLY(const QString &filesArg, SocketListener *listener); - Q_INVOKABLE void command_MAKE_ONLINE_ONLY(const QString &filesArg, SocketListener *listener); - Q_INVOKABLE void command_RESOLVE_CONFLICT(const QString &localFile, SocketListener *listener); - Q_INVOKABLE void command_DELETE_ITEM(const QString &localFile, SocketListener *listener); - Q_INVOKABLE void command_MOVE_ITEM(const QString &localFile, SocketListener *listener); - Q_INVOKABLE void command_LOCK_FILE(const QString &localFile, SocketListener *listener); - Q_INVOKABLE void command_UNLOCK_FILE(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_ACTIVITY(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_ENCRYPT(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_SHARE(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_LEAVESHARE(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_MANAGE_PUBLIC_LINKS(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_COPY_PUBLIC_LINK(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_COPY_PRIVATE_LINK(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_EMAIL_PRIVATE_LINK(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_OPEN_PRIVATE_LINK(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_MAKE_AVAILABLE_LOCALLY(const QString &filesArg, OCC::SocketListener *listener); + Q_INVOKABLE void command_MAKE_ONLINE_ONLY(const QString &filesArg, OCC::SocketListener *listener); + Q_INVOKABLE void command_RESOLVE_CONFLICT(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_DELETE_ITEM(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_MOVE_ITEM(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_LOCK_FILE(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_UNLOCK_FILE(const QString &localFile, OCC::SocketListener *listener); void setFileLock(const QString &localFile, const SyncFileItem::LockStatus lockState) const; // Windows Shell / Explorer pinning fallbacks, see issue: https://github.com/nextcloud/desktop/issues/1599 #ifdef Q_OS_WIN - Q_INVOKABLE void command_COPYASPATH(const QString &localFile, SocketListener *listener); - Q_INVOKABLE void command_OPENNEWWINDOW(const QString &localFile, SocketListener *listener); - Q_INVOKABLE void command_OPEN(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_COPYASPATH(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_OPENNEWWINDOW(const QString &localFile, OCC::SocketListener *listener); + Q_INVOKABLE void command_OPEN(const QString &localFile, OCC::SocketListener *listener); #endif // External sync - Q_INVOKABLE void command_V2_LIST_ACCOUNTS(const QSharedPointer &job) const; - Q_INVOKABLE void command_V2_UPLOAD_FILES_FROM(const QSharedPointer &job) const; + Q_INVOKABLE void command_V2_LIST_ACCOUNTS(const QSharedPointer &job) const; + Q_INVOKABLE void command_V2_UPLOAD_FILES_FROM(const QSharedPointer &job) const; // Fetch the private link and call targetFun void fetchPrivateLinkUrlHelper(const QString &localFile, const std::function &targetFun); /** Sends translated/branded strings that may be useful to the integration */ - Q_INVOKABLE void command_GET_STRINGS(const QString &argument, SocketListener *listener); + Q_INVOKABLE void command_GET_STRINGS(const QString &argument, OCC::SocketListener *listener); // Sends the context menu options relating to sharing to listener void sendSharingContextMenuOptions(const FileData &fileData, SocketListener *listener, bool enabled); + void sendEncryptFolderCommandMenuEntries(const QFileInfo &fileInfo, + const FileData &fileData, + const bool isE2eEncryptedPath, + const OCC::SocketListener* const listener) const; + void sendLockFileCommandMenuEntries(const QFileInfo &fileInfo, - Folder * const syncFolder, + Folder *const syncFolder, const FileData &fileData, - const SocketListener * const listener) const; + const SocketListener *const listener) const; void sendLockFileInfoMenuEntries(const QFileInfo &fileInfo, - Folder * const syncFolder, + Folder* const syncFolder, const FileData &fileData, - const SocketListener * const listener, + const SocketListener* const listener, const SyncJournalFileRecord &record) const; /** Send the list of menu item. (added in version 1.1) @@ -168,10 +176,10 @@ private: * If flag contains 'd', the menu should be disabled * and ends with GET_MENU_ITEMS:END */ - Q_INVOKABLE void command_GET_MENU_ITEMS(const QString &argument, SocketListener *listener); + Q_INVOKABLE void command_GET_MENU_ITEMS(const QString &argument, OCC::SocketListener *listener); /// Direct Editing - Q_INVOKABLE void command_EDIT(const QString &localFile, SocketListener *listener); + Q_INVOKABLE void command_EDIT(const QString &localFile, OCC::SocketListener *listener); DirectEditor* getDirectEditorForLocalFile(const QString &localFile); #if GUI_TESTING diff --git a/src/gui/socketapi/socketapi_p.h b/src/gui/socketapi/socketapi_p.h index 91724d6da..729608c25 100644 --- a/src/gui/socketapi/socketapi_p.h +++ b/src/gui/socketapi/socketapi_p.h @@ -47,7 +47,7 @@ public: hashBits.setBit((hash & 0xFFFF) % NumBits); // NOLINT it's uint all the way and the modulo puts us back in the 0..1023 range hashBits.setBit((hash >> 16) % NumBits); // NOLINT } - bool isHashMaybeStored(uint hash) const + [[nodiscard]] bool isHashMaybeStored(uint hash) const { return hashBits.testBit((hash & 0xFFFF) % NumBits) // NOLINT && hashBits.testBit((hash >> 16) % NumBits); // NOLINT @@ -147,8 +147,8 @@ public: void success(const QJsonObject &response) const; void failure(const QString &error) const; - const QJsonObject &arguments() const { return _arguments; } - QByteArray command() const { return _command; } + [[nodiscard]] const QJsonObject &arguments() const { return _arguments; } + [[nodiscard]] QByteArray command() const { return _command; } Q_SIGNALS: void finished() const; diff --git a/src/gui/sslerrordialog.h b/src/gui/sslerrordialog.h index 327573260..597227e76 100644 --- a/src/gui/sslerrordialog.h +++ b/src/gui/sslerrordialog.h @@ -52,13 +52,13 @@ public: ~SslErrorDialog() override; bool checkFailingCertsKnown(const QList &errors); bool trustConnection(); - QList unknownCerts() const { return _unknownCerts; } + [[nodiscard]] QList unknownCerts() const { return _unknownCerts; } private: - QString styleSheet() const; + [[nodiscard]] QString styleSheet() const; bool _allTrusted; - QString certDiv(QSslCertificate) const; + [[nodiscard]] QString certDiv(QSslCertificate) const; QList _unknownCerts; QString _customConfigHandle; diff --git a/src/gui/syncrunfilelog.cpp b/src/gui/syncrunfilelog.cpp index 6f75f53ce..f04636b4f 100644 --- a/src/gui/syncrunfilelog.cpp +++ b/src/gui/syncrunfilelog.cpp @@ -104,7 +104,7 @@ void SyncRunFileLog::logItem(const SyncFileItem &item) } QString ts = QString::fromLatin1(item._responseTimeStamp); if (ts.length() > 6) { - const QRegularExpression rx(R"((\d\d:\d\d:\d\d))"); + static const QRegularExpression rx(R"((\d\d:\d\d:\d\d))"); const auto rxMatch = rx.match(ts); if (rxMatch.hasMatch()) { ts = rxMatch.captured(0); diff --git a/src/gui/systray.cpp b/src/gui/systray.cpp index 8937b5e81..c45b870b0 100644 --- a/src/gui/systray.cpp +++ b/src/gui/systray.cpp @@ -74,38 +74,11 @@ void Systray::setTrayEngine(QQmlApplicationEngine *trayEngine) Systray::Systray() : QSystemTrayIcon(nullptr) { - qmlRegisterSingletonType("com.nextcloud.desktopclient", 1, 0, "UserModel", - [](QQmlEngine *, QJSEngine *) -> QObject * { - return UserModel::instance(); - } - ); - - qmlRegisterSingletonType("com.nextcloud.desktopclient", 1, 0, "UserAppsModel", - [](QQmlEngine *, QJSEngine *) -> QObject * { - return UserAppsModel::instance(); - } - ); - - qmlRegisterSingletonType("com.nextcloud.desktopclient", 1, 0, "Theme", - [](QQmlEngine *, QJSEngine *) -> QObject * { - return Theme::instance(); - } - ); - - qmlRegisterSingletonType("com.nextcloud.desktopclient", 1, 0, "Systray", - [](QQmlEngine *, QJSEngine *) -> QObject * { - return Systray::instance(); - } - ); - - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "WheelHandler"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "CallStateChecker"); - #if defined(Q_OS_MACOS) && defined(BUILD_OWNCLOUD_OSX_BUNDLE) setUserNotificationCenterDelegate(); checkNotificationAuth(MacNotificationAuthorizationOptions::Default); // No provisional auth, ask user explicitly first time registerNotificationCategories(QString(tr("Download"))); -#else +#elif !defined(Q_OS_MACOS) connect(AccountManager::instance(), &AccountManager::accountAdded, this, &Systray::setupContextMenu); connect(AccountManager::instance(), &AccountManager::accountRemoved, @@ -312,6 +285,115 @@ void Systray::destroyEditFileLocallyLoadingDialog() _editFileLocallyLoadingDialog = nullptr; } +bool Systray::raiseDialogs() +{ + return raiseFileDetailDialogs(); +} + +bool Systray::raiseFileDetailDialogs(const QString &localPath) +{ + if(_fileDetailDialogs.empty()) { + return false; + } + + auto it = _fileDetailDialogs.begin(); + while (it != _fileDetailDialogs.end()) { + const auto dialog = *it; + auto nullDialog = dialog == nullptr; + + if (!nullDialog && !dialog->isVisible()) { + destroyDialog(dialog); + nullDialog = true; + } + + if (!nullDialog && (localPath.isEmpty() || dialog->property("localPath").toString() == localPath)) { + dialog->show(); + dialog->raise(); + dialog->requestActivate(); + + ++it; + continue; + } + + it = _fileDetailDialogs.erase(it); + continue; + } + + // If it is empty then we have raised no dialogs, so return false (and viceversa) + return !_fileDetailDialogs.empty(); +} + +void Systray::createFileDetailsDialog(const QString &localPath) +{ + if (raiseFileDetailDialogs(localPath)) { + qCDebug(lcSystray) << "Reopening an existing file details dialog for " << localPath; + return; + } + + qCDebug(lcSystray) << "Opening new file details dialog for " << localPath; + + if (!_trayEngine) { + qCWarning(lcSystray) << "Could not open file details dialog for" << localPath << "as no tray engine was available"; + return; + } + + const auto folder = FolderMan::instance()->folderForPath(localPath); + if (!folder) { + qCWarning(lcSystray) << "Could not open file details dialog for" << localPath << "no responsible folder found"; + return; + } + + const QVariantMap initialProperties{ + {"accountState", QVariant::fromValue(folder->accountState())}, + {"localPath", localPath}, + }; + + QQmlComponent fileDetailsDialog(_trayEngine, QStringLiteral("qrc:/qml/src/gui/filedetails/FileDetailsWindow.qml")); + + if (!fileDetailsDialog.isError()) { + const auto createdDialog = fileDetailsDialog.createWithInitialProperties(initialProperties); + const auto dialog = qobject_cast(createdDialog); + + if(!dialog) { + qCWarning(lcSystray) << "File details dialog window resulted in creation of object that was not a window!"; + return; + } + + _fileDetailDialogs.append(dialog); + + dialog->show(); + dialog->raise(); + dialog->requestActivate(); + + } else { + qCWarning(lcSystray) << fileDetailsDialog.errorString(); + } +} + +void Systray::createShareDialog(const QString &localPath) +{ + createFileDetailsDialog(localPath); + Q_EMIT showFileDetailsPage(localPath, FileDetailsPage::Sharing); +} + +void Systray::createFileActivityDialog(const QString &localPath) +{ + createFileDetailsDialog(localPath); + Q_EMIT showFileDetailsPage(localPath, FileDetailsPage::Activity); +} + +void Systray::presentShareViewInTray(const QString &localPath) +{ + const auto folder = FolderMan::instance()->folderForPath(localPath); + if (!folder) { + qCWarning(lcSystray) << "Could not open file details view in tray for" << localPath << "no responsible folder found"; + return; + } + qCDebug(lcSystray) << "Opening file details view in tray for " << localPath; + + Q_EMIT showFileDetails(folder->accountState(), localPath, FileDetailsPage::Sharing); +} + void Systray::slotCurrentUserChanged() { if (_trayEngine) { @@ -416,6 +498,18 @@ void Systray::showUpdateMessage(const QString &title, const QString &message, co #endif } +void Systray::showTalkMessage(const QString &title, const QString &message, const QString &token, const QString &replyTo, const AccountStatePtr &accountState) +{ +#if defined(Q_OS_MACOS) && defined(BUILD_OWNCLOUD_OSX_BUNDLE) + sendOsXTalkNotification(title, message, token, replyTo, accountState); +#else // TODO: Implement custom notifications (i.e. actionable) for other OSes + Q_UNUSED(replyTo) + Q_UNUSED(token) + Q_UNUSED(accountState) + showMessage(title, message); +#endif +} + void Systray::setToolTip(const QString &tip) { QSystemTrayIcon::setToolTip(tr("%1: %2").arg(Theme::instance()->appNameGUI(), tip)); diff --git a/src/gui/systray.h b/src/gui/systray.h index e6f88d3d7..99a18296d 100644 --- a/src/gui/systray.h +++ b/src/gui/systray.h @@ -51,6 +51,7 @@ void registerNotificationCategories(const QString &localizedDownloadString); bool canOsXSendUserNotification(); void sendOsXUserNotification(const QString &title, const QString &message); void sendOsXUpdateNotification(const QString &title, const QString &message, const QUrl &webUrl); +void sendOsXTalkNotification(const QString &title, const QString &message, const QString &token, const QString &replyTo, const AccountStatePtr accountState); void setTrayWindowLevelAndVisibleOnAllSpaces(QWindow *window); double menuBarThickness(); #endif @@ -82,14 +83,8 @@ public: enum class WindowPosition { Default, Center }; Q_ENUM(WindowPosition); - void setTrayEngine(QQmlApplicationEngine *trayEngine); - void create(); - void showMessage(const QString &title, const QString &message, MessageIcon icon = Information); - void showUpdateMessage(const QString &title, const QString &message, const QUrl &webUrl); - void setToolTip(const QString &tip); - void createCallDialog(const Activity &callNotification, const AccountStatePtr accountState); - void createEditFileLocallyLoadingDialog(const QString &fileName); - void destroyEditFileLocallyLoadingDialog(); + enum class FileDetailsPage { Activity, Sharing }; + Q_ENUM(FileDetailsPage); Q_REQUIRED_RESULT QString windowTitle() const; Q_REQUIRED_RESULT bool useNormalWindow() const; @@ -97,6 +92,8 @@ public: Q_REQUIRED_RESULT bool syncIsPaused() const; Q_REQUIRED_RESULT bool isOpen() const; + bool raiseDialogs(); + signals: void currentUserChanged(); void openAccountWizard(); @@ -104,8 +101,8 @@ signals: void openHelp(); void shutdown(); - void openShareDialog(const QString &sharePath, const QString &localPath); - void showFileActivityDialog(const QString &objectName, const int objectId); + void showFileDetailsPage(const QString &fileLocalPath, const OCC::Systray::FileDetailsPage page); + void showFileDetails(AccountState *accountState, const QString &localPath, const OCC::Systray::FileDetailsPage fileDetailsPage); void sendChatMessage(const QString &token, const QString &message, const QString &replyTo); void showErrorMessageDialog(const QString &error); @@ -113,6 +110,18 @@ signals: void isOpenChanged(); public slots: + void setTrayEngine(QQmlApplicationEngine *trayEngine); + void create(); + + void showMessage(const QString &title, const QString &message, QSystemTrayIcon::MessageIcon icon = Information); + void showUpdateMessage(const QString &title, const QString &message, const QUrl &webUrl); + void showTalkMessage(const QString &title, const QString &message, const QString &replyTo, const QString &token, const AccountStatePtr &accountState); + void setToolTip(const QString &tip); + + void createCallDialog(const OCC::Activity &callNotification, const OCC::AccountStatePtr accountState); + void createEditFileLocallyLoadingDialog(const QString &fileName); + void destroyEditFileLocallyLoadingDialog(); + void slotCurrentUserChanged(); void forceWindowInit(QQuickWindow *window) const; @@ -124,34 +133,42 @@ public slots: // only for those managed by the C++ engine void destroyDialog(QQuickWindow *window) const; - void showWindow(WindowPosition position = WindowPosition::Default); + void showWindow(OCC::Systray::WindowPosition position = OCC::Systray::WindowPosition::Default); void hideWindow(); void setSyncIsPaused(const bool syncIsPaused); void setIsOpen(const bool isOpen); + void createShareDialog(const QString &localPath); + void createFileActivityDialog(const QString &localPath); + + void presentShareViewInTray(const QString &localPath); + private slots: void slotUnpauseAllFolders(); void slotPauseAllFolders(); private: + // Argument allows user to specify a specific dialog to be raised + bool raiseFileDetailDialogs(const QString &localPath = {}); void setPauseOnAllFoldersHelper(bool pause); static Systray *_instance; Systray(); void setupContextMenu(); - - QScreen *currentScreen() const; - QRect currentScreenRect() const; - QPoint computeWindowReferencePoint() const; - QPoint computeNotificationReferencePoint(int spacing = 20, NotificationPosition position = NotificationPosition::Default) const; - QPoint calcTrayIconCenter() const; - TaskBarPosition taskbarOrientation() const; - QRect taskbarGeometry() const; - QRect computeWindowRect(int spacing, const QPoint &topLeft, const QPoint &bottomRight) const; - QPoint computeWindowPosition(int width, int height) const; - QPoint computeNotificationPosition(int width, int height, int spacing = 20, NotificationPosition position = NotificationPosition::Default) const; + void createFileDetailsDialog(const QString &localPath); + + [[nodiscard]] QScreen *currentScreen() const; + [[nodiscard]] QRect currentScreenRect() const; + [[nodiscard]] QPoint computeWindowReferencePoint() const; + [[nodiscard]] QPoint computeNotificationReferencePoint(int spacing = 20, NotificationPosition position = NotificationPosition::Default) const; + [[nodiscard]] QPoint calcTrayIconCenter() const; + [[nodiscard]] TaskBarPosition taskbarOrientation() const; + [[nodiscard]] QRect taskbarGeometry() const; + [[nodiscard]] QRect computeWindowRect(int spacing, const QPoint &topLeft, const QPoint &bottomRight) const; + [[nodiscard]] QPoint computeWindowPosition(int width, int height) const; + [[nodiscard]] QPoint computeNotificationPosition(int width, int height, int spacing = 20, NotificationPosition position = NotificationPosition::Default) const; bool _isOpen = false; bool _syncIsPaused = true; @@ -162,8 +179,8 @@ private: AccessManagerFactory _accessManagerFactory; QSet _callsAlreadyNotified; - QPointer _editFileLocallyLoadingDialog; + QVector _fileDetailDialogs; }; } // namespace OCC diff --git a/src/gui/systray.mm b/src/gui/systray.mm index ddcd4f362..d9e5d03d0 100644 --- a/src/gui/systray.mm +++ b/src/gui/systray.mm @@ -1,5 +1,10 @@ #include "QtCore/qurl.h" +#include "account.h" +#include "accountstate.h" +#include "accountmanager.h" #include "config.h" +#include "systray.h" +#include "tray/talkreply.h" #include #include #include @@ -9,6 +14,58 @@ Q_LOGGING_CATEGORY(lcMacSystray, "nextcloud.gui.macsystray") +/************************* Private utility functions *************************/ + +namespace { + +void sendTalkReply(UNNotificationResponse *response, UNNotificationContent* content) +{ + if (!response || !content) { + qCWarning(lcMacSystray()) << "Invalid notification response or content." + << "Can't send talk reply."; + return; + } + + UNTextInputNotificationResponse *textInputResponse = (UNTextInputNotificationResponse*)response; + + if (!textInputResponse) { + qCWarning(lcMacSystray()) << "Notification response was not a text input response." + << "Can't send talk reply."; + return; + } + + NSString *reply = textInputResponse.userText; + NSString *token = [content.userInfo objectForKey:@"token"]; + NSString *account = [content.userInfo objectForKey:@"account"]; + NSString *replyTo = [content.userInfo objectForKey:@"replyTo"]; + + const auto qReply = QString::fromNSString(reply); + const auto qReplyTo = QString::fromNSString(replyTo); + const auto qToken = QString::fromNSString(token); + const auto qAccount = QString::fromNSString(account); + + const auto accountState = OCC::AccountManager::instance()->accountFromUserId(qAccount); + + if (!accountState) { + qCWarning(lcMacSystray()) << "Could not find account matching" << qAccount + << "Can't send talk reply."; + return; + } + + qCDebug(lcMacSystray()) << "Sending talk reply from macOS notification." + << "Reply is:" << qReply + << "Replying to:" << qReplyTo + << "Token:" << qToken + << "Account:" << qAccount; + + QPointer talkReply = new OCC::TalkReply(accountState.data(), OCC::Systray::instance()); + talkReply->sendReplyMessage(qToken, qReply, qReplyTo); +} + +} // anonymous namespace + +/**************************** Objective-C classes ****************************/ + @interface NotificationCenterDelegate : NSObject @end @implementation NotificationCenterDelegate @@ -34,23 +91,24 @@ Q_LOGGING_CATEGORY(lcMacSystray, "nextcloud.gui.macsystray") UNNotificationContent* content = response.notification.request.content; if ([content.categoryIdentifier isEqualToString:@"UPDATE"]) { - if ([response.actionIdentifier isEqualToString:@"DOWNLOAD_ACTION"] || [response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) - { + if ([response.actionIdentifier isEqualToString:@"DOWNLOAD_ACTION"] || [response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) { qCDebug(lcMacSystray()) << "Opening update download url in browser."; [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:[content.userInfo objectForKey:@"webUrl"]]]; } + } else if ([content.categoryIdentifier isEqualToString:@"TALK_MESSAGE"]) { + + if ([response.actionIdentifier isEqualToString:@"TALK_REPLY_ACTION"]) { + sendTalkReply(response, content); + } } completionHandler(); } @end -namespace OCC { +/********************* Methods accessible to C++ Systray *********************/ -enum MacNotificationAuthorizationOptions { - Default = 0, - Provisional -}; +namespace OCC { double menuBarThickness() { @@ -93,10 +151,24 @@ void registerNotificationCategories(const QString &localisedDownloadString) { intentIdentifiers:@[] options:UNNotificationCategoryOptionNone]; - [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:generalCategory, updateCategory, nil]]; + // Create the custom action for talk notifications + UNTextInputNotificationAction* talkReplyAction = [UNTextInputNotificationAction + actionWithIdentifier:@"TALK_REPLY_ACTION" + title:QObject::tr("Reply").toNSString() + options:UNNotificationActionOptionNone + textInputButtonTitle:QObject::tr("Reply").toNSString() + textInputPlaceholder:QObject::tr("Send a Nextcloud Talk reply").toNSString()]; + + UNNotificationCategory* talkReplyCategory = [UNNotificationCategory + categoryWithIdentifier:@"TALK_MESSAGE" + actions:@[talkReplyAction] + intentIdentifiers:@[] + options:UNNotificationCategoryOptionNone]; + + [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:generalCategory, updateCategory, talkReplyCategory, nil]]; } -void checkNotificationAuth(MacNotificationAuthorizationOptions additionalAuthOption = MacNotificationAuthorizationOptions::Provisional) +void checkNotificationAuth(MacNotificationAuthorizationOptions additionalAuthOption) { UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert + UNAuthorizationOptionSound; @@ -170,6 +242,30 @@ void sendOsXUpdateNotification(const QString &title, const QString &message, con [center addNotificationRequest:request withCompletionHandler:nil]; } +void sendOsXTalkNotification(const QString &title, const QString &message, const QString &token, const QString &replyTo, const AccountStatePtr accountState) +{ + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + checkNotificationAuth(); + + if (!accountState || !accountState->account()) { + sendOsXUserNotification(title, message); + return; + } + + NSString *accountNS = accountState->account()->displayName().toNSString(); + NSString *tokenNS = token.toNSString(); + NSString *replyToNS = replyTo.toNSString(); + + UNMutableNotificationContent* content = basicNotificationContent(title, message); + content.categoryIdentifier = @"TALK_MESSAGE"; + content.userInfo = [NSDictionary dictionaryWithObjects:@[accountNS, tokenNS, replyToNS] forKeys:@[@"account", @"token", @"replyTo"]]; + + UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats: NO]; + UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"NCTalkMessageNotification" content:content trigger:trigger]; + + [center addNotificationRequest:request withCompletionHandler:nil]; +} + void setTrayWindowLevelAndVisibleOnAllSpaces(QWindow *window) { NSView *nativeView = (NSView *)window->winId(); @@ -185,5 +281,4 @@ bool osXInDarkMode() return [osxMode containsString:@"Dark"]; } -} - +} // OCC namespace diff --git a/src/gui/tooltipupdater.cpp b/src/gui/tooltipupdater.cpp index 5b4233a01..12a6b25b3 100644 --- a/src/gui/tooltipupdater.cpp +++ b/src/gui/tooltipupdater.cpp @@ -32,7 +32,7 @@ ToolTipUpdater::ToolTipUpdater(QTreeView *treeView) bool ToolTipUpdater::eventFilter(QObject * /*obj*/, QEvent *ev) { if (ev->type() == QEvent::ToolTip) { - auto *helpEvent = static_cast(ev); + auto *helpEvent = dynamic_cast(ev); _toolTipPos = helpEvent->globalPos(); } return false; diff --git a/src/gui/tray/ActivityActionButton.qml b/src/gui/tray/ActivityActionButton.qml index a6b0d70da..250da5ab9 100644 --- a/src/gui/tray/ActivityActionButton.qml +++ b/src/gui/tray/ActivityActionButton.qml @@ -1,13 +1,11 @@ import QtQuick 2.15 import QtQuick.Controls 2.3 -import QtQuick.Layouts 1.15 import Style 1.0 import com.nextcloud.desktopclient 1.0 -Item { +AbstractButton { id: root - property string text: "" property string toolTipText: "" property bool primaryButton: false @@ -15,52 +13,67 @@ Item { property string imageSource: "" property string imageSourceHover: "" - property color textColor: Style.ncTextColor - property color textColorHovered: Style.ncSecondaryTextColor + property color adjustedHeaderColor: Style.adjustedCurrentUserHeaderColor + property color textColor: primaryButton ? adjustedHeaderColor : Style.ncTextColor + property color textColorHovered: primaryButton ? Style.currentUserHeaderTextColor : Style.ncTextColor - signal clicked() + property string verb: "" + property bool isTalkReplyButton: false - Loader { - active: !root.primaryButton + leftPadding: root.text === "" ? Style.smallSpacing : Style.standardSpacing + rightPadding: root.text === "" ? Style.smallSpacing : Style.standardSpacing - anchors.fill: parent - - sourceComponent: CustomTextButton { - anchors.fill: parent - text: root.text - toolTipText: root.toolTipText + background: NCButtonBackground { + color: Style.currentUserHeaderColor + hovered: root.hovered + visible: root.primaryButton + } - textColor: root.textColor - textColorHovered: root.textColorHovered + contentItem: Loader { + id: contentItemLoader + active: true + sourceComponent: root.primaryButton ? primaryButtonContent : textButtonContent + } - onClicked: root.clicked() + ToolTip { + id: customTextButtonTooltip + text: root.toolTipText + delay: Qt.styleHints.mousePressAndHoldInterval + visible: root.toolTipText !== "" && root.hovered + contentItem: EnforcedPlainTextLabel { + text: customTextButtonTooltip.text + color: Style.ncTextColor + } + background: Rectangle { + border.color: Style.menuBorder + color: Style.backgroundColor } } - Loader { - active: root.primaryButton - - anchors.fill: parent - - sourceComponent: CustomButton { + Component { + id: textButtonContent + TextButtonContents { anchors.fill: parent - anchors.topMargin: Style.roundedButtonBackgroundVerticalMargins - anchors.bottomMargin: Style.roundedButtonBackgroundVerticalMargins - + hovered: root.hovered text: root.text - toolTipText: root.toolTipText - textColor: root.textColor textColorHovered: root.textColorHovered bold: root.primaryButton + } + } - imageSource: root.imageSource + Component { + id: primaryButtonContent + NCButtonContents { + anchors.fill: parent + hovered: root.hovered imageSourceHover: root.imageSourceHover - - bgColor: UserModel.currentUser.headerColor - - onClicked: root.clicked() + imageSource: root.imageSource + text: root.text + textColor: root.textColor + textColorHovered: root.textColorHovered + font.bold: root.primaryButton } } } diff --git a/src/gui/tray/ActivityItem.qml b/src/gui/tray/ActivityItem.qml index 61414020f..e4705562f 100644 --- a/src/gui/tray/ActivityItem.qml +++ b/src/gui/tray/ActivityItem.qml @@ -5,52 +5,37 @@ import QtQuick.Layouts 1.15 import Style 1.0 import com.nextcloud.desktopclient 1.0 -MouseArea { +ItemDelegate { id: root property Flickable flickable + property int iconSize: Style.trayListItemIconSize + property bool isFileActivityList: false readonly property bool isChatActivity: model.objectType === "chat" || model.objectType === "room" || model.objectType === "call" readonly property bool isTalkReplyPossible: model.conversationToken !== "" property bool isTalkReplyOptionVisible: model.messageSent !== "" - property color adjustedHeaderColor: Theme.darkMode ? Qt.lighter(UserModel.currentUser.headerColor, 2) - : Qt.darker(UserModel.currentUser.headerColor, 1.5) - - enabled: (model.path !== "" || model.link !== "" || model.links.length > 0 || model.isCurrentUserFileActivity === true) - hoverEnabled: true - - // We center the children vertically in the middle of this MouseArea to create the padding. - height: contentLayout.implicitHeight + (Style.standardSpacing * 2) + enabled: (model.path !== "" || model.link !== "" || model.links.length > 0 || model.isCurrentUserFileActivity === true) + padding: Style.standardSpacing Accessible.role: Accessible.ListItem Accessible.name: (model.path !== "" && model.displayPath !== "") ? qsTr("Open %1 locally").arg(model.displayPath) : model.message Accessible.onPressAction: root.clicked() - function toggleReplyOptions() { - isTalkReplyOptionVisible = !isTalkReplyOptionVisible - } - - Rectangle { - id: activityHover - anchors.fill: parent - color: (parent.containsMouse ? Style.lightHover : "transparent") - } - NCToolTip { - visible: root.containsMouse && !activityContent.childHovered && model.displayLocation !== "" + visible: root.hovered && !activityContent.childHovered && model.displayLocation !== "" text: qsTr("In %1").arg(model.displayLocation) } - ColumnLayout { + contentItem: ColumnLayout { id: contentLayout anchors.left: root.left anchors.right: root.right anchors.rightMargin: Style.standardSpacing anchors.leftMargin: Style.standardSpacing - anchors.verticalCenter: parent.verticalCenter spacing: Style.activityContentSpace @@ -60,15 +45,13 @@ MouseArea { Layout.fillWidth: true Layout.minimumHeight: Style.minActivityHeight - showDismissButton: model.links.length > 0 - - activityData: model + showDismissButton: model.isDismissable - adjustedHeaderColor: root.adjustedHeaderColor + iconSize: root.iconSize - onShareButtonClicked: Systray.openShareDialog(model.displayPath, model.path) + activityData: model - onDismissButtonClicked: activityModel.slotTriggerDismiss(model.index) + onDismissButtonClicked: activityModel.slotTriggerDismiss(model.activityIndex) } Loader { @@ -82,7 +65,7 @@ MouseArea { sourceComponent: TalkReplyTextField { onSendReply: { - UserModel.currentUser.sendReplyMessage(model.index, model.conversationToken, reply, model.messageId); + UserModel.currentUser.sendReplyMessage(model.activityIndex, model.conversationToken, reply, model.messageId); talkReplyTextFieldLoader.visible = false; } } @@ -95,22 +78,20 @@ MouseArea { Layout.fillWidth: true Layout.leftMargin: Style.trayListItemIconSize + activityContent.spacing - Layout.minimumHeight: Style.minActivityHeight + Layout.preferredHeight: Style.standardPrimaryButtonHeight displayActions: model.displayActions objectType: model.objectType linksForActionButtons: model.linksForActionButtons linksContextMenu: model.linksContextMenu - moreActionsButtonColor: activityHover.color maxActionButtons: activityModel.maxActionButtons flickable: root.flickable - adjustedHeaderColor: root.adjustedHeaderColor + onTriggerAction: activityModel.slotTriggerAction(model.activityIndex, actionIndex) - onTriggerAction: activityModel.slotTriggerAction(model.index, actionIndex) - onShowReplyField: root.toggleReplyOptions() + onShowReplyField: root.isTalkReplyOptionVisible = true } } } diff --git a/src/gui/tray/ActivityItemActions.qml b/src/gui/tray/ActivityItemActions.qml index 130a51566..908aab9d6 100644 --- a/src/gui/tray/ActivityItemActions.qml +++ b/src/gui/tray/ActivityItemActions.qml @@ -16,7 +16,6 @@ RowLayout { property bool displayActions: false property color moreActionsButtonColor: "transparent" - property color adjustedHeaderColor: "transparent" property int maxActionButtons: 0 @@ -33,25 +32,22 @@ RowLayout { ActivityActionButton { id: activityActionButton - readonly property string verb: model.modelData.verb - readonly property bool primary: (model.index === 0 && verb !== "DELETE") || model.modelData.primary - readonly property bool isTalkReplyButton: verb === "REPLY" + Layout.minimumWidth: primaryButton ? Style.activityItemActionPrimaryButtonMinWidth : Style.activityItemActionSecondaryButtonMinWidth + Layout.preferredHeight: parent.height + Layout.preferredWidth: primaryButton ? -1 : parent.height - Layout.minimumWidth: primary ? Style.activityItemActionPrimaryButtonMinWidth : Style.activityItemActionSecondaryButtonMinWidth - Layout.preferredHeight: primary ? parent.height : parent.height * 0.3 - Layout.preferredWidth: primary ? -1 : parent.height + verb: model.modelData.verb + primaryButton: (model.index === 0 && verb !== "DELETE") || model.modelData.primary + isTalkReplyButton: verb === "REPLY" text: model.modelData.label - imageSource: model.modelData.imageSource ? model.modelData.imageSource + root.adjustedHeaderColor : "" - imageSourceHover: model.modelData.imageSourceHovered ? model.modelData.imageSourceHovered + UserModel.currentUser.headerTextColor : "" + adjustedHeaderColor: Style.adjustedCurrentUserHeaderColor - textColor: primary ? root.adjustedHeaderColor : Style.ncTextColor - textColorHovered: primary ? UserModel.currentUser.headerTextColor : Style.ncTextColor + imageSource: model.modelData.imageSource ? model.modelData.imageSource + Style.adjustedCurrentUserHeaderColor : "" + imageSourceHover: model.modelData.imageSourceHovered ? model.modelData.imageSourceHovered + Style.currentUserHeaderTextColor : "" - primaryButton: primary - - onClicked: !isTalkReplyButton ? root.triggerAction(model.index) : root.showReplyField() + onClicked: isTalkReplyButton ? root.showReplyField() : root.triggerAction(model.index) } } @@ -93,17 +89,6 @@ RowLayout { moreActionsButtonContextMenu.close(); } } - - ActivityItemContextMenu { - id: moreActionsButtonContextMenu - - maxActionButtons: root.maxActionButtons - linksContextMenu: root.linksContextMenu - - onMenuEntryTriggered: function(entryIndex) { - root.triggerAction(entryIndex) - } - } } } } diff --git a/src/gui/tray/ActivityItemContent.qml b/src/gui/tray/ActivityItemContent.qml index 86c01cfb3..88caedaea 100644 --- a/src/gui/tray/ActivityItemContent.qml +++ b/src/gui/tray/ActivityItemContent.qml @@ -15,20 +15,19 @@ RowLayout { property bool showDismissButton: false - property bool childHovered: shareButton.hovered || dismissActionButton.hovered + property bool childHovered: fileDetailsButton.hovered || dismissActionButton.hovered - property color adjustedHeaderColor: "transparent" + property int iconSize: Style.trayListItemIconSize signal dismissButtonClicked() - signal shareButtonClicked() spacing: Style.trayHorizontalMargin Item { id: thumbnailItem Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - Layout.preferredWidth: Style.trayListItemIconSize - Layout.preferredHeight: model.thumbnail && model.thumbnail.isMimeTypeIcon ? Style.trayListItemIconSize * 0.9 : Style.trayListItemIconSize + Layout.preferredWidth: root.iconSize + Layout.preferredHeight: model.thumbnail && model.thumbnail.isMimeTypeIcon ? root.iconSize * 0.9 : root.iconSize readonly property int imageWidth: width * (1 - Style.thumbnailImageSizeReduction) readonly property int imageHeight: height * (1 - Style.thumbnailImageSizeReduction) readonly property int thumbnailRadius: model.thumbnail && model.thumbnail.isUserAvatar ? width / 2 : 3 @@ -182,7 +181,7 @@ RowLayout { Layout.preferredWidth: Style.trayListItemIconSize Layout.preferredHeight: Style.trayListItemIconSize - visible: root.showDismissButton && !shareButton.visible + visible: root.showDismissButton && !fileDetailsButton.visible imageSource: "image://svgimage-custom-color/clear.svg" + "/" + Style.ncTextColor imageSourceHover: "image://svgimage-custom-color/clear.svg" + "/" + UserModel.currentUser.headerTextColor @@ -195,20 +194,18 @@ RowLayout { } CustomButton { - id: shareButton + id: fileDetailsButton Layout.preferredWidth: Style.trayListItemIconSize Layout.preferredHeight: Style.trayListItemIconSize - visible: root.activityData.isShareable - - imageSource: "image://svgimage-custom-color/share.svg" + "/" + root.adjustedHeaderColor - imageSourceHover: "image://svgimage-custom-color/share.svg" + "/" + UserModel.currentUser.headerTextColor - - toolTipText: qsTr("Open share dialog") + imageSource: "image://svgimage-custom-color/more.svg" + "/" + Style.adjustedCurrentUserHeaderColor + imageSourceHover: "image://svgimage-custom-color/more.svg" + "/" + Style.currentUserHeaderTextColor + toolTipText: qsTr("Open file details") + bgColor: Style.currentUserHeaderColor - bgColor: UserModel.currentUser.headerColor + visible: model.showFileDetails - onClicked: root.shareButtonClicked() + onClicked: Systray.presentShareViewInTray(model.openablePath) } } diff --git a/src/gui/tray/ActivityList.qml b/src/gui/tray/ActivityList.qml index f3a6416c2..995d225b2 100644 --- a/src/gui/tray/ActivityList.qml +++ b/src/gui/tray/ActivityList.qml @@ -1,19 +1,24 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 +import Style 1.0 import com.nextcloud.desktopclient 1.0 as NC +import Style 1.0 ScrollView { id: controlRoot - property alias model: activityList.model + property alias model: sortedActivityList.activityListModel property bool isFileActivityList: false + property int iconSize: Style.trayListItemIconSize + property int delegateHorizontalPadding: 0 signal openFile(string filePath) signal activityItemClicked(int index) contentWidth: availableWidth padding: 1 + focus: false ScrollBar.horizontal.policy: ScrollBar.AlwaysOff @@ -24,26 +29,93 @@ ScrollView { ListView { id: activityList - keyNavigationEnabled: true - Accessible.role: Accessible.List Accessible.name: qsTr("Activity list") clip: true - spacing: 0 + currentIndex: -1 + interactive: true + + highlight: Rectangle { + id: activityHover + + anchors.fill: activityList.currentItem + + color: Style.lightHover + visible: activityList.activeFocus + } + highlightFollowsCurrentItem: true + highlightMoveDuration: 0 + highlightResizeDuration: 0 + highlightRangeMode: ListView.ApplyRange + preferredHighlightBegin: 0 + preferredHighlightEnd: controlRoot.height + + model: NC.SortedActivityListModel { + id: sortedActivityList + activityListModel: controlRoot.model + } delegate: ActivityItem { + anchors.left: if (parent) parent.left + anchors.right: if (parent) parent.right + anchors.leftMargin: controlRoot.delegateHorizontalPadding + anchors.rightMargin: controlRoot.delegateHorizontalPadding + isFileActivityList: controlRoot.isFileActivityList - width: activityList.contentWidth + iconSize: controlRoot.iconSize flickable: activityList + onHoveredChanged: if (hovered) { + // When we set the currentIndex the list view will scroll... + // unless we tamper with the preferred highlight points to stop this. + const savedPreferredHighlightBegin = activityList.preferredHighlightBegin; + const savedPreferredHighlightEnd = activityList.preferredHighlightEnd; + // Set overkill values to make sure no scroll happens when we hover with mouse + activityList.preferredHighlightBegin = -controlRoot.height; + activityList.preferredHighlightEnd = controlRoot.height * 2; + + activityList.currentIndex = index + + // Reset original values so keyboard navigation makes list view scroll + activityList.preferredHighlightBegin = savedPreferredHighlightBegin; + activityList.preferredHighlightEnd = savedPreferredHighlightEnd; + + forceActiveFocus(); + } onClicked: { if (model.isCurrentUserFileActivity && model.openablePath) { openFile("file://" + model.openablePath); } else { - activityItemClicked(model.index) + activityItemClicked(model.activityIndex) } } } + + Column { + id: placeholderColumn + width: parent.width * 0.8 + anchors.centerIn: parent + visible: activityList.count === 0 + spacing: Style.standardSpacing + + Image { + width: parent.width + verticalAlignment: Image.AlignVCenter + horizontalAlignment: Image.AlignHCenter + fillMode: Image.PreserveAspectFit + source: "image://svgimage-custom-color/activity.svg/" + Style.ncSecondaryTextColor + } + + EnforcedPlainTextLabel { + width: parent.width + text: qsTr("No activities yet") + color: Style.ncSecondaryTextColor + font.bold: true + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + } } } diff --git a/src/gui/tray/CallNotificationDialog.qml b/src/gui/tray/CallNotificationDialog.qml index 027c9a03b..e9402c11c 100644 --- a/src/gui/tray/CallNotificationDialog.qml +++ b/src/gui/tray/CallNotificationDialog.qml @@ -219,7 +219,7 @@ Window { visible: isAnswerCallButton text: modelData.label - bold: true + contentsFont.bold: true bgColor: Style.ncBlue bgNormalOpacity: 0.8 @@ -246,7 +246,7 @@ Window { CustomButton { id: declineCall text: qsTr("Decline") - bold: true + contentsFont.bold: true bgColor: Style.errorBoxBackgroundColor bgNormalOpacity: 0.8 diff --git a/src/gui/tray/CustomButton.qml b/src/gui/tray/CustomButton.qml index e9263a04b..c21ab16eb 100644 --- a/src/gui/tray/CustomButton.qml +++ b/src/gui/tray/CustomButton.qml @@ -7,65 +7,43 @@ Button { id: root property string imageSource: "" - property string imageSourceHover: "" - property Image iconItem: icon + property string imageSourceHover: imageSource + property var iconItem: icon property string toolTipText: "" property color textColor: Style.ncTextColor property color textColorHovered: textColor - property alias bgColor: bgRectangle.color - - property bool bold: false + property alias contentsFont: contents.font + property alias bgColor: bgRectangle.color + property alias bgNormalColor: bgRectangle.normalColor + property alias bgHoverColor: bgRectangle.hoverColor property alias bgNormalOpacity: bgRectangle.normalOpacity property alias bgHoverOpacity: bgRectangle.hoverOpacity - background: Rectangle { + background: NCButtonBackground { id: bgRectangle - - property real normalOpacity: 0.3 - property real hoverOpacity: 1.0 - - color: "transparent" - opacity: parent.hovered ? hoverOpacity : normalOpacity - radius: width / 2 + hovered: root.hovered } - leftPadding: root.text === "" ? 5 : 10 - rightPadding: root.text === "" ? 5 : 10 + leftPadding: root.text === "" ? Style.smallSpacing : Style.standardSpacing + rightPadding: root.text === "" ? Style.smallSpacing : Style.standardSpacing + implicitWidth: contentItem.implicitWidth + leftPadding + rightPadding NCToolTip { text: root.toolTipText visible: root.toolTipText !== "" && root.hovered } - contentItem: RowLayout { - Image { - id: icon - - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - - source: root.hovered ? root.imageSourceHover : root.imageSource - fillMode: Image.PreserveAspectFit - } - - EnforcedPlainTextLabel { - Layout.maximumWidth: icon.width > 0 ? parent.width - icon.width - parent.spacing : parent.width - Layout.fillWidth: icon.status !== Image.Ready - - text: root.text - font.bold: root.bold - - visible: root.text !== "" - - color: root.hovered ? root.textColorHovered : root.textColor - - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - - elide: Text.ElideRight - } + contentItem: NCButtonContents { + id: contents + hovered: root.hovered + imageSourceHover: root.imageSourceHover + imageSource: root.imageSource + text: root.text + textColor: root.textColor + textColorHovered: root.textColorHovered } } diff --git a/src/gui/tray/CustomTextButton.qml b/src/gui/tray/CustomTextButton.qml deleted file mode 100644 index 6deb3bd27..000000000 --- a/src/gui/tray/CustomTextButton.qml +++ /dev/null @@ -1,48 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.3 -import Style 1.0 - -EnforcedPlainTextLabel { - id: root - - property string toolTipText: "" - property Action action: null - property alias acceptedButtons: mouseArea.acceptedButtons - property bool hovered: mouseArea.containsMouse - - height: implicitHeight - - property color textColor: Style.ncTextColor - property color textColorHovered: Style.ncSecondaryTextColor - - Accessible.role: Accessible.Button - Accessible.name: text - Accessible.onPressAction: root.clicked(null) - - text: action ? action.text : "" - enabled: !action || action.enabled - onClicked: if (action) action.trigger() - - font.underline: true - color: root.hovered ? root.textColorHovered : root.textColor - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - - signal pressed(QtObject mouse) - signal clicked(QtObject mouse) - - NCToolTip { - text: root.toolTipText - visible: root.toolTipText !== "" && root.hovered - } - - MouseArea { - id: mouseArea - anchors.fill: parent - hoverEnabled: true - - onClicked: root.clicked(mouse) - onPressed: root.pressed(mouse) - } -} diff --git a/src/gui/tray/FileActivityDialog.qml b/src/gui/tray/FileActivityDialog.qml deleted file mode 100644 index 1d75ff222..000000000 --- a/src/gui/tray/FileActivityDialog.qml +++ /dev/null @@ -1,40 +0,0 @@ -import QtQml 2.15 -import QtQuick 2.15 -import QtQuick.Window 2.15 - -import Style 1.0 -import com.nextcloud.desktopclient 1.0 as NC - -Window { - id: dialog - - property alias model: activityModel - - NC.FileActivityListModel { - id: activityModel - } - - width: 500 - height: 500 - - Rectangle { - id: background - anchors.fill: parent - color: Style.backgroundColor - } - - ActivityList { - isFileActivityList: true - anchors.fill: parent - model: dialog.model - } - - Component.onCompleted: { - dialog.show(); - dialog.raise(); - dialog.requestActivate(); - - Systray.forceWindowInit(dialog); - Systray.positionWindowAtScreenCenter(dialog); - } -} diff --git a/src/gui/tray/HeaderButton.qml b/src/gui/tray/HeaderButton.qml index c10118877..f2528c10b 100644 --- a/src/gui/tray/HeaderButton.qml +++ b/src/gui/tray/HeaderButton.qml @@ -26,7 +26,7 @@ Button { Layout.preferredHeight: Style.trayWindowHeaderHeight background: Rectangle { - color: root.hovered || root.visualFocus ? UserModel.currentUser.headerTextColor : "transparent" + color: root.hovered || root.visualFocus ? Style.currentUserHeaderTextColor : "transparent" opacity: 0.2 } } diff --git a/src/gui/tray/NCButtonBackground.qml b/src/gui/tray/NCButtonBackground.qml new file mode 100644 index 000000000..3e960a611 --- /dev/null +++ b/src/gui/tray/NCButtonBackground.qml @@ -0,0 +1,29 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 + +import Style 1.0 + +Rectangle { + property bool hovered: false + property real normalOpacity: 0.3 + property real hoverOpacity: 1.0 + property color normalColor: Style.buttonBackgroundColor + property color hoverColor: Style.buttonBackgroundColor + + color: hovered ? hoverColor : normalColor + opacity: hovered ? hoverOpacity : normalOpacity + radius: width / 2 +} diff --git a/src/gui/tray/NCButtonContents.qml b/src/gui/tray/NCButtonContents.qml new file mode 100644 index 000000000..c9148a17e --- /dev/null +++ b/src/gui/tray/NCButtonContents.qml @@ -0,0 +1,61 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import Style 1.0 + +RowLayout { + id: root + + property bool hovered: false + property string imageSourceHover: "" + property string imageSource: "" + property string text: "" + + property color textColor: Style.ncTextColor + property color textColorHovered: textColor + property alias font: buttonLabel.font + + Image { + id: icon + + Layout.fillWidth: !buttonLabel.visible + + source: root.hovered ? root.imageSourceHover : root.imageSource + fillMode: Image.PreserveAspectFit + horizontalAlignment: Image.AlignHCenter + verticalAlignment: Image.AlignVCenter + visible: root.hovered ? root.imageSourceHover !== "" : root.imageSource !== "" + } + + EnforcedPlainTextLabel { + id: buttonLabel + + Layout.fillWidth: true + + text: root.text + + visible: root.text !== "" + + color: root.hovered ? root.textColorHovered : root.textColor + + horizontalAlignment: icon.visible ? Text.AlignLeft : Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + elide: Text.ElideRight + } +} diff --git a/src/gui/tray/SyncStatus.qml b/src/gui/tray/SyncStatus.qml index e582af905..b0828f195 100644 --- a/src/gui/tray/SyncStatus.qml +++ b/src/gui/tray/SyncStatus.qml @@ -7,7 +7,7 @@ import Style 1.0 import com.nextcloud.desktopclient 1.0 as NC RowLayout { - id: layout + id: root property alias model: syncStatus @@ -49,7 +49,7 @@ RowLayout { EnforcedPlainTextLabel { id: syncProgressText - + Layout.fillWidth: true text: syncStatus.syncStatusString @@ -64,7 +64,7 @@ RowLayout { active: syncStatus.syncing visible: syncStatus.syncing - + sourceComponent: ProgressBar { id: syncProgressBar @@ -98,4 +98,33 @@ RowLayout { font.pixelSize: Style.subLinePixelSize } } + + CustomButton { + FontMetrics { + id: syncNowFm + font: parent.contentsFont + } + + Layout.preferredWidth: syncNowFm.boundingRect(text).width + + leftPadding + + rightPadding + + Style.standardSpacing * 2 + Layout.rightMargin: Style.trayHorizontalMargin + + text: qsTr("Sync now") + textColor: Style.adjustedCurrentUserHeaderColor + textColorHovered: Style.currentUserHeaderTextColor + contentsFont.bold: true + bgColor: Style.currentUserHeaderColor + + visible: !syncStatus.syncing && + NC.UserModel.currentUser.hasLocalFolder && + NC.UserModel.currentUser.isConnected + enabled: visible + onClicked: { + if(!syncStatus.syncing) { + NC.UserModel.currentUser.forceSyncNow(); + } + } + } } diff --git a/src/gui/tray/TextButtonContents.qml b/src/gui/tray/TextButtonContents.qml new file mode 100644 index 000000000..031da73c0 --- /dev/null +++ b/src/gui/tray/TextButtonContents.qml @@ -0,0 +1,36 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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. + */ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import Style 1.0 + +EnforcedPlainTextLabel { + property bool hovered: false + property color textColor: Style.ncTextColor + property color textColorHovered: Style.ncSecondaryTextColor + property bool bold: false + + font.underline: true + font.bold: bold + color: hovered ? textColorHovered : textColor + + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + elide: Text.ElideRight +} + diff --git a/src/gui/tray/UnifiedSearchResultListItem.qml b/src/gui/tray/UnifiedSearchResultListItem.qml index 9606a9ed4..be622fbaa 100644 --- a/src/gui/tray/UnifiedSearchResultListItem.qml +++ b/src/gui/tray/UnifiedSearchResultListItem.qml @@ -19,7 +19,7 @@ MouseArea { property var fetchMoreTriggerClicked: function(){} property var resultClicked: function(){} - enabled: !isFetchMoreTrigger || !isSearchInProgress + enabled: !isSearchInProgress hoverEnabled: enabled height: Style.unifiedSearchItemHeight diff --git a/src/gui/tray/Window.qml b/src/gui/tray/Window.qml index 490900c9c..356479f30 100644 --- a/src/gui/tray/Window.qml +++ b/src/gui/tray/Window.qml @@ -4,7 +4,9 @@ import QtQuick.Controls 2.3 import QtQuick.Layouts 1.2 import QtGraphicalEffects 1.0 import Qt.labs.platform 1.1 as NativeDialogs + import "../" +import "../filedetails/" // Custom qml modules are in /theme (and included by resources.qrc) import Style 1.0 @@ -21,16 +23,8 @@ ApplicationWindow { color: "transparent" flags: Systray.useNormalWindow ? Qt.Window : Qt.Dialog | Qt.FramelessWindowHint - property int fileActivityDialogObjectId: -1 - readonly property int maxMenuHeight: Style.trayWindowHeight - Style.trayWindowHeaderHeight - 2 * Style.trayWindowBorderWidth - function openFileActivityDialog(objectName, objectId) { - fileActivityDialogLoader.objectName = objectName; - fileActivityDialogLoader.objectId = objectId; - fileActivityDialogLoader.refresh(); - } - Component.onCompleted: Systray.forceWindowInit(trayWindow) // Close tray window when focus is lost (e.g. click somewhere else on the screen) @@ -84,6 +78,7 @@ ApplicationWindow { function onIsOpenChanged() { userStatusDrawer.close() + fileDetailsDrawer.close(); if(Systray.isOpen) { accountMenu.close(); @@ -91,19 +86,20 @@ ApplicationWindow { } } - function onShowFileActivityDialog(objectName, objectId) { - openFileActivityDialog(objectName, objectId) - } - function onShowErrorMessageDialog(error) { var newErrorDialog = errorMessageDialog.createObject(trayWindow) newErrorDialog.text = error newErrorDialog.open() } + + function onShowFileDetails(accountState, localPath, fileDetailsPage) { + fileDetailsDrawer.openFileDetails(accountState, localPath, fileDetailsPage); + } } OpacityMask { anchors.fill: parent + anchors.margins: Style.trayWindowBorderWidth source: ShaderEffectSource { sourceItem: trayWindowMainItem hideSource: true @@ -151,6 +147,64 @@ ApplicationWindow { } } + Drawer { + id: fileDetailsDrawer + width: parent.width - Style.trayDrawerMargin + height: parent.height + padding: 0 + edge: Qt.RightEdge + modal: true + visible: false + clip: true + + background: Rectangle { + radius: Systray.useNormalWindow ? 0.0 : Style.trayWindowRadius + border.width: Style.trayWindowBorderWidth + border.color: Style.menuBorder + color: Style.backgroundColor + } + + property var folderAccountState: ({}) + property string fileLocalPath: "" + property var pageToShow: Systray.FileDetailsPage.Activity + + function openFileDetails(accountState, localPath, fileDetailsPage) { + console.log(`About to show file details view in tray for ${localPath}`); + folderAccountState = accountState; + fileLocalPath = localPath; + pageToShow = fileDetailsPage; + + if(!opened) { + open(); + } + } + + Loader { + id: fileDetailsContents + anchors.fill: parent + active: fileDetailsDrawer.visible + onActiveChanged: { + if (active) { + Systray.showFileDetailsPage(fileDetailsDrawer.fileLocalPath, + fileDetailsDrawer.pageToShow); + } + } + sourceComponent: FileDetailsView { + id: fileDetails + + width: parent.width + height: parent.height + + backgroundsVisible: false + accountState: fileDetailsDrawer.folderAccountState + localPath: fileDetailsDrawer.fileLocalPath + showCloseButton: true + + onCloseButtonClicked: fileDetailsDrawer.close() + } + } + } + Item { id: trayWindowMainItem @@ -159,7 +213,8 @@ ApplicationWindow { || unifiedSearchResultsErrorLabel.visible || unifiedSearchResultsListView.visible - anchors.fill: parent + anchors.fill: parent + anchors.margins: Style.trayWindowBorderWidth clip: true Accessible.role: Accessible.Grouping @@ -172,7 +227,7 @@ ApplicationWindow { anchors.right: trayWindowMainItem.right anchors.top: trayWindowMainItem.top height: Style.trayWindowHeaderHeight - color: UserModel.currentUser.headerColor + color: Style.currentUserHeaderColor RowLayout { id: trayWindowHeaderLayout @@ -383,7 +438,7 @@ ApplicationWindow { } background: Rectangle { - color: parent.hovered || parent.visualFocus ? UserModel.currentUser.headerTextColor : "transparent" + color: parent.hovered || parent.visualFocus ? Style.currentUserHeaderTextColor : "transparent" opacity: 0.2 } @@ -415,7 +470,7 @@ ApplicationWindow { height: width anchors.bottom: currentAccountAvatar.bottom anchors.right: currentAccountAvatar.right - color: UserModel.currentUser.headerColor + color: Style.currentUserHeaderColor radius: width*0.5 } @@ -427,7 +482,7 @@ ApplicationWindow { height: width anchors.bottom: currentAccountAvatar.bottom anchors.right: currentAccountAvatar.right - color: currentAccountButton.hovered ? UserModel.currentUser.headerTextColor : "transparent" + color: currentAccountButton.hovered ? Style.currentUserHeaderTextColor : "transparent" opacity: 0.2 radius: width*0.5 } @@ -462,7 +517,7 @@ ApplicationWindow { width: Style.currentAccountLabelWidth text: UserModel.currentUser.name elide: Text.ElideRight - color: UserModel.currentUser.headerTextColor + color: Style.currentUserHeaderTextColor font.pixelSize: Style.topLinePixelSize font.bold: true @@ -491,7 +546,7 @@ ApplicationWindow { ? UserModel.currentUser.statusMessage : UserModel.currentUser.server elide: Text.ElideRight - color: UserModel.currentUser.headerTextColor + color: Style.currentUserHeaderTextColor font.pixelSize: Style.subLinePixelSize } } @@ -499,7 +554,7 @@ ApplicationWindow { ColorOverlay { cached: true - color: UserModel.currentUser.headerTextColor + color: Style.currentUserHeaderTextColor width: source.width height: source.height source: Image { @@ -535,7 +590,7 @@ ApplicationWindow { id: openLocalFolderButton visible: UserModel.currentUser.hasLocalFolder icon.source: "qrc:///client/theme/white/folder.svg" - icon.color: UserModel.currentUser.headerTextColor + icon.color: Style.currentUserHeaderTextColor onClicked: UserModel.openCurrentAccountLocalFolder() Image { @@ -560,7 +615,7 @@ ApplicationWindow { width: Style.folderStateIndicatorSize + 2 height: width anchors.centerIn: parent - color: UserModel.currentUser.headerColor + color: Style.currentUserHeaderColor radius: width*0.5 z: -2 } @@ -570,7 +625,7 @@ ApplicationWindow { width: Style.folderStateIndicatorSize + 2 height: width anchors.centerIn: parent - color: openLocalFolderButton.hovered ? UserModel.currentUser.headerTextColor : "transparent" + color: openLocalFolderButton.hovered ? Style.currentUserHeaderTextColor : "transparent" opacity: 0.2 radius: width*0.5 z: -1 @@ -584,7 +639,7 @@ ApplicationWindow { visible: UserModel.currentUser.serverHasTalk icon.source: "qrc:///client/theme/white/talk-app.svg" - icon.color: UserModel.currentUser.headerTextColor + icon.color: Style.currentUserHeaderTextColor onClicked: UserModel.openCurrentAccountTalk() Accessible.role: Accessible.Button @@ -595,7 +650,7 @@ ApplicationWindow { HeaderButton { id: trayWindowAppsButton icon.source: "qrc:///client/theme/white/more-apps.svg" - icon.color: UserModel.currentUser.headerTextColor + icon.color: Style.currentUserHeaderTextColor onClicked: { if(appsMenuListView.count <= 0) { @@ -706,7 +761,7 @@ ApplicationWindow { UnifiedSearchResultNothingFound { id: unifiedSearchResultNothingFound - visible: false + anchors.top: trayWindowUnifiedSearchInputContainer.bottom anchors.left: trayWindowMainItem.left anchors.right: trayWindowMainItem.right @@ -715,28 +770,11 @@ ApplicationWindow { text: UserModel.currentUser.unifiedSearchResultsListModel.searchTerm property bool isSearchRunning: UserModel.currentUser.unifiedSearchResultsListModel.isSearchInProgress + property bool waitingForSearchTermEditEnd: UserModel.currentUser.unifiedSearchResultsListModel.waitingForSearchTermEditEnd property bool isSearchResultsEmpty: unifiedSearchResultsListView.count === 0 property bool nothingFound: text && isSearchResultsEmpty && !UserModel.currentUser.unifiedSearchResultsListModel.errorString - onIsSearchRunningChanged: { - if (unifiedSearchResultNothingFound.isSearchRunning) { - visible = false; - } else { - if (nothingFound) { - visible = true; - } - } - } - - onTextChanged: { - visible = false; - } - - onIsSearchResultsEmptyChanged: { - if (!unifiedSearchResultNothingFound.isSearchResultsEmpty) { - visible = false; - } - } + visible: !isSearchRunning && !waitingForSearchTermEditEnd && nothingFound } Loader { @@ -762,7 +800,6 @@ ApplicationWindow { ScrollView { id: controlRoot - padding: 1 contentWidth: availableWidth ScrollBar.horizontal.policy: ScrollBar.AlwaysOff @@ -833,26 +870,5 @@ ApplicationWindow { model.slotTriggerDefaultAction(index) } } - - Loader { - id: fileActivityDialogLoader - - property string objectName: "" - property int objectId: -1 - - function refresh() { - active = true - item.model.load(activityModel.accountState, objectId) - item.show() - } - - active: false - sourceComponent: FileActivityDialog { - title: qsTr("%1 - File activity").arg(fileActivityDialogLoader.objectName) - onClosing: fileActivityDialogLoader.active = false - } - - onLoaded: refresh() - } } // Item trayWindowMainItem } diff --git a/src/gui/tray/activitydata.cpp b/src/gui/tray/activitydata.cpp index 0875ee463..268874c84 100644 --- a/src/gui/tray/activitydata.cpp +++ b/src/gui/tray/activitydata.cpp @@ -17,6 +17,26 @@ #include "activitydata.h" #include "folderman.h" +namespace { +QUrl stringToUrl(const QUrl &accountUrl, const QString &link) { + auto url = QUrl::fromUserInput(link); + + if (!url.isValid()) { + return {}; + } + + if (url.host().isEmpty()) { + url.setScheme(accountUrl.scheme()); + url.setHost(accountUrl.host()); + } + + if (url.port() == -1) { + url.setPort(accountUrl.port()); + } + + return url; +}; +} namespace OCC { @@ -25,11 +45,21 @@ bool operator<(const Activity &rhs, const Activity &lhs) return rhs._dateTime > lhs._dateTime; } +bool operator>(const Activity &rhs, const Activity &lhs) +{ + return rhs._dateTime < lhs._dateTime; +} + bool operator==(const Activity &rhs, const Activity &lhs) { return (rhs._type == lhs._type && rhs._id == lhs._id && rhs._accName == lhs._accName); } +bool operator!=(const Activity &rhs, const Activity &lhs) +{ + return !(rhs == lhs); +} + Activity::Identifier Activity::ident() const { return Identifier(_id, _accName); @@ -61,7 +91,7 @@ OCC::Activity Activity::fromActivityJson(const QJsonObject &json, const AccountP activity._subject = json.value(QStringLiteral("subject")).toString(); activity._message = json.value(QStringLiteral("message")).toString(); activity._file = json.value(QStringLiteral("object_name")).toString(); - activity._link = QUrl(json.value(QStringLiteral("link")).toString()); + activity._link = stringToUrl(account->url(), json.value(QStringLiteral("link")).toString()); activity._dateTime = QDateTime::fromString(json.value(QStringLiteral("datetime")).toString(), Qt::ISODate); activity._icon = json.value(QStringLiteral("icon")).toString(); activity._isCurrentUserFileActivity = activity._objectType == QStringLiteral("files") && activityUser == account->davUser(); @@ -78,13 +108,18 @@ OCC::Activity Activity::fromActivityJson(const QJsonObject &json, const AccountP for (auto i = parameters.begin(); i != parameters.end(); ++i) { const auto parameterJsonObject = i.value().toObject(); + const auto richParamLink = stringToUrl(account->url(), parameterJsonObject.value(QStringLiteral("link")).toString()); activity._subjectRichParameters[i.key()] = Activity::RichSubjectParameter { parameterJsonObject.value(QStringLiteral("type")).toString(), parameterJsonObject.value(QStringLiteral("id")).toString(), parameterJsonObject.value(QStringLiteral("name")).toString(), parameterJsonObject.contains(QStringLiteral("path")) ? parameterJsonObject.value(QStringLiteral("path")).toString() : QString(), - parameterJsonObject.contains(QStringLiteral("link")) ? QUrl(parameterJsonObject.value(QStringLiteral("link")).toString()) : QUrl(), + richParamLink, }; + + if (activity._objectType == QStringLiteral("calendar") && activity._link.isEmpty()) { + activity._link = richParamLink; + } } auto displayString = activity._subjectRich; diff --git a/src/gui/tray/activitydata.h b/src/gui/tray/activitydata.h index 9371fd736..f9d0562b3 100644 --- a/src/gui/tray/activitydata.h +++ b/src/gui/tray/activitydata.h @@ -92,11 +92,14 @@ class Activity public: using Identifier = QPair; + // Note that these are in the order we want to present them in the model! enum Type { - ActivityType, + DummyFetchingActivityType, NotificationType, SyncResultType, - SyncFileItemType + SyncFileItemType, + ActivityType, + DummyMoreActivitiesAvailableType, }; static Activity fromActivityJson(const QJsonObject &json, const AccountPtr account); @@ -144,7 +147,8 @@ public: QVector _previews; // Stores information about the error - int _status; + SyncFileItem::Status _syncFileItemStatus; + SyncResult::Status _syncResultStatus; QVector _links; /** @@ -154,11 +158,13 @@ public: */ - Identifier ident() const; + [[nodiscard]] Identifier ident() const; }; bool operator==(const Activity &rhs, const Activity &lhs); +bool operator!=(const Activity &rhs, const Activity &lhs); bool operator<(const Activity &rhs, const Activity &lhs); +bool operator>(const Activity &rhs, const Activity &lhs); /* ==================================================================== */ /** @@ -170,6 +176,7 @@ bool operator<(const Activity &rhs, const Activity &lhs); using ActivityList = QList; } +Q_DECLARE_METATYPE(OCC::Activity) Q_DECLARE_METATYPE(OCC::Activity::Type) Q_DECLARE_METATYPE(OCC::ActivityLink) Q_DECLARE_METATYPE(OCC::PreviewData) diff --git a/src/gui/tray/activitylistmodel.cpp b/src/gui/tray/activitylistmodel.cpp index e533e906c..6b6b4569c 100644 --- a/src/gui/tray/activitylistmodel.cpp +++ b/src/gui/tray/activitylistmodel.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) by Klaas Freitag * * This program is free software; you can redistribute it and/or modify @@ -12,31 +12,27 @@ * for more details. */ -#include -#include -#include -#include -#include -#include -#include +#include "activitylistmodel.h" #include "account.h" #include "accountstate.h" #include "accountmanager.h" #include "conflictdialog.h" #include "folderman.h" -#include "iconjob.h" -#include "accessmanager.h" #include "owncloudgui.h" #include "guiutility.h" #include "invalidfilenamedialog.h" - +#include "caseclashfilenamedialog.h" #include "activitydata.h" -#include "activitylistmodel.h" #include "systray.h" -#include "tray/usermodel.h" -#include "theme.h" +#include +#include +#include +#include +#include +#include +#include namespace OCC { @@ -76,7 +72,9 @@ QHash ActivityListModel::roleNames() const roles[ObjectNameRole] = "objectName"; roles[PointInTimeRole] = "dateTime"; roles[DisplayActions] = "displayActions"; + roles[ShowFileDetailsRole] = "showFileDetails"; roles[ShareableRole] = "isShareable"; + roles[DismissableRole] = "isDismissable"; roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity"; roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity"; roles[ThumbnailRole] = "thumbnail"; @@ -84,6 +82,8 @@ QHash ActivityListModel::roleNames() const roles[TalkNotificationMessageIdRole] = "messageId"; roles[TalkNotificationMessageSentRole] = "messageSent"; roles[TalkNotificationUserAvatarRole] = "userAvatar"; + roles[ActivityIndexRole] = "activityIndex"; + roles[ActivityRole] = "activity"; return roles; } @@ -91,6 +91,7 @@ QHash ActivityListModel::roleNames() const void ActivityListModel::setAccountState(AccountState *state) { _accountState = state; + Q_EMIT accountStateChanged(); } void ActivityListModel::setCurrentItem(const int currentItem) @@ -155,7 +156,9 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const // If this is an E2EE file or folder, pretend we got no path, hiding the share button which is what we want if (folder) { SyncJournalFileRecord rec; - folder->journalDb()->getFileRecord(fileName.mid(1), &rec); + if (!folder->journalDb()->getFileRecord(fileName.mid(1), &rec)) { + qCWarning(lcActivity) << "could not get file from local DB" << fileName.mid(1); + } if (rec.isValid() && (rec._isE2eEncrypted || !rec._e2eMangledName.isEmpty())) { return QString(); } @@ -219,21 +222,21 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const colorIconPath.append("state-error.svg"); return colorIconPath; } else if (a._type == Activity::SyncFileItemType) { - if (a._status == SyncFileItem::NormalError - || a._status == SyncFileItem::FatalError - || a._status == SyncFileItem::DetailError - || a._status == SyncFileItem::BlacklistedError) { + if (a._syncFileItemStatus == SyncFileItem::NormalError + || a._syncFileItemStatus == SyncFileItem::FatalError + || a._syncFileItemStatus == SyncFileItem::DetailError + || a._syncFileItemStatus == SyncFileItem::BlacklistedError) { colorIconPath.append("state-error.svg"); return colorIconPath; - } else if (a._status == SyncFileItem::SoftError - || a._status == SyncFileItem::Conflict - || a._status == SyncFileItem::Restoration - || a._status == SyncFileItem::FileLocked - || a._status == SyncFileItem::FileNameInvalid - || a._status == SyncFileItem::FileNameClash) { + } else if (a._syncFileItemStatus == SyncFileItem::SoftError + || a._syncFileItemStatus == SyncFileItem::Conflict + || a._syncFileItemStatus == SyncFileItem::Restoration + || a._syncFileItemStatus == SyncFileItem::FileLocked + || a._syncFileItemStatus == SyncFileItem::FileNameInvalid + || a._syncFileItemStatus == SyncFileItem::FileNameClash) { colorIconPath.append("state-warning.svg"); return colorIconPath; - } else if (a._status == SyncFileItem::FileIgnored) { + } else if (a._syncFileItemStatus == SyncFileItem::FileIgnored) { colorIconPath.append("state-info.svg"); return colorIconPath; } else { @@ -281,7 +284,7 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const case ActionsLinksContextMenuRole: { return ActivityListModel::convertLinksToMenuEntries(a); } - + case ActionsLinksForActionButtonsRole: { return ActivityListModel::convertLinksToActionButtons(a); } @@ -298,6 +301,8 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const case ActionRole: { switch (a._type) { case Activity::ActivityType: + case Activity::DummyFetchingActivityType: + case Activity::DummyMoreActivitiesAvailableType: return "Activity"; case Activity::NotificationType: return "Notification"; @@ -335,8 +340,18 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const return (ast && ast->isConnected()); case DisplayActions: return _displayActions; - case ShareableRole: - return !data(index, PathRole).toString().isEmpty() && a._objectType == QStringLiteral("files") && _displayActions && a._fileAction != "file_deleted" && a._status != SyncFileItem::FileIgnored; + case ShowFileDetailsRole: + return _displayActions && + a._objectType == QStringLiteral("files") && + a._fileAction != "file_deleted" && + a._syncFileItemStatus != SyncFileItem::FileIgnored && + !data(index, OpenablePathRole).toString().isEmpty(); + case DismissableRole: + // Do not allow dismissal of things requiring user input regarding syncing + return !a._links.isEmpty() && + a._syncFileItemStatus != SyncFileItem::FileNameClash && + a._syncFileItemStatus != SyncFileItem::Conflict && + a._syncFileItemStatus != SyncFileItem::FileNameInvalid; case IsCurrentUserFileActivityRole: return a._isCurrentUserFileActivity; case ThumbnailRole: { @@ -359,9 +374,12 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const return replyMessageSent(a); case TalkNotificationUserAvatarRole: return a._talkNotificationData.userAvatar; - default: - return QVariant(); + case ActivityIndexRole: + return index.row(); + case ActivityRole: + return QVariant::fromValue(a); } + return QVariant(); } @@ -434,11 +452,15 @@ void ActivityListModel::ingestActivities(const QJsonArray &activities) auto a = Activity::fromActivityJson(json, _accountState->account()); + if(_presentedActivities.contains(a._id)) { + continue; + } + list.append(a); + _presentedActivities.insert(a._id); _currentItem = list.last()._id; - _totalActivitiesFetched++; - if (_totalActivitiesFetched == _maxActivities + if (_presentedActivities.count() >= _maxActivities || (_hideOldActivities && a._dateTime < oldestDate)) { _showMoreActivitiesAvailableEntry = true; _doneFetching = true; @@ -446,15 +468,10 @@ void ActivityListModel::ingestActivities(const QJsonArray &activities) } } - _activityLists.append(list); - if (list.size() > 0) { - std::sort(list.begin(), list.end()); - beginInsertRows({}, _finalList.size(), _finalList.size() + list.size() - 1); - _finalList.append(list); - endInsertRows(); - + addEntriesToActivityList(list); appendMoreActivitiesAvailableEntry(); + _activityLists.append(list); } } @@ -463,8 +480,9 @@ void ActivityListModel::appendMoreActivitiesAvailableEntry() const QString moreActivitiesEntryObjectType = QLatin1String("activity_fetch_more_activities"); if (_showMoreActivitiesAvailableEntry && !_finalList.isEmpty() && _finalList.last()._objectType != moreActivitiesEntryObjectType) { + Activity a; - a._type = Activity::ActivityType; + a._type = Activity::DummyMoreActivitiesAvailableType; a._accName = _accountState->account()->displayName(); a._id = -1; a._objectType = moreActivitiesEntryObjectType; @@ -475,56 +493,26 @@ void ActivityListModel::appendMoreActivitiesAvailableEntry() a._link = app->url(); } - beginInsertRows({}, _finalList.size(), _finalList.size()); - _finalList.append(a); - endInsertRows(); + addEntriesToActivityList({a}); } } void ActivityListModel::insertOrRemoveDummyFetchingActivity() { const QString dummyFetchingActivityObjectType = QLatin1String("dummy_fetching_activity"); - if (_currentlyFetching && _finalList.isEmpty()) { - Activity a; - a._type = Activity::ActivityType; - a._accName = _accountState->account()->displayName(); - a._id = -2; - a._objectType = dummyFetchingActivityObjectType; - a._subject = tr("Fetching activities …"); - a._dateTime = QDateTime::currentDateTime(); - a._icon = QLatin1String("qrc:///client/theme/colored/change-bordered.svg"); - beginInsertRows({}, 0, 0); - _finalList.prepend(a); - endInsertRows(); + if (_currentlyFetching && _finalList.isEmpty()) { + _dummyFetchingActivities._type = Activity::DummyFetchingActivityType; + _dummyFetchingActivities._accName = _accountState->account()->displayName(); + _dummyFetchingActivities._id = -2; + _dummyFetchingActivities._objectType = dummyFetchingActivityObjectType; + _dummyFetchingActivities._subject = tr("Fetching activities …"); + _dummyFetchingActivities._dateTime = QDateTime::currentDateTime(); + _dummyFetchingActivities._icon = QLatin1String("qrc:///client/theme/colored/change-bordered.svg"); + + addEntriesToActivityList({_dummyFetchingActivities}); } else if (!_finalList.isEmpty() && _finalList.first()._objectType == dummyFetchingActivityObjectType) { - beginRemoveRows({}, 0, 0); - _finalList.removeAt(0); - endRemoveRows(); - } -} - -void ActivityListModel::clearActivities() -{ - _activityLists.clear(); - if (!_finalList.isEmpty()) { - const auto firstActivityIt = std::find_if(std::begin(_finalList), std::end(_finalList), - [&](const Activity &activity) { return activity._type == Activity::ActivityType; }); - - if (firstActivityIt != std::end(_finalList)) { - const auto lastActivityItReverse = std::find_if(std::rbegin(_finalList), std::rend(_finalList), - [&](const Activity &activity) { return activity._type == Activity::ActivityType; }); - - const auto lastActivityIt = (lastActivityItReverse + 1).base(); - - if (lastActivityIt != std::end(_finalList)) { - const int beginRemoveIndex = std::distance(std::begin(_finalList), firstActivityIt); - const int endRemoveIndex = std::distance(std::begin(_finalList), lastActivityIt); - beginRemoveRows({}, beginRemoveIndex, endRemoveIndex); - _finalList.erase(firstActivityIt, std::end(_finalList)); - endRemoveRows(); - } - } + removeActivityFromActivityList(_dummyFetchingActivities); } } @@ -547,14 +535,29 @@ void ActivityListModel::activitiesReceived(const QJsonDocument &json, int status emit activityJobStatusCode(statusCode); } -void ActivityListModel::addErrorToActivityList(Activity activity) +void ActivityListModel::addEntriesToActivityList(const ActivityList &activityList) +{ + if(activityList.isEmpty()) { + return; + } + + const auto startRow = _finalList.count(); + + beginInsertRows({}, startRow, startRow + activityList.count() - 1); + for(const auto &activity : activityList) { + _finalList.append(activity); + } + endInsertRows(); +} + +void ActivityListModel::addErrorToActivityList(const Activity &activity) { - qCInfo(lcActivity) << "Error successfully added to the notification list: " << activity._subject; + qCInfo(lcActivity) << "Error successfully added to the notification list: " << activity._message << activity._subject << activity._syncResultStatus << activity._syncFileItemStatus; + addEntriesToActivityList({activity}); _notificationErrorsLists.prepend(activity); - combineActivityLists(); } -void ActivityListModel::addIgnoredFileToList(Activity newActivity) +void ActivityListModel::addIgnoredFileToList(const Activity &newActivity) { qCInfo(lcActivity) << "First checking for duplicates then add file to the notification list of ignored files: " << newActivity._file; @@ -562,6 +565,7 @@ void ActivityListModel::addIgnoredFileToList(Activity newActivity) if (_listOfIgnoredFiles.size() == 0) { _notificationIgnoredFiles = newActivity; _notificationIgnoredFiles._subject = tr("Files from the ignore list as well as symbolic links are not synced."); + addEntriesToActivityList({_notificationIgnoredFiles}); _listOfIgnoredFiles.append(newActivity); return; } @@ -578,65 +582,49 @@ void ActivityListModel::addIgnoredFileToList(Activity newActivity) } } -void ActivityListModel::addNotificationToActivityList(Activity activity) +void ActivityListModel::addNotificationToActivityList(const Activity &activity) { qCInfo(lcActivity) << "Notification successfully added to the notification list: " << activity._subject; + addEntriesToActivityList({activity}); _notificationLists.prepend(activity); - combineActivityLists(); } -void ActivityListModel::clearNotifications() +void ActivityListModel::addSyncFileItemToActivityList(const Activity &activity) { - qCInfo(lcActivity) << "Clear the notifications"; - _notificationLists.clear(); - combineActivityLists(); + qCInfo(lcActivity) << "Successfully added to the activity list: " << activity._subject; + addEntriesToActivityList({activity}); + _syncFileItemLists.prepend(activity); } void ActivityListModel::removeActivityFromActivityList(int row) { Activity activity = _finalList.at(row); removeActivityFromActivityList(activity); - combineActivityLists(); } -void ActivityListModel::addSyncFileItemToActivityList(Activity activity) -{ - qCInfo(lcActivity) << "Successfully added to the activity list: " << activity._subject; - _syncFileItemLists.prepend(activity); - combineActivityLists(); -} - -void ActivityListModel::removeActivityFromActivityList(Activity activity) +void ActivityListModel::removeActivityFromActivityList(const Activity &activity) { qCInfo(lcActivity) << "Activity/Notification/Error successfully dismissed: " << activity._subject; qCInfo(lcActivity) << "Trying to remove Activity/Notification/Error from view... "; - int index = -1; - if (activity._type == Activity::ActivityType) { - index = _activityLists.indexOf(activity); - if (index != -1) { - _activityLists.removeAt(index); - const auto indexInFinalList = _finalList.indexOf(activity); - if (indexInFinalList != -1) { - beginRemoveRows({}, indexInFinalList, indexInFinalList); - _finalList.removeAt(indexInFinalList); - endRemoveRows(); - } - } - } else if (activity._type == Activity::NotificationType) { - index = _notificationLists.indexOf(activity); - if (index != -1) - _notificationLists.removeAt(index); - } else { - index = _notificationErrorsLists.indexOf(activity); - if (index != -1) - _notificationErrorsLists.removeAt(index); - } - + const auto index = _finalList.indexOf(activity); if (index != -1) { qCInfo(lcActivity) << "Activity/Notification/Error successfully removed from the list."; qCInfo(lcActivity) << "Updating Activity/Notification/Error view."; - combineActivityLists(); + + beginRemoveRows({}, index, index); + _finalList.removeAt(index); + endRemoveRows(); + } + + if (activity._type != Activity::ActivityType && + activity._type != Activity::DummyFetchingActivityType && + activity._type != Activity::DummyMoreActivitiesAvailableType && + activity._type != Activity::NotificationType) { + + const auto notificationErrorsListIndex = _notificationErrorsLists.indexOf(activity); + if (notificationErrorsListIndex != -1) + _notificationErrorsLists.removeAt(notificationErrorsListIndex); } } @@ -651,7 +639,7 @@ void ActivityListModel::slotTriggerDefaultAction(const int activityIndex) const auto path = data(modelIndex, PathRole).toString(); const auto activity = _finalList.at(activityIndex); - if (activity._status == SyncFileItem::Conflict) { + if (activity._syncFileItemStatus == SyncFileItem::Conflict) { Q_ASSERT(!activity._file.isEmpty()); Q_ASSERT(!activity._folder.isEmpty()); Q_ASSERT(Utility::isConflictFile(activity._file)); @@ -681,7 +669,10 @@ void ActivityListModel::slotTriggerDefaultAction(const int activityIndex) _currentConflictDialog->open(); ownCloudGui::raiseDialog(_currentConflictDialog); return; - } else if (activity._status == SyncFileItem::FileNameInvalid) { + } else if (activity._syncFileItemStatus == SyncFileItem::FileNameClash) { + triggerCaseClashAction(activity); + return; + } else if (activity._syncFileItemStatus == SyncFileItem::FileNameInvalid) { if (!_currentInvalidFilenameDialog.isNull()) { _currentInvalidFilenameDialog->close(); } @@ -700,22 +691,6 @@ void ActivityListModel::slotTriggerDefaultAction(const int activityIndex) _currentInvalidFilenameDialog->open(); ownCloudGui::raiseDialog(_currentInvalidFilenameDialog); return; - } else if (activity._status == SyncFileItem::FileNameClash) { - const auto folder = FolderMan::instance()->folder(activity._folder); - const auto relPath = activity._fileAction == QStringLiteral("file_renamed") ? activity._renamedFile : activity._file; - SyncJournalFileRecord record; - - if (!folder || !folder->journalDb()->getFileRecord(relPath, &record)) { - return; - } - - fetchPrivateLinkUrl(folder->accountState()->account(), - relPath, - record.numericFileId(), - this, - [](const QString &link) { Utility::openBrowser(link); } - ); - return; } if (!path.isEmpty()) { @@ -726,6 +701,35 @@ void ActivityListModel::slotTriggerDefaultAction(const int activityIndex) } } +void ActivityListModel::triggerCaseClashAction(Activity activity) +{ + qCInfo(lcActivity) << "case clash conflict" << activity._file << activity._syncFileItemStatus; + + if (!_currentCaseClashFilenameDialog.isNull()) { + _currentCaseClashFilenameDialog->close(); + } + + auto folder = FolderMan::instance()->folder(activity._folder); + const auto conflictedRelativePath = activity._file; + const auto conflictRecord = folder->journalDb()->caseConflictRecordByBasePath(conflictedRelativePath); + + const auto dir = QDir(folder->path()); + const auto conflictedPath = dir.filePath(conflictedRelativePath); + const auto conflictTaggedPath = dir.filePath(conflictRecord.path); + + _currentCaseClashFilenameDialog = new CaseClashFilenameDialog(_accountState->account(), + folder, + conflictedPath, + conflictTaggedPath); + connect(_currentCaseClashFilenameDialog, &CaseClashFilenameDialog::successfulRename, folder, [folder, activity](const QString& filePath) { + qCInfo(lcActivity) << "successfulRename" << filePath << activity._message; + folder->acceptCaseClashConflictFileName(activity._message); + folder->scheduleThisFolderSoon(); + }); + _currentCaseClashFilenameDialog->open(); + ownCloudGui::raiseDialog(_currentCaseClashFilenameDialog); +} + void ActivityListModel::slotTriggerAction(const int activityIndex, const int actionIndex) { if (activityIndex < 0 || activityIndex >= _finalList.size()) { @@ -745,6 +749,11 @@ void ActivityListModel::slotTriggerAction(const int activityIndex, const int act if (action._verb == "WEB") { Utility::openBrowser(QUrl(action._link)); return; + } else if (action._verb == "FIX_CONFLICT_LOCALLY" && + activity._type == Activity::SyncFileItemType && + (activity._syncFileItemStatus == SyncFileItem::Conflict || activity._syncFileItemStatus == SyncFileItem::FileNameClash)) { + slotTriggerDefaultAction(activityIndex); + return; } emit sendNotificationRequest(activity._accName, action._link, action._verb, activityIndex); @@ -772,10 +781,6 @@ QVariantList ActivityListModel::convertLinksToActionButtons(const Activity &acti { QVariantList customList; - if (activity._links.size() == 1) { - return customList; - } - if (static_cast(activity._links.size()) > maxActionButtons()) { customList << ActivityListModel::convertLinkToActionButton(activity._links.first()); return customList; @@ -821,47 +826,6 @@ QVariantList ActivityListModel::convertLinksToMenuEntries(const Activity &activi return customList; } -void ActivityListModel::combineActivityLists() -{ - ActivityList resultList; - - if (_notificationErrorsLists.count() > 0) { - std::sort(_notificationErrorsLists.begin(), _notificationErrorsLists.end()); - resultList.append(_notificationErrorsLists); - } - if (_listOfIgnoredFiles.size() > 0) - resultList.append(_notificationIgnoredFiles); - - if (_notificationLists.count() > 0) { - std::sort(_notificationLists.begin(), _notificationLists.end()); - resultList.append(_notificationLists); - } - - if (_syncFileItemLists.count() > 0) { - std::sort(_syncFileItemLists.begin(), _syncFileItemLists.end()); - resultList.append(_syncFileItemLists); - } - - if (_activityLists.count() > 0) { - std::sort(_activityLists.begin(), _activityLists.end()); - resultList.append(_activityLists); - } - - if (_finalList.isEmpty() && !resultList.isEmpty()) { - beginInsertRows({}, 0, resultList.size() - 1); - _finalList = resultList; - endInsertRows(); - } else if (!_finalList.isEmpty()) { - beginResetModel(); - _finalList = resultList; - endResetModel(); - } - - if (_activityLists.size() > 0) { - appendMoreActivitiesAvailableEntry(); - } -} - bool ActivityListModel::canFetchActivities() const { return _accountState->isConnected() && _accountState->account()->capabilities().hasActivities(); @@ -876,17 +840,14 @@ void ActivityListModel::fetchMore(const QModelIndex &) void ActivityListModel::slotRefreshActivity() { - clearActivities(); _doneFetching = false; _currentItem = 0; - _totalActivitiesFetched = 0; _showMoreActivitiesAvailableEntry = false; if (canFetchActivities()) { startFetchJob(); } else { _doneFetching = true; - combineActivityLists(); } } @@ -901,10 +862,10 @@ void ActivityListModel::slotRemoveAccount() { _finalList.clear(); _activityLists.clear(); + _presentedActivities.clear(); setAndRefreshCurrentlyFetching(false); _doneFetching = false; _currentItem = 0; - _totalActivitiesFetched = 0; _showMoreActivitiesAvailableEntry = false; } diff --git a/src/gui/tray/activitylistmodel.h b/src/gui/tray/activitylistmodel.h index 482e80483..3e21ebd11 100644 --- a/src/gui/tray/activitylistmodel.h +++ b/src/gui/tray/activitylistmodel.h @@ -28,6 +28,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcActivity) class AccountState; class ConflictDialog; class InvalidFilenameDialog; +class CaseClashFilenameDialog; /** * @brief The ActivityListModel @@ -39,10 +40,9 @@ class InvalidFilenameDialog; class ActivityListModel : public QAbstractListModel { Q_OBJECT - Q_PROPERTY(quint32 maxActionButtons READ maxActionButtons CONSTANT) + Q_PROPERTY(AccountState *accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) - Q_PROPERTY(AccountState *accountState READ accountState CONSTANT) public: enum DataRole { DarkIconRole = Qt::UserRole + 1, @@ -66,13 +66,17 @@ public: PointInTimeRole, AccountConnectedRole, DisplayActions, + ShowFileDetailsRole, ShareableRole, + DismissableRole, IsCurrentUserFileActivityRole, ThumbnailRole, TalkNotificationConversationTokenRole, TalkNotificationMessageIdRole, TalkNotificationMessageSentRole, TalkNotificationUserAvatarRole, + ActivityIndexRole, + ActivityRole, }; Q_ENUM(DataRole) @@ -81,34 +85,25 @@ public: explicit ActivityListModel(AccountState *accountState, QObject *parent = nullptr); - QVariant data(const QModelIndex &index, int role) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; - bool canFetchMore(const QModelIndex &) const override; + [[nodiscard]] bool canFetchMore(const QModelIndex &) const override; void fetchMore(const QModelIndex &) override; ActivityList activityList() { return _finalList; } ActivityList errorsList() { return _notificationErrorsLists; } - void addNotificationToActivityList(Activity activity); - void clearNotifications(); - void addErrorToActivityList(Activity activity); - void addIgnoredFileToList(Activity newActivity); - void addSyncFileItemToActivityList(Activity activity); - void removeActivityFromActivityList(int row); - void removeActivityFromActivityList(Activity activity); - AccountState *accountState() const; - void setAccountState(AccountState *state); + [[nodiscard]] AccountState *accountState() const; + + [[nodiscard]] int currentItem() const; static constexpr quint32 maxActionButtons() { return MaxActionButtons; } - void setCurrentItem(const int currentItem); - - void setReplyMessageSent(const int activityIndex, const QString &message); - QString replyMessageSent(const Activity &activity) const; + [[nodiscard]] QString replyMessageSent(const Activity &activity) const; public slots: void slotRefreshActivity(); @@ -118,61 +113,77 @@ public slots: void slotTriggerAction(const int activityIndex, const int actionIndex); void slotTriggerDismiss(const int activityIndex); + void addNotificationToActivityList(const OCC::Activity &activity); + void addErrorToActivityList(const OCC::Activity &activity); + void addIgnoredFileToList(const OCC::Activity &newActivity); + void addSyncFileItemToActivityList(const OCC::Activity &activity); + void removeActivityFromActivityList(int row); + void removeActivityFromActivityList(const OCC::Activity &activity); + + void setAccountState(OCC::AccountState *state); + void setReplyMessageSent(const int activityIndex, const QString &message); + void setCurrentItem(const int currentItem); + signals: + void accountStateChanged(); + void activityJobStatusCode(int statusCode); void sendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row); protected: - void setup(); - void activitiesReceived(const QJsonDocument &json, int statusCode); - QHash roleNames() const override; + [[nodiscard]] QHash roleNames() const override; + + [[nodiscard]] bool currentlyFetching() const; + + [[nodiscard]] const ActivityList &finalList() const; // added for unit tests +protected slots: + void activitiesReceived(const QJsonDocument &json, int statusCode); void setAndRefreshCurrentlyFetching(bool value); - bool currentlyFetching() const; void setDoneFetching(bool value); void setHideOldActivities(bool value); void setDisplayActions(bool value); + void setFinalList(const OCC::ActivityList &finalList); // added for unit tests virtual void startFetchJob(); - // added these for unit tests - void setFinalList(const ActivityList &finalList); - const ActivityList &finalList() const; - int currentItem() const; - // +private slots: + void addEntriesToActivityList(const OCC::ActivityList &activityList); private: static QVariantList convertLinksToMenuEntries(const Activity &activity); static QVariantList convertLinksToActionButtons(const Activity &activity); static QVariant convertLinkToActionButton(const ActivityLink &activityLink); - void combineActivityLists(); - bool canFetchActivities() const; + + [[nodiscard]] bool canFetchActivities() const; void ingestActivities(const QJsonArray &activities); void appendMoreActivitiesAvailableEntry(); - void insertOrRemoveDummyFetchingActivity(); + void triggerCaseClashAction(Activity activity); - void clearActivities(); + Activity _notificationIgnoredFiles; + Activity _dummyFetchingActivities; ActivityList _activityLists; ActivityList _syncFileItemLists; ActivityList _notificationLists; ActivityList _listOfIgnoredFiles; - Activity _notificationIgnoredFiles; ActivityList _notificationErrorsLists; ActivityList _finalList; - int _currentItem = 0; + + QSet _presentedActivities; bool _displayActions = true; - int _totalActivitiesFetched = 0; + int _currentItem = 0; int _maxActivities = 100; int _maxActivitiesDays = 30; bool _showMoreActivitiesAvailableEntry = false; QPointer _currentConflictDialog; QPointer _currentInvalidFilenameDialog; + QPointer _currentCaseClashFilenameDialog; AccountState *_accountState = nullptr; bool _currentlyFetching = false; diff --git a/src/gui/tray/asyncimageresponse.cpp b/src/gui/tray/asyncimageresponse.cpp index f393c837a..fb1bf8159 100644 --- a/src/gui/tray/asyncimageresponse.cpp +++ b/src/gui/tray/asyncimageresponse.cpp @@ -63,17 +63,31 @@ void AsyncImageResponse::processNextImage() return; } - if (_imagePaths.at(_index).startsWith(QStringLiteral(":/client"))) { - setImageAndEmitFinished(QIcon(_imagePaths.at(_index)).pixmap(_requestedImageSize).toImage()); + const auto imagePath = _imagePaths.at(_index); + if (imagePath.startsWith(QStringLiteral(":/client"))) { + setImageAndEmitFinished(QIcon(imagePath).pixmap(_requestedImageSize).toImage()); return; + } else if (imagePath.startsWith(QStringLiteral(":/fileicon"))) { + const auto filePath = imagePath.mid(10); + const auto fileInfo = QFileInfo(filePath); + setImageAndEmitFinished(_fileIconProvider.icon(fileInfo).pixmap(_requestedImageSize).toImage()); + return; + } + + OCC::AccountPtr accountInRequestedServer; + + const auto accountsList = OCC::AccountManager::instance()->accounts(); + for (const auto &account : accountsList) { + if (account && account->account() && imagePath.startsWith(account->account()->url().toString())) { + accountInRequestedServer = account->account(); + } } - const auto currentUser = OCC::UserModel::instance()->currentUser(); - if (currentUser && currentUser->account()) { + if (accountInRequestedServer) { const QUrl iconUrl(_imagePaths.at(_index)); if (iconUrl.isValid() && !iconUrl.scheme().isEmpty()) { // fetch the remote resource - const auto reply = currentUser->account()->sendRawRequest(QByteArrayLiteral("GET"), iconUrl); + const auto reply = accountInRequestedServer->sendRawRequest(QByteArrayLiteral("GET"), iconUrl); connect(reply, &QNetworkReply::finished, this, &AsyncImageResponse::slotProcessNetworkReply); ++_index; return; diff --git a/src/gui/tray/asyncimageresponse.h b/src/gui/tray/asyncimageresponse.h index c3327c4c0..9d2d60003 100644 --- a/src/gui/tray/asyncimageresponse.h +++ b/src/gui/tray/asyncimageresponse.h @@ -16,13 +16,14 @@ #include #include +#include class AsyncImageResponse : public QQuickImageResponse { public: AsyncImageResponse(const QString &id, const QSize &requestedSize); void setImageAndEmitFinished(const QImage &image = {}); - QQuickTextureFactory *textureFactory() const override; + [[nodiscard]] QQuickTextureFactory *textureFactory() const override; private: void processNextImage(); @@ -34,5 +35,6 @@ private slots: QStringList _imagePaths; QSize _requestedImageSize; QColor _svgRecolor; + QFileIconProvider _fileIconProvider; int _index = 0; }; diff --git a/src/gui/tray/notificationhandler.cpp b/src/gui/tray/notificationhandler.cpp index 4e4ee1fcb..d0fc7b4c8 100644 --- a/src/gui/tray/notificationhandler.cpp +++ b/src/gui/tray/notificationhandler.cpp @@ -92,7 +92,8 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j if(json.contains("subjectRichParameters")) { const auto richParams = json.value("subjectRichParameters").toObject(); - for(const auto &key : richParams.keys()) { + const auto richParamsKeys = richParams.keys(); + for(const auto &key : richParamsKeys) { const auto parameterJsonObject = richParams.value(key).toObject(); a._subjectRichParameters.insert(key, Activity::RichSubjectParameter{ parameterJsonObject.value(QStringLiteral("type")).toString(), @@ -142,8 +143,6 @@ void ServerNotificationHandler::slotNotificationsReceived(const QJsonDocument &j a._links.insert(al._primary? 0 : a._links.size(), al); } - a._status = 0; - QUrl link(json.value("link").toString()); if (!link.isEmpty()) { if (link.host().isEmpty()) { diff --git a/src/gui/tray/notificationhandler.h b/src/gui/tray/notificationhandler.h index 4100df7d1..8e8bd3611 100644 --- a/src/gui/tray/notificationhandler.h +++ b/src/gui/tray/notificationhandler.h @@ -16,8 +16,8 @@ public: explicit ServerNotificationHandler(AccountState *accountState, QObject *parent = nullptr); signals: - void newNotificationList(ActivityList); - void newIncomingCallsList(ActivityList); + void newNotificationList(OCC::ActivityList); + void newIncomingCallsList(OCC::ActivityList); public slots: void slotFetchNotifications(); diff --git a/src/gui/tray/sortedactivitylistmodel.cpp b/src/gui/tray/sortedactivitylistmodel.cpp new file mode 100644 index 000000000..4879143f2 --- /dev/null +++ b/src/gui/tray/sortedactivitylistmodel.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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 "activitylistmodel.h" + +#include "sortedactivitylistmodel.h" + +namespace OCC { + +SortedActivityListModel::SortedActivityListModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ +} + +void SortedActivityListModel::sortModel() +{ + sort(0); +} + +ActivityListModel* SortedActivityListModel::activityListModel() const +{ + return dynamic_cast(sourceModel()); +} + +void SortedActivityListModel::setActivityListModel(ActivityListModel* activityListModel) +{ + if(const auto currentSetModel = sourceModel()) { + disconnect(currentSetModel, &ActivityListModel::rowsInserted, this, &SortedActivityListModel::sortModel); + disconnect(currentSetModel, &ActivityListModel::rowsMoved, this, &SortedActivityListModel::sortModel); + disconnect(currentSetModel, &ActivityListModel::rowsRemoved, this, &SortedActivityListModel::sortModel); + disconnect(currentSetModel, &ActivityListModel::dataChanged, this, &SortedActivityListModel::sortModel); + disconnect(currentSetModel, &ActivityListModel::modelReset, this, &SortedActivityListModel::sortModel); + } + + // Re-sort model when any changes take place + connect(activityListModel, &ActivityListModel::rowsInserted, this, &SortedActivityListModel::sortModel); + connect(activityListModel, &ActivityListModel::rowsMoved, this, &SortedActivityListModel::sortModel); + connect(activityListModel, &ActivityListModel::rowsRemoved, this, &SortedActivityListModel::sortModel); + connect(activityListModel, &ActivityListModel::dataChanged, this, &SortedActivityListModel::sortModel); + connect(activityListModel, &ActivityListModel::modelReset, this, &SortedActivityListModel::sortModel); + + setSourceModel(activityListModel); + Q_EMIT activityListModelChanged(); +} + +bool SortedActivityListModel::lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const +{ + if (!sourceLeft.isValid() || !sourceRight.isValid()) { + return false; + } + + const auto leftActivity = sourceLeft.data(ActivityListModel::ActivityRole).value(); + const auto rightActivity = sourceRight.data(ActivityListModel::ActivityRole).value(); + + // First compare by general activity type + const auto leftType = leftActivity._type; + + if (leftType == Activity::DummyFetchingActivityType) { + // The fetching activities dummy activity always goes at the top + return true; + } else if (leftType == Activity::DummyMoreActivitiesAvailableType) { + // Likewise the dummy "more activities available" activity always goes at the bottom + return false; + } + + if (const auto rightType = rightActivity._type; leftType != rightType) { + return leftType < rightType; + } + + const auto leftSyncFileItemStatus = leftActivity._syncFileItemStatus; + const auto rightSyncFileItemStatus = rightActivity._syncFileItemStatus; + + // Then compare by status + if (leftSyncFileItemStatus != rightSyncFileItemStatus) { + // We want to shove erors towards the top. + return (leftSyncFileItemStatus != SyncFileItem::NoStatus && + leftSyncFileItemStatus != SyncFileItem::Success) || + leftSyncFileItemStatus == SyncFileItem::FatalError || + leftSyncFileItemStatus < rightSyncFileItemStatus; + } + + const auto leftSyncResultStatus = leftActivity._syncResultStatus; + const auto rightSyncResultStatus = rightActivity._syncResultStatus; + + if (leftSyncResultStatus != rightSyncResultStatus) { + // We only ever use SyncResult::Error in activities + return (leftSyncResultStatus != SyncResult::Undefined && + leftSyncResultStatus != SyncResult::Success) || + leftSyncResultStatus == SyncResult::Error; + } + + // Finally sort by time, latest first + const auto leftDateTime = leftActivity._dateTime; + const auto rightDateTime = rightActivity._dateTime; + + return leftDateTime > rightDateTime; +} + +} diff --git a/src/gui/tray/sortedactivitylistmodel.h b/src/gui/tray/sortedactivitylistmodel.h new file mode 100644 index 000000000..d3e8219c1 --- /dev/null +++ b/src/gui/tray/sortedactivitylistmodel.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include + +namespace OCC { + +class ActivityListModel; + +class SortedActivityListModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(ActivityListModel* activityListModel READ activityListModel WRITE setActivityListModel NOTIFY activityListModelChanged) + +public: + explicit SortedActivityListModel(QObject *parent = nullptr); + + [[nodiscard]] ActivityListModel *activityListModel() const; + +signals: + void activityListModelChanged(); + +public slots: + void setActivityListModel(OCC::ActivityListModel *activityListModel); + +protected: + [[nodiscard]] bool lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const override; + +private slots: + void sortModel(); +}; + +} diff --git a/src/gui/tray/syncstatussummary.h b/src/gui/tray/syncstatussummary.h index b4d1bb91b..601383508 100644 --- a/src/gui/tray/syncstatussummary.h +++ b/src/gui/tray/syncstatussummary.h @@ -39,11 +39,11 @@ class SyncStatusSummary : public QObject public: explicit SyncStatusSummary(QObject *parent = nullptr); - double syncProgress() const; - QUrl syncIcon() const; - bool syncing() const; - QString syncStatusString() const; - QString syncStatusDetailString() const; + [[nodiscard]] double syncProgress() const; + [[nodiscard]] QUrl syncIcon() const; + [[nodiscard]] bool syncing() const; + [[nodiscard]] QString syncStatusString() const; + [[nodiscard]] QString syncStatusDetailString() const; signals: void syncProgressChanged(); @@ -66,7 +66,7 @@ private: void setSyncStateForFolder(const Folder *folder); void markFolderAsError(const Folder *folder); void markFolderAsSuccess(const Folder *folder); - bool folderErrors() const; + [[nodiscard]] bool folderErrors() const; bool folderError(const Folder *folder) const; void clearFolderErrors(); void setSyncStateToConnectedState(); diff --git a/src/gui/tray/unifiedsearchresultslistmodel.cpp b/src/gui/tray/unifiedsearchresultslistmodel.cpp index 0e9a44fe0..5f951c07c 100644 --- a/src/gui/tray/unifiedsearchresultslistmodel.cpp +++ b/src/gui/tray/unifiedsearchresultslistmodel.cpp @@ -194,6 +194,7 @@ Q_LOGGING_CATEGORY(lcUnifiedSearch, "nextcloud.gui.unifiedsearch", QtInfoMsg) UnifiedSearchResultsListModel::UnifiedSearchResultsListModel(AccountState *accountState, QObject *parent) : QAbstractListModel(parent) + , _waitingForSearchTermEditEnd(false) , _accountState(accountState) { } @@ -280,6 +281,11 @@ QString UnifiedSearchResultsListModel::currentFetchMoreInProgressProviderId() co return _currentFetchMoreInProgressProviderId; } +bool UnifiedSearchResultsListModel::waitingForSearchTermEditEnd() const +{ + return _waitingForSearchTermEditEnd; +} + void UnifiedSearchResultsListModel::setSearchTerm(const QString &term) { if (term == _searchTerm) { @@ -303,6 +309,8 @@ void UnifiedSearchResultsListModel::setSearchTerm(const QString &term) if (_unifiedSearchTextEditingFinishedTimer.isActive()) { _unifiedSearchTextEditingFinishedTimer.stop(); + _waitingForSearchTermEditEnd = false; + emit waitingForSearchTermEditEndChanged(); } if (!_searchTerm.isEmpty()) { @@ -310,6 +318,8 @@ void UnifiedSearchResultsListModel::setSearchTerm(const QString &term) connect(&_unifiedSearchTextEditingFinishedTimer, &QTimer::timeout, this, &UnifiedSearchResultsListModel::slotSearchTermEditingFinished); _unifiedSearchTextEditingFinishedTimer.start(); + _waitingForSearchTermEditEnd = true; + emit waitingForSearchTermEditEndChanged(); } if (!_results.isEmpty()) { @@ -367,6 +377,9 @@ void UnifiedSearchResultsListModel::fetchMoreTriggerClicked(const QString &provi void UnifiedSearchResultsListModel::slotSearchTermEditingFinished() { + _waitingForSearchTermEditEnd = false; + emit waitingForSearchTermEditEndChanged(); + disconnect(&_unifiedSearchTextEditingFinishedTimer, &QTimer::timeout, this, &UnifiedSearchResultsListModel::slotSearchTermEditingFinished); @@ -491,7 +504,7 @@ void UnifiedSearchResultsListModel::startSearch() endResetModel(); } - for (const auto &provider : _providers) { + for (const auto &provider : qAsConst(_providers)) { startSearchForProvider(provider._id); } } @@ -566,15 +579,6 @@ void UnifiedSearchResultsListModel::parseResultsForProvider(const QJsonObject &d QVector newEntries; - const auto makeResourceUrl = [](const QString &resourceUrl, const QUrl &accountUrl) { - QUrl finalResurceUrl(resourceUrl); - if (finalResurceUrl.scheme().isEmpty() && accountUrl.scheme().isEmpty()) { - finalResurceUrl = accountUrl; - finalResurceUrl.setPath(resourceUrl); - } - return finalResurceUrl; - }; - for (const auto &entry : entries) { const auto entryMap = entry.toMap(); if (entryMap.isEmpty()) { @@ -588,10 +592,10 @@ void UnifiedSearchResultsListModel::parseResultsForProvider(const QJsonObject &d result._title = entryMap.value(QStringLiteral("title")).toString(); result._subline = entryMap.value(QStringLiteral("subline")).toString(); - const auto resourceUrl = entryMap.value(QStringLiteral("resourceUrl")).toString(); + const auto resourceUrl = entryMap.value(QStringLiteral("resourceUrl")).toUrl(); const auto accountUrl = (_accountState && _accountState->account()) ? _accountState->account()->url() : QUrl(); - result._resourceUrl = makeResourceUrl(resourceUrl, accountUrl); + result._resourceUrl = openableResourceUrl(resourceUrl, accountUrl); const auto darkIconsData = iconsFromThumbnailAndFallbackIcon(entryMap.value(QStringLiteral("thumbnailUrl")).toString(), entryMap.value(QStringLiteral("icon")).toString(), accountUrl, true); const auto lightIconsData = iconsFromThumbnailAndFallbackIcon(entryMap.value(QStringLiteral("thumbnailUrl")).toString(), @@ -611,6 +615,17 @@ void UnifiedSearchResultsListModel::parseResultsForProvider(const QJsonObject &d } } +QUrl UnifiedSearchResultsListModel::openableResourceUrl(const QUrl &resourceUrl, const QUrl &accountUrl) +{ + if (!resourceUrl.isRelative()) { + return resourceUrl; + } + + QUrl finalResourceUrl(accountUrl); + finalResourceUrl.setPath(resourceUrl.toString()); + return finalResourceUrl; +} + void UnifiedSearchResultsListModel::appendResults(QVector results, const UnifiedSearchProvider &provider) { if (provider._cursor > 0 && provider._isPaginated) { @@ -711,7 +726,7 @@ void UnifiedSearchResultsListModel::removeFetchMoreTrigger(const QString &provid void UnifiedSearchResultsListModel::disconnectAndClearSearchJobs() { - for (const auto &connection : _searchJobConnections) { + for (const auto &connection : qAsConst(_searchJobConnections)) { if (connection) { QObject::disconnect(connection); } diff --git a/src/gui/tray/unifiedsearchresultslistmodel.h b/src/gui/tray/unifiedsearchresultslistmodel.h index 7403b2ce9..539b4f59c 100644 --- a/src/gui/tray/unifiedsearchresultslistmodel.h +++ b/src/gui/tray/unifiedsearchresultslistmodel.h @@ -38,6 +38,7 @@ class UnifiedSearchResultsListModel : public QAbstractListModel currentFetchMoreInProgressProviderIdChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged) Q_PROPERTY(QString searchTerm READ searchTerm WRITE setSearchTerm NOTIFY searchTermChanged) + Q_PROPERTY(bool waitingForSearchTermEditEnd READ waitingForSearchTermEditEnd NOTIFY waitingForSearchTermEditEndChanged) struct UnifiedSearchProvider { @@ -69,19 +70,20 @@ public: explicit UnifiedSearchResultsListModel(AccountState *accountState, QObject *parent = nullptr); - QVariant data(const QModelIndex &index, int role) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; - bool isSearchInProgress() const; + [[nodiscard]] bool isSearchInProgress() const; - QString currentFetchMoreInProgressProviderId() const; - QString searchTerm() const; - QString errorString() const; + [[nodiscard]] QString currentFetchMoreInProgressProviderId() const; + [[nodiscard]] QString searchTerm() const; + [[nodiscard]] QString errorString() const; + [[nodiscard]] bool waitingForSearchTermEditEnd() const; Q_INVOKABLE void resultClicked(const QString &providerId, const QUrl &resourceUrl) const; Q_INVOKABLE void fetchMoreTriggerClicked(const QString &providerId); - QHash roleNames() const override; + [[nodiscard]] QHash roleNames() const override; private: void startSearch(); @@ -106,6 +108,7 @@ signals: void isSearchInProgressChanged(); void errorStringChanged(); void searchTermChanged(); + void waitingForSearchTermEditEndChanged(); public slots: void setSearchTerm(const QString &term); @@ -116,11 +119,14 @@ private slots: void slotSearchForProviderFinished(const QJsonDocument &json, int statusCode); private: + static QUrl openableResourceUrl(const QUrl &resourceUrl, const QUrl &accountUrl); + QMap _providers; QVector _results; QString _searchTerm; QString _errorString; + bool _waitingForSearchTermEditEnd; QString _currentFetchMoreInProgressProviderId; diff --git a/src/gui/tray/usermodel.cpp b/src/gui/tray/usermodel.cpp index b123d01b0..a26a054cd 100644 --- a/src/gui/tray/usermodel.cpp +++ b/src/gui/tray/usermodel.cpp @@ -82,8 +82,60 @@ User::User(AccountStatePtr &account, const bool &isCurrent, QObject *parent) connect(this, &User::sendReplyMessage, this, &User::slotSendReplyMessage); } +void User::checkNotifiedNotifications() +{ + // after one hour, clear the gui log notification store + constexpr qint64 clearGuiLogInterval = 60 * 60 * 1000; + if (_guiLogTimer.elapsed() > clearGuiLogInterval) { + _notifiedNotifications.clear(); + } +} + +bool User::notificationAlreadyShown(const long notificationId) +{ + checkNotifiedNotifications(); + return _notifiedNotifications.contains(notificationId); +} + +bool User::canShowNotification(const long notificationId) +{ + ConfigFile cfg; + return cfg.optionalServerNotifications() && + isDesktopNotificationsAllowed() && + !notificationAlreadyShown(notificationId); +} + void User::showDesktopNotification(const QString &title, const QString &message, const long notificationId) { + if(!canShowNotification(notificationId)) { + return; + } + + _notifiedNotifications.insert(notificationId); + Logger::instance()->postGuiLog(title, message); + // restart the gui log timer now that we show a new notification + _guiLogTimer.start(); +} + +void User::showDesktopNotification(const Activity &activity) +{ + const auto notificationId = activity._id; + const auto message = AccountManager::instance()->accounts().count() == 1 ? "" : activity._accName; + showDesktopNotification(activity._subject, message, notificationId); +} + +void User::showDesktopNotification(const ActivityList &activityList) +{ + const auto subject = QStringLiteral("%1 notifications").arg(activityList.count()); + const auto notificationId = -static_cast(qHash(subject)); + + if (!canShowNotification(notificationId)) { + return; + } + + const auto multipleAccounts = AccountManager::instance()->accounts().count() > 1; + const auto message = multipleAccounts ? activityList.constFirst()._accName : QString(); + // Notification ids are uints, which are 4 bytes. Error activities don't have ids, however, so we generate one. // To avoid possible collisions between the activity ids which are actually the notification ids received from // the server (which are always positive) and our "fake" error activity ids, we assign a negative id to the @@ -91,30 +143,40 @@ void User::showDesktopNotification(const QString &title, const QString &message, // // To ensure that we can still treat an unsigned int as normal, we use a long, which is 8 bytes. - ConfigFile cfg; - if (!cfg.optionalServerNotifications() || !isDesktopNotificationsAllowed()) { - return; + Logger::instance()->postGuiLog(subject, message); + + for(const auto &activity : activityList) { + _notifiedNotifications.insert(activity._id); + _activityModel->addNotificationToActivityList(activity); } +} - // after one hour, clear the gui log notification store - constexpr qint64 clearGuiLogInterval = 60 * 60 * 1000; - if (_guiLogTimer.elapsed() > clearGuiLogInterval) { - _notifiedNotifications.clear(); +void User::showDesktopTalkNotification(const Activity &activity) +{ + const auto notificationId = activity._id; + + if (!canShowNotification(notificationId)) { + return; } - if (_notifiedNotifications.contains(notificationId)) { + if (activity._talkNotificationData.messageId.isEmpty()) { + showDesktopNotification(activity._subject, activity._message, notificationId); return; } _notifiedNotifications.insert(notificationId); - Logger::instance()->postGuiLog(title, message); - // restart the gui log timer now that we show a new notification + _activityModel->addNotificationToActivityList(activity); + + Systray::instance()->showTalkMessage(activity._subject, + activity._message, + activity._talkNotificationData.conversationToken, + activity._talkNotificationData.messageId, + _account); _guiLogTimer.start(); } void User::slotBuildNotificationDisplay(const ActivityList &list) { - const auto multipleAccounts = AccountManager::instance()->accounts().count() > 1; ActivityList toNotifyList; std::copy_if(list.constBegin(), list.constEnd(), std::back_inserter(toNotifyList), [&](const Activity &activity) { @@ -131,25 +193,16 @@ void User::slotBuildNotificationDisplay(const ActivityList &list) }); if(toNotifyList.count() > 2) { - const auto subject = QStringLiteral("%1 notifications").arg(toNotifyList.count()); - const auto message = multipleAccounts ? toNotifyList.constFirst()._accName : QString(); - showDesktopNotification(subject, message, -static_cast(qHash(subject))); - - // Set these activities as notified here, rather than in showDesktopNotification - for(const auto &activity : toNotifyList) { - _notifiedNotifications.insert(activity._id); - _activityModel->addNotificationToActivityList(activity); - } - + showDesktopNotification(toNotifyList); return; } - for(const auto &activity : toNotifyList) { - const auto message = activity._objectType == QStringLiteral("chat") - ? activity._message : AccountManager::instance()->accounts().count() == 1 ? "" : activity._accName; - - showDesktopNotification(activity._subject, message, activity._id); // We assigned the notif. id to the activity id - _activityModel->addNotificationToActivityList(activity); + for(const auto &activity : qAsConst(toNotifyList)) { + if (activity._objectType == QStringLiteral("chat")) { + showDesktopTalkNotification(activity); + } else { + showDesktopNotification(activity); + } } } @@ -220,7 +273,8 @@ void User::slotReceivedPushActivity(Account *account) void User::slotCheckExpiredActivities() { - for (const Activity &activity : _activityModel->errorsList()) { + const auto errorsList = _activityModel->errorsList(); + for (const Activity &activity : errorsList) { if (activity._expireAtMsecs > 0 && QDateTime::currentDateTime().toMSecsSinceEpoch() >= activity._expireAtMsecs) { _activityModel->removeActivityFromActivityList(activity); } @@ -439,24 +493,24 @@ void User::slotProgressInfo(const QString &folder, const ProgressInfo &progress) continue; } - if (activity._status == SyncFileItem::Conflict && !QFileInfo(f->path() + activity._file).exists()) { + if (activity._syncFileItemStatus == SyncFileItem::Conflict && !QFileInfo::exists(f->path() + activity._file)) { _activityModel->removeActivityFromActivityList(activity); continue; } - if (activity._status == SyncFileItem::FileLocked && !QFileInfo(f->path() + activity._file).exists()) { + if (activity._syncFileItemStatus == SyncFileItem::FileLocked && !QFileInfo::exists(f->path() + activity._file)) { _activityModel->removeActivityFromActivityList(activity); continue; } - if (activity._status == SyncFileItem::FileIgnored && !QFileInfo(f->path() + activity._file).exists()) { + if (activity._syncFileItemStatus == SyncFileItem::FileIgnored && !QFileInfo::exists(f->path() + activity._file)) { _activityModel->removeActivityFromActivityList(activity); continue; } - if (!QFileInfo(f->path() + activity._file).exists()) { + if (!QFileInfo::exists(f->path() + activity._file)) { _activityModel->removeActivityFromActivityList(activity); continue; } @@ -476,7 +530,7 @@ void User::slotProgressInfo(const QString &folder, const ProgressInfo &progress) QStringList conflicts; foreach (Activity activity, _activityModel->errorsList()) { if (activity._folder == folder - && activity._status == SyncFileItem::Conflict) { + && activity._syncFileItemStatus == SyncFileItem::Conflict) { conflicts.append(activity._file); } } @@ -496,7 +550,7 @@ void User::slotAddError(const QString &folderAlias, const QString &message, Erro Activity activity; activity._type = Activity::SyncResultType; - activity._status = SyncResult::Error; + activity._syncResultStatus = SyncResult::Error; activity._dateTime = QDateTime::fromString(QDateTime::currentDateTime().toString(), Qt::ISODate); activity._subject = message; activity._message = folderInstance->shortGuiLocalPath(); @@ -531,7 +585,7 @@ void User::slotAddErrorToGui(const QString &folderAlias, SyncFileItem::Status st Activity activity; activity._type = Activity::SyncFileItemType; - activity._status = status; + activity._syncFileItemStatus = status; const auto currentDateTime = QDateTime::currentDateTime(); activity._dateTime = QDateTime::fromString(currentDateTime.toString(), Qt::ISODate); activity._expireAtMsecs = currentDateTime.addMSecs(activityDefaultExpirationTimeMsecs).toMSecsSinceEpoch(); @@ -541,13 +595,23 @@ void User::slotAddErrorToGui(const QString &folderAlias, SyncFileItem::Status st activity._accName = folderInstance->accountState()->account()->displayName(); activity._folder = folderAlias; + if (status == SyncFileItem::Conflict || status == SyncFileItem::FileNameClash) { + ActivityLink buttonActivityLink; + buttonActivityLink._label = tr("Resolve conflict"); + buttonActivityLink._link = activity._link.toString(); + buttonActivityLink._verb = "FIX_CONFLICT_LOCALLY"; + buttonActivityLink._primary = true; + + activity._links = {buttonActivityLink}; + } + // Error notifications don't have ids by themselves so we will create one for it activity._id = -static_cast(qHash(activity._subject + activity._message)); // add 'other errors' to activity list _activityModel->addErrorToActivityList(activity); - showDesktopNotification(activity._subject, activity._message, activity._id); + showDesktopNotification(activity); if (!_expiredActivitiesCheckTimer.isActive()) { _expiredActivitiesCheckTimer.start(expiredActivitiesCheckIntervalMsecs); @@ -594,7 +658,8 @@ void User::processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr Activity activity; activity._type = Activity::SyncFileItemType; //client activity - activity._status = item->_status; + activity._objectType = QStringLiteral("files"); + activity._syncFileItemStatus = item->_status; activity._dateTime = QDateTime::currentDateTime(); activity._message = item->_originalFile; activity._link = account()->url(); @@ -617,9 +682,6 @@ void User::processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr } if(activity._fileAction != "file_deleted" && !item->isEmpty()) { - auto remotePath = folder->remotePath(); - remotePath.append(activity._fileAction == "file_renamed" ? item->_renameTarget : activity._file); - const auto localFiles = FolderMan::instance()->findFileInLocalFolders(item->_file, account()); if (!localFiles.isEmpty()) { const auto firstFilePath = localFiles.constFirst(); @@ -657,6 +719,14 @@ void User::processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr // add 'protocol error' to activity list if (item->_status == SyncFileItem::Status::FileNameInvalid) { showDesktopNotification(item->_file, activity._subject, activity._id); + } else if (item->_status == SyncFileItem::Conflict || item->_status == SyncFileItem::FileNameClash) { + ActivityLink buttonActivityLink; + buttonActivityLink._label = tr("Resolve conflict"); + buttonActivityLink._link = activity._link.toString(); + buttonActivityLink._verb = "FIX_CONFLICT_LOCALLY"; + buttonActivityLink._primary = true; + + activity._links = {buttonActivityLink}; } _activityModel->addErrorToActivityList(activity); } @@ -733,12 +803,7 @@ void User::logout() const QString User::name() const { - // If davDisplayName is empty (can be several reasons, simplest is missing login at startup), fall back to username - QString name = _account->account()->davDisplayName(); - if (name == "") { - name = _account->account()->credentials()->user(); - } - return name; + return _account->account()->prettyName(); } QString User::server(bool shortened) const @@ -861,6 +926,11 @@ void User::slotSendReplyMessage(const int activityIndex, const QString &token, c }); } +void User::forceSyncNow() const +{ + FolderMan::instance()->forceSyncForFolder(getFolder()); +} + /*-------------------------------------------------------------------------------------*/ UserModel *UserModel::_instance = nullptr; @@ -1035,7 +1105,7 @@ void UserModel::setCurrentUserId(const int id) const auto isCurrentUserChanged = !_users[id]->isCurrentUser(); if (isCurrentUserChanged) { - for (const auto user : _users) { + for (const auto user : qAsConst(_users)) { user->setCurrentUser(false); } _users[id]->setCurrentUser(true); diff --git a/src/gui/tray/usermodel.h b/src/gui/tray/usermodel.h index 4724be47e..c49cd9990 100644 --- a/src/gui/tray/usermodel.h +++ b/src/gui/tray/usermodel.h @@ -41,37 +41,37 @@ class User : public QObject public: User(AccountStatePtr &account, const bool &isCurrent = false, QObject *parent = nullptr); - AccountPtr account() const; - AccountStatePtr accountState() const; + [[nodiscard]] AccountPtr account() const; + [[nodiscard]] AccountStatePtr accountState() const; - bool isConnected() const; - bool isCurrentUser() const; + [[nodiscard]] bool isConnected() const; + [[nodiscard]] bool isCurrentUser() const; void setCurrentUser(const bool &isCurrent); - Folder *getFolder() const; + [[nodiscard]] Folder *getFolder() const; ActivityListModel *getActivityModel(); - UnifiedSearchResultsListModel *getUnifiedSearchResultsListModel() const; + [[nodiscard]] UnifiedSearchResultsListModel *getUnifiedSearchResultsListModel() const; void openLocalFolder(); - QString name() const; - QString server(bool shortened = true) const; - bool hasLocalFolder() const; - bool serverHasTalk() const; - bool serverHasUserStatus() const; - AccountApp *talkApp() const; - bool hasActivities() const; - QColor accentColor() const; - QColor headerColor() const; - QColor headerTextColor() const; - AccountAppList appList() const; - QImage avatar() const; + [[nodiscard]] QString name() const; + [[nodiscard]] QString server(bool shortened = true) const; + [[nodiscard]] bool hasLocalFolder() const; + [[nodiscard]] bool serverHasTalk() const; + [[nodiscard]] bool serverHasUserStatus() const; + [[nodiscard]] AccountApp *talkApp() const; + [[nodiscard]] bool hasActivities() const; + [[nodiscard]] QColor accentColor() const; + [[nodiscard]] QColor headerColor() const; + [[nodiscard]] QColor headerTextColor() const; + [[nodiscard]] AccountAppList appList() const; + [[nodiscard]] QImage avatar() const; void login() const; void logout() const; void removeAccount() const; - QString avatarUrl() const; - bool isDesktopNotificationsAllowed() const; - UserStatus::OnlineStatus status() const; - QString statusMessage() const; - QUrl statusIcon() const; - QString statusEmoji() const; + [[nodiscard]] QString avatarUrl() const; + [[nodiscard]] bool isDesktopNotificationsAllowed() const; + [[nodiscard]] UserStatus::OnlineStatus status() const; + [[nodiscard]] QString statusMessage() const; + [[nodiscard]] QUrl statusIcon() const; + [[nodiscard]] QString statusEmoji() const; void processCompletedSyncItem(const Folder *folder, const SyncFileItemPtr &item); signals: @@ -88,17 +88,17 @@ signals: void sendReplyMessage(const int activityIndex, const QString &conversationToken, const QString &message, const QString &replyTo); public slots: - void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item); - void slotProgressInfo(const QString &folder, const ProgressInfo &progress); - void slotAddError(const QString &folderAlias, const QString &message, ErrorCategory category); - void slotAddErrorToGui(const QString &folderAlias, SyncFileItem::Status status, const QString &errorMessage, const QString &subject = {}); + void slotItemCompleted(const QString &folder, const OCC::SyncFileItemPtr &item); + void slotProgressInfo(const QString &folder, const OCC::ProgressInfo &progress); + void slotAddError(const QString &folderAlias, const QString &message, OCC::ErrorCategory category); + void slotAddErrorToGui(const QString &folderAlias, OCC::SyncFileItem::Status status, const QString &errorMessage, const QString &subject = {}); void slotNotificationRequestFinished(int statusCode); void slotNotifyNetworkError(QNetworkReply *reply); void slotEndNotificationRequest(int replyCode); void slotNotifyServerFinished(const QString &reply, int replyCode); void slotSendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row); - void slotBuildNotificationDisplay(const ActivityList &list); - void slotBuildIncomingCallDialogs(const ActivityList &list); + void slotBuildNotificationDisplay(const OCC::ActivityList &list); + void slotBuildIncomingCallDialogs(const OCC::ActivityList &list); void slotRefreshNotifications(); void slotRefreshActivitiesInitial(); void slotRefreshActivities(); @@ -108,23 +108,31 @@ public slots: void setNotificationRefreshInterval(std::chrono::milliseconds interval); void slotRebuildNavigationAppList(); void slotSendReplyMessage(const int activityIndex, const QString &conversationToken, const QString &message, const QString &replyTo); + void forceSyncNow() const; -private: +private slots: void slotPushNotificationsReady(); void slotDisconnectPushNotifications(); void slotReceivedPushNotification(Account *account); void slotReceivedPushActivity(Account *account); void slotCheckExpiredActivities(); + void checkNotifiedNotifications(); + void showDesktopNotification(const QString &title, const QString &message, const long notificationId); + void showDesktopNotification(const Activity &activity); + void showDesktopNotification(const ActivityList &activityList); + void showDesktopTalkNotification(const Activity &activity); + +private: void connectPushNotifications() const; - bool checkPushNotificationsAreReady() const; + [[nodiscard]] bool checkPushNotificationsAreReady() const; bool isActivityOfCurrentAccount(const Folder *folder) const; - bool isUnsolvableConflict(const SyncFileItemPtr &item) const; + [[nodiscard]] bool isUnsolvableConflict(const SyncFileItemPtr &item) const; - void showDesktopNotification(const QString &title, const QString &message, const long notificationId); + bool notificationAlreadyShown(const long notificationId); + bool canShowNotification(const long notificationId); -private: AccountStatePtr _account; bool _isCurrentUser; ActivityListModel *_activityModel; @@ -156,18 +164,18 @@ public: void addUser(AccountStatePtr &user, const bool &isCurrent = false); int currentUserIndex(); - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - QImage avatarById(const int id) const; + [[nodiscard]] QImage avatarById(const int id) const; - User *currentUser() const; + [[nodiscard]] User *currentUser() const; int findUserIdForAccount(AccountState *account) const; Q_INVOKABLE int numUsers(); Q_INVOKABLE QString currentUserServer(); - int currentUserId() const; + [[nodiscard]] int currentUserId() const; Q_INVOKABLE bool isUserConnected(const int id); @@ -189,7 +197,7 @@ public: IdRole }; - AccountAppList appList() const; + [[nodiscard]] AccountAppList appList() const; signals: void addAccount(); @@ -206,7 +214,7 @@ public slots: void removeAccount(const int id); protected: - QHash roleNames() const override; + [[nodiscard]] QHash roleNames() const override; private: static UserModel *_instance; @@ -232,9 +240,9 @@ public: static UserAppsModel *instance(); ~UserAppsModel() override = default; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; enum UserAppsRoles { NameRole = Qt::UserRole + 1, @@ -248,7 +256,7 @@ public slots: void openAppUrl(const QUrl &url); protected: - QHash roleNames() const override; + [[nodiscard]] QHash roleNames() const override; private: static UserAppsModel *_instance; diff --git a/src/gui/updater/ocupdater.h b/src/gui/updater/ocupdater.h index f62571036..1bbf8b859 100644 --- a/src/gui/updater/ocupdater.h +++ b/src/gui/updater/ocupdater.h @@ -110,8 +110,8 @@ public: void checkForUpdate() override; - QString statusString(UpdateStatusStringFormat format = PlainText) const; - int downloadState() const; + [[nodiscard]] QString statusString(UpdateStatusStringFormat format = PlainText) const; + [[nodiscard]] int downloadState() const; void setDownloadState(DownloadState state); signals: @@ -133,9 +133,9 @@ private slots: protected: virtual void versionInfoArrived(const UpdateInfo &info) = 0; - bool updateSucceeded() const; - QNetworkAccessManager *qnam() const { return _accessManager; } - UpdateInfo updateInfo() const { return _updateInfo; } + [[nodiscard]] bool updateSucceeded() const; + [[nodiscard]] QNetworkAccessManager *qnam() const { return _accessManager; } + [[nodiscard]] UpdateInfo updateInfo() const { return _updateInfo; } private: QUrl _updateUrl; diff --git a/src/gui/updater/updateinfo.h b/src/gui/updater/updateinfo.h index a57c6f040..af2148f46 100644 --- a/src/gui/updater/updateinfo.h +++ b/src/gui/updater/updateinfo.h @@ -12,13 +12,13 @@ class UpdateInfo { public: void setVersion(const QString &v); - QString version() const; + [[nodiscard]] QString version() const; void setVersionString(const QString &v); - QString versionString() const; + [[nodiscard]] QString versionString() const; void setWeb(const QString &v); - QString web() const; + [[nodiscard]] QString web() const; void setDownloadUrl(const QString &v); - QString downloadUrl() const; + [[nodiscard]] QString downloadUrl() const; /** Parse XML object from DOM element. */ diff --git a/src/gui/userinfo.h b/src/gui/userinfo.h index c02ebabd9..eaad8db19 100644 --- a/src/gui/userinfo.h +++ b/src/gui/userinfo.h @@ -70,8 +70,8 @@ class UserInfo : public QObject public: explicit UserInfo(OCC::AccountState *accountState, bool allowDisconnectedAccountState, bool fetchAvatarImage, QObject *parent = nullptr); - qint64 lastQuotaTotalBytes() const { return _lastQuotaTotalBytes; } - qint64 lastQuotaUsedBytes() const { return _lastQuotaUsedBytes; } + [[nodiscard]] qint64 lastQuotaTotalBytes() const { return _lastQuotaTotalBytes; } + [[nodiscard]] qint64 lastQuotaUsedBytes() const { return _lastQuotaUsedBytes; } /** * When the quotainfo is active, it requests the quota at regular interval. @@ -91,10 +91,10 @@ private Q_SLOTS: Q_SIGNALS: void quotaUpdated(qint64 total, qint64 used); - void fetchedLastInfo(UserInfo *userInfo); + void fetchedLastInfo(OCC::UserInfo *userInfo); private: - bool canGetInfo() const; + [[nodiscard]] bool canGetInfo() const; QPointer _accountState; bool _allowDisconnectedAccountState; diff --git a/src/gui/userstatusselectormodel.h b/src/gui/userstatusselectormodel.h index 913798641..6f85a28a8 100644 --- a/src/gui/userstatusselectormodel.h +++ b/src/gui/userstatusselectormodel.h @@ -89,11 +89,11 @@ public: Q_REQUIRED_RESULT QString userStatusEmoji() const; void setUserStatusEmoji(const QString &emoji); - QVector predefinedStatuses() const; + [[nodiscard]] QVector predefinedStatuses() const; Q_REQUIRED_RESULT QVariantList clearStageTypes() const; Q_REQUIRED_RESULT QString clearAtDisplayString() const; - Q_INVOKABLE QString clearAtReadable(const UserStatus &status) const; + Q_INVOKABLE [[nodiscard]] QString clearAtReadable(const OCC::UserStatus &status) const; Q_REQUIRED_RESULT QString errorMessage() const; @@ -101,8 +101,8 @@ public slots: void setUserIndex(const int userIndex); void setUserStatus(); void clearUserStatus(); - void setClearAt(const ClearStageType clearStageType); - void setPredefinedStatus(const UserStatus &predefinedStatus); + void setClearAt(const OCC::UserStatusSelectorModel::ClearStageType clearStageType); + void setPredefinedStatus(const OCC::UserStatus &predefinedStatus); signals: void userIndexChanged(); diff --git a/src/gui/wizard/abstractcredswizardpage.cpp b/src/gui/wizard/abstractcredswizardpage.cpp index 696e98e09..80b302887 100644 --- a/src/gui/wizard/abstractcredswizardpage.cpp +++ b/src/gui/wizard/abstractcredswizardpage.cpp @@ -26,7 +26,7 @@ void AbstractCredentialsWizardPage::cleanupPage() { // Reset the credentials when the 'Back' button is used. - AccountPtr account = static_cast(wizard())->account(); + AccountPtr account = dynamic_cast(wizard())->account(); AbstractCredentials *creds = account->credentials(); if (creds) { if (!creds->inherits("DummyCredentials")) { diff --git a/src/gui/wizard/abstractcredswizardpage.h b/src/gui/wizard/abstractcredswizardpage.h index d50a58108..a12ff6bea 100644 --- a/src/gui/wizard/abstractcredswizardpage.h +++ b/src/gui/wizard/abstractcredswizardpage.h @@ -29,7 +29,7 @@ class AbstractCredentialsWizardPage : public QWizardPage { public: void cleanupPage() override; - virtual AbstractCredentials *getCredentials() const = 0; + [[nodiscard]] virtual AbstractCredentials *getCredentials() const = 0; }; } // namespace OCC diff --git a/src/gui/wizard/flow2authcredspage.h b/src/gui/wizard/flow2authcredspage.h index 61f7317aa..1a8713768 100644 --- a/src/gui/wizard/flow2authcredspage.h +++ b/src/gui/wizard/flow2authcredspage.h @@ -38,13 +38,13 @@ class Flow2AuthCredsPage : public AbstractCredentialsWizardPage public: Flow2AuthCredsPage(); - AbstractCredentials *getCredentials() const override; + [[nodiscard]] AbstractCredentials *getCredentials() const override; void initializePage() override; void cleanupPage() override; - int nextId() const override; + [[nodiscard]] int nextId() const override; void setConnected(); - bool isComplete() const override; + [[nodiscard]] bool isComplete() const override; public Q_SLOTS: void slotFlow2AuthResult(Flow2Auth::Result, const QString &errorString, const QString &user, const QString &appPassword); diff --git a/src/gui/wizard/owncloudadvancedsetuppage.cpp b/src/gui/wizard/owncloudadvancedsetuppage.cpp index a79ff3e32..2dbf427ec 100644 --- a/src/gui/wizard/owncloudadvancedsetuppage.cpp +++ b/src/gui/wizard/owncloudadvancedsetuppage.cpp @@ -164,7 +164,7 @@ void OwncloudAdvancedSetupPage::initializePage() // ensure "next" gets the focus, not obSelectLocalFolder QTimer::singleShot(0, wizard()->button(QWizard::FinishButton), qOverload<>(&QWidget::setFocus)); - auto acc = static_cast(wizard())->account(); + auto acc = dynamic_cast(wizard())->account(); auto quotaJob = new PropfindJob(acc, _remoteFolder, this); quotaJob->setProperties(QList() << "http://owncloud.org/ns:size"); @@ -193,6 +193,18 @@ void OwncloudAdvancedSetupPage::initializePage() if (nextButton) { nextButton->setDefault(true); } + if (Theme::instance()->forceOverrideServerUrl()) { + QTimer::singleShot(0, this, [this]() { + ConfigFile cfg; + connect(_ocWizard, &QDialog::accepted, [&]() { + cfg.setOverrideServerUrl({}); + cfg.setOverrideLocalDir({}); + }); + if (!cfg.overrideLocalDir().isEmpty()) { + _ocWizard->accept(); + } + }); + } } void OwncloudAdvancedSetupPage::fetchUserAvatar() @@ -336,8 +348,8 @@ void OwncloudAdvancedSetupPage::stopSpinner() QUrl OwncloudAdvancedSetupPage::serverUrl() const { - const QString urlString = static_cast(wizard())->ocUrl(); - const QString user = static_cast(wizard())->getCredentials()->user(); + const QString urlString = dynamic_cast(wizard())->ocUrl(); + const QString user = dynamic_cast(wizard())->getCredentials()->user(); QUrl url(urlString); url.setUserName(user); @@ -452,7 +464,7 @@ void OwncloudAdvancedSetupPage::slotSelectFolder() void OwncloudAdvancedSetupPage::slotSelectiveSyncClicked() { - AccountPtr acc = static_cast(wizard())->account(); + AccountPtr acc = dynamic_cast(wizard())->account(); auto *dlg = new SelectiveSyncDialog(acc, _remoteFolder, _selectiveSyncBlacklist, this); dlg->setAttribute(Qt::WA_DeleteOnClose); diff --git a/src/gui/wizard/owncloudadvancedsetuppage.h b/src/gui/wizard/owncloudadvancedsetuppage.h index 0a715d27c..4de4b593e 100644 --- a/src/gui/wizard/owncloudadvancedsetuppage.h +++ b/src/gui/wizard/owncloudadvancedsetuppage.h @@ -38,14 +38,14 @@ class OwncloudAdvancedSetupPage : public QWizardPage public: OwncloudAdvancedSetupPage(OwncloudWizard *wizard); - bool isComplete() const override; + [[nodiscard]] bool isComplete() const override; void initializePage() override; - int nextId() const override; + [[nodiscard]] int nextId() const override; bool validatePage() override; - QString localFolder() const; - QStringList selectiveSyncBlacklist() const; - bool useVirtualFileSync() const; - bool isConfirmBigFolderChecked() const; + [[nodiscard]] QString localFolder() const; + [[nodiscard]] QStringList selectiveSyncBlacklist() const; + [[nodiscard]] bool useVirtualFileSync() const; + [[nodiscard]] bool isConfirmBigFolderChecked() const; void setRemoteFolder(const QString &remoteFolder); void setMultipleFoldersExist(bool exist); void directoriesCreated(); @@ -72,9 +72,9 @@ private: bool dataChanged(); void startSpinner(); void stopSpinner(); - QUrl serverUrl() const; - qint64 availableLocalSpace() const; - QString checkLocalSpace(qint64 remoteSize) const; + [[nodiscard]] QUrl serverUrl() const; + [[nodiscard]] qint64 availableLocalSpace() const; + [[nodiscard]] QString checkLocalSpace(qint64 remoteSize) const; void customizeStyle(); void setServerAddressLabelUrl(const QUrl &url); void styleSyncLogo(); diff --git a/src/gui/wizard/owncloudhttpcredspage.h b/src/gui/wizard/owncloudhttpcredspage.h index adc46117d..915482b97 100644 --- a/src/gui/wizard/owncloudhttpcredspage.h +++ b/src/gui/wizard/owncloudhttpcredspage.h @@ -34,12 +34,12 @@ class OwncloudHttpCredsPage : public AbstractCredentialsWizardPage public: OwncloudHttpCredsPage(QWidget *parent); - AbstractCredentials *getCredentials() const override; + [[nodiscard]] AbstractCredentials *getCredentials() const override; void initializePage() override; void cleanupPage() override; bool validatePage() override; - int nextId() const override; + [[nodiscard]] int nextId() const override; void setConnected(); void setErrorString(const QString &err); diff --git a/src/gui/wizard/owncloudoauthcredspage.h b/src/gui/wizard/owncloudoauthcredspage.h index efbc9a69b..339e97b02 100644 --- a/src/gui/wizard/owncloudoauthcredspage.h +++ b/src/gui/wizard/owncloudoauthcredspage.h @@ -36,13 +36,13 @@ class OwncloudOAuthCredsPage : public AbstractCredentialsWizardPage public: OwncloudOAuthCredsPage(); - AbstractCredentials *getCredentials() const override; + [[nodiscard]] AbstractCredentials *getCredentials() const override; void initializePage() override; void cleanupPage() override; - int nextId() const override; + [[nodiscard]] int nextId() const override; void setConnected(); - bool isComplete() const override; + [[nodiscard]] bool isComplete() const override; public Q_SLOTS: void asyncAuthResult(OAuth::Result, const QString &user, const QString &token, diff --git a/src/gui/wizard/owncloudsetuppage.h b/src/gui/wizard/owncloudsetuppage.h index b4cee856d..590bc289f 100644 --- a/src/gui/wizard/owncloudsetuppage.h +++ b/src/gui/wizard/owncloudsetuppage.h @@ -45,14 +45,14 @@ public: OwncloudSetupPage(QWidget *parent = nullptr); ~OwncloudSetupPage() override; - bool isComplete() const override; + [[nodiscard]] bool isComplete() const override; void initializePage() override; - int nextId() const override; + [[nodiscard]] int nextId() const override; void setServerUrl(const QString &); void setAllowPasswordStorage(bool); bool validatePage() override; - QString url() const; - QString localFolder() const; + [[nodiscard]] QString url() const; + [[nodiscard]] QString localFolder() const; void setRemoteFolder(const QString &remoteFolder); void setMultipleFoldersExist(bool exist); void setAuthType(DetermineAuthTypeJob::AuthType type); diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp index 4a9c4d11e..afc19c409 100644 --- a/src/gui/wizard/owncloudwizard.cpp +++ b/src/gui/wizard/owncloudwizard.cpp @@ -134,9 +134,16 @@ void OwncloudWizard::centerWindow() void OwncloudWizard::adjustWizardSize() { const auto pageSizes = calculateWizardPageSizes(); - const auto longestSide = calculateLongestSideOfWizardPages(pageSizes); + const auto currentPageIndex = currentId(); - resize(QSize(longestSide, longestSide)); + // If we can, just use the size of the current page + if(currentPageIndex > -1 && currentPageIndex < pageSizes.count()) { + resize(pageSizes.at(currentPageIndex)); + return; + } + + // As a backup, resize to largest page + resize(calculateLargestSizeOfWizardPages(pageSizes)); } QList OwncloudWizard::calculateWizardPageSizes() const @@ -153,11 +160,17 @@ QList OwncloudWizard::calculateWizardPageSizes() const return pageSizes; } -int OwncloudWizard::calculateLongestSideOfWizardPages(const QList &pageSizes) const +QSize OwncloudWizard::calculateLargestSizeOfWizardPages(const QList &pageSizes) const { - return std::accumulate(std::cbegin(pageSizes), std::cend(pageSizes), 0, [](int current, const QSize &size) { - return std::max({ current, size.width(), size.height() }); - }); + QSize largestSize; + for(const auto size : pageSizes) { + const auto largerWidth = qMax(largestSize.width(), size.width()); + const auto largerHeight = qMax(largestSize.height(), size.height()); + + largestSize = QSize(largerWidth, largerHeight); + } + + return largestSize; } void OwncloudWizard::setAccount(AccountPtr account) diff --git a/src/gui/wizard/owncloudwizard.h b/src/gui/wizard/owncloudwizard.h index 14fcbc507..c720ab0ed 100644 --- a/src/gui/wizard/owncloudwizard.h +++ b/src/gui/wizard/owncloudwizard.h @@ -56,20 +56,20 @@ public: OwncloudWizard(QWidget *parent = nullptr); void setAccount(AccountPtr account); - AccountPtr account() const; + [[nodiscard]] AccountPtr account() const; void setOCUrl(const QString &); bool registration(); void setRegistration(bool registration); void setupCustomMedia(QVariant, QLabel *); - QString ocUrl() const; - QString localFolder() const; - QStringList selectiveSyncBlacklist() const; - bool useVirtualFileSync() const; - bool isConfirmBigFolderChecked() const; + [[nodiscard]] QString ocUrl() const; + [[nodiscard]] QString localFolder() const; + [[nodiscard]] QStringList selectiveSyncBlacklist() const; + [[nodiscard]] bool useVirtualFileSync() const; + [[nodiscard]] bool isConfirmBigFolderChecked() const; void displayError(const QString &, bool retryHTTPonly); - AbstractCredentials *getCredentials() const; + [[nodiscard]] AbstractCredentials *getCredentials() const; void bringToTop(); void centerWindow(); @@ -90,12 +90,13 @@ public: QList _clientSslCaCertificates; public slots: - void setAuthType(DetermineAuthTypeJob::AuthType type); + void setAuthType(OCC::DetermineAuthTypeJob::AuthType type); void setRemoteFolder(const QString &); - void appendToConfigurationLog(const QString &msg, LogType type = LogParagraph); + void appendToConfigurationLog(const QString &msg, OCC::OwncloudWizard::LogType type = LogParagraph); void slotCurrentPageChanged(int); void successfulStep(); void slotCustomButtonClicked(const int which); + void adjustWizardSize(); signals: void clearPendingRequests(); @@ -114,9 +115,8 @@ protected: private: void customizeStyle(); - void adjustWizardSize(); - int calculateLongestSideOfWizardPages(const QList &pageSizes) const; - QList calculateWizardPageSizes() const; + [[nodiscard]] QSize calculateLargestSizeOfWizardPages(const QList &pageSizes) const; + [[nodiscard]] QList calculateWizardPageSizes() const; AccountPtr _account; WelcomePage *_welcomePage; diff --git a/src/gui/wizard/owncloudwizardcommon.cpp b/src/gui/wizard/owncloudwizardcommon.cpp index 0f4735082..f4df9bad0 100644 --- a/src/gui/wizard/owncloudwizardcommon.cpp +++ b/src/gui/wizard/owncloudwizardcommon.cpp @@ -33,7 +33,7 @@ namespace WizardCommon { if (!label) return; - QPixmap pix = variant.value(); + auto pix = variant.value(); if (!pix.isNull()) { label->setPixmap(pix); label->setAlignment(Qt::AlignTop | Qt::AlignRight); diff --git a/src/gui/wizard/postfixlineedit.h b/src/gui/wizard/postfixlineedit.h index 1e8078f05..b32c3f637 100644 --- a/src/gui/wizard/postfixlineedit.h +++ b/src/gui/wizard/postfixlineedit.h @@ -36,9 +36,9 @@ public: /** @brief sets an optional postfix shown greyed out */ void setPostfix(const QString &postfix); /** @brief retrives the postfix */ - QString postfix() const; + [[nodiscard]] QString postfix() const; /** @brief retrieves combined text() and postfix() */ - QString fullText() const; + [[nodiscard]] QString fullText() const; /** @brief sets text() from full text, discarding prefix() */ void setFullText(const QString &text); diff --git a/src/gui/wizard/slideshow.cpp b/src/gui/wizard/slideshow.cpp index caba027c7..34c702978 100644 --- a/src/gui/wizard/slideshow.cpp +++ b/src/gui/wizard/slideshow.cpp @@ -55,6 +55,8 @@ void SlideShow::setInterval(int interval) _interval = interval; maybeRestartTimer(); + + emit intervalChanged(); } int SlideShow::currentSlide() const diff --git a/src/gui/wizard/slideshow.h b/src/gui/wizard/slideshow.h index 65743ec1f..5e257aca1 100644 --- a/src/gui/wizard/slideshow.h +++ b/src/gui/wizard/slideshow.h @@ -29,7 +29,7 @@ namespace OCC { class SlideShow : public QWidget { Q_OBJECT - Q_PROPERTY(int interval READ interval WRITE setInterval) + Q_PROPERTY(int interval READ interval WRITE setInterval NOTIFY intervalChanged) Q_PROPERTY(int currentSlide READ currentSlide WRITE setCurrentSlide NOTIFY currentSlideChanged) public: @@ -37,15 +37,15 @@ public: void addSlide(const QPixmap &pixmap, const QString &label); - bool isActive() const; + [[nodiscard]] bool isActive() const; - int interval() const; + [[nodiscard]] int interval() const; void setInterval(int interval); - int currentSlide() const; + [[nodiscard]] int currentSlide() const; void setCurrentSlide(int index); - QSize sizeHint() const override; + [[nodiscard]] QSize sizeHint() const override; public slots: void startShow(int interval = 0); @@ -57,6 +57,7 @@ public slots: signals: void clicked(); void currentSlideChanged(int index); + void intervalChanged(); protected: void mousePressEvent(QMouseEvent *event) override; diff --git a/src/gui/wizard/webviewpage.h b/src/gui/wizard/webviewpage.h index db4febec1..23667975e 100644 --- a/src/gui/wizard/webviewpage.h +++ b/src/gui/wizard/webviewpage.h @@ -18,10 +18,10 @@ public: void initializePage() override; void cleanupPage() override; - int nextId() const override; - bool isComplete() const override; + [[nodiscard]] int nextId() const override; + [[nodiscard]] bool isComplete() const override; - AbstractCredentials* getCredentials() const override; + [[nodiscard]] AbstractCredentials* getCredentials() const override; void setConnected(); signals: diff --git a/src/gui/wizard/welcomepage.h b/src/gui/wizard/welcomepage.h index 9d0aa1c0a..bef31f775 100644 --- a/src/gui/wizard/welcomepage.h +++ b/src/gui/wizard/welcomepage.h @@ -33,7 +33,7 @@ class WelcomePage : public QWizardPage public: explicit WelcomePage(OwncloudWizard *ocWizard); ~WelcomePage() override; - int nextId() const override; + [[nodiscard]] int nextId() const override; void initializePage() override; void setLoginButtonDefault(); diff --git a/src/libsync/CMakeLists.txt b/src/libsync/CMakeLists.txt index 590dbc4c7..8be29f9c1 100644 --- a/src/libsync/CMakeLists.txt +++ b/src/libsync/CMakeLists.txt @@ -121,6 +121,8 @@ set(libsync_SRCS creds/credentialscommon.cpp creds/keychainchunk.h creds/keychainchunk.cpp + caseclashconflictsolver.h + caseclashconflictsolver.cpp ) if (WIN32) diff --git a/src/libsync/abstractnetworkjob.cpp b/src/libsync/abstractnetworkjob.cpp index feac00601..ef2dc75f4 100644 --- a/src/libsync/abstractnetworkjob.cpp +++ b/src/libsync/abstractnetworkjob.cpp @@ -188,7 +188,7 @@ void AbstractNetworkJob::slotFinished() const auto maxHttp2Resends = 3; QByteArray verb = HttpLogger::requestVerb(*reply()); if (_reply->error() == QNetworkReply::ContentReSendError - && _reply->attribute(QNetworkRequest::HTTP2WasUsedAttribute).toBool()) { + && _reply->attribute(QNetworkRequest::Http2WasUsedAttribute).toBool()) { if ((_requestBody && !_requestBody->isSequential()) || verb.isEmpty()) { qCWarning(lcNetworkJob) << "Can't resend HTTP2 request, verb or body not suitable" diff --git a/src/libsync/abstractnetworkjob.h b/src/libsync/abstractnetworkjob.h index aadbc3872..6af5b207c 100644 --- a/src/libsync/abstractnetworkjob.h +++ b/src/libsync/abstractnetworkjob.h @@ -45,16 +45,16 @@ public: virtual void start(); - AccountPtr account() const { return _account; } + [[nodiscard]] AccountPtr account() const { return _account; } void setPath(const QString &path); - QString path() const { return _path; } + [[nodiscard]] QString path() const { return _path; } void setReply(QNetworkReply *reply); - QNetworkReply *reply() const { return _reply; } + [[nodiscard]] QNetworkReply *reply() const { return _reply; } void setIgnoreCredentialFailure(bool ignore); - bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; } + [[nodiscard]] bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; } /** Whether to handle redirects transparently. * @@ -67,17 +67,17 @@ public: * requests where custom handling is necessary. */ void setFollowRedirects(bool follow); - bool followRedirects() const { return _followRedirects; } + [[nodiscard]] 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; } + [[nodiscard]] qint64 timeoutMsec() const { return _timer.interval(); } + [[nodiscard]] bool timedOut() const { return _timedout; } /** Returns an error message, if any. */ - virtual QString errorString() const; + [[nodiscard]] virtual QString errorString() const; /** Like errorString, but also checking the reply body for information. * @@ -159,12 +159,12 @@ protected: virtual void newReplyHook(QNetworkReply *) {} /// Creates a url for the account from a relative path - QUrl makeAccountUrl(const QString &relativePath) const; + [[nodiscard]] QUrl makeAccountUrl(const QString &relativePath) const; /// Like makeAccountUrl() but uses the account's dav base path - QUrl makeDavUrl(const QString &relativePath) const; + [[nodiscard]] QUrl makeDavUrl(const QString &relativePath) const; - int maxRedirects() const { return 10; } + [[nodiscard]] int maxRedirects() const { return 10; } /** Called at the end of QNetworkReply::finished processing. * diff --git a/src/libsync/abstractpropagateremotedeleteencrypted.cpp b/src/libsync/abstractpropagateremotedeleteencrypted.cpp index 4d8bca505..2cbfd698b 100644 --- a/src/libsync/abstractpropagateremotedeleteencrypted.cpp +++ b/src/libsync/abstractpropagateremotedeleteencrypted.cpp @@ -75,7 +75,7 @@ void AbstractPropagateRemoteDeleteEncrypted::slotFolderEncryptedIdReceived(const void AbstractPropagateRemoteDeleteEncrypted::slotTryLock(const QByteArray &folderId) { - auto lockJob = new LockEncryptFolderApiJob(_propagator->account(), folderId, this); + auto lockJob = new LockEncryptFolderApiJob(_propagator->account(), folderId, _propagator->_journal, _propagator->account()->e2e()->_publicKey, this); connect(lockJob, &LockEncryptFolderApiJob::success, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderLockedSuccessfully); connect(lockJob, &LockEncryptFolderApiJob::error, this, &AbstractPropagateRemoteDeleteEncrypted::taskFailed); lockJob->start(); @@ -144,7 +144,9 @@ void AbstractPropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished() return; } - _propagator->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory()); + if (!_propagator->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory())) { + qCWarning(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Failed to delete file record from local DB" << _item->_originalFile; + } _propagator->_journal->commit("Remote Remove"); unlockFolder(); @@ -170,7 +172,7 @@ void AbstractPropagateRemoteDeleteEncrypted::unlockFolder() } qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Unlocking folder" << _folderId; - auto unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(), _folderId, _folderToken, this); + auto unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(), _folderId, _folderToken, _propagator->_journal, this); connect(unlockJob, &UnlockEncryptFolderApiJob::success, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockedSuccessfully); connect(unlockJob, &UnlockEncryptFolderApiJob::error, this, [this] (const QByteArray& fileId, int httpReturnCode) { diff --git a/src/libsync/abstractpropagateremotedeleteencrypted.h b/src/libsync/abstractpropagateremotedeleteencrypted.h index 68db266aa..3d3dd8342 100644 --- a/src/libsync/abstractpropagateremotedeleteencrypted.h +++ b/src/libsync/abstractpropagateremotedeleteencrypted.h @@ -34,8 +34,8 @@ public: AbstractPropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent); ~AbstractPropagateRemoteDeleteEncrypted() override = default; - QNetworkReply::NetworkError networkError() const; - QString errorString() const; + [[nodiscard]] QNetworkReply::NetworkError networkError() const; + [[nodiscard]] QString errorString() const; virtual void start() = 0; diff --git a/src/libsync/accessmanager.cpp b/src/libsync/accessmanager.cpp index fa04e6c6b..00b08d3f5 100644 --- a/src/libsync/accessmanager.cpp +++ b/src/libsync/accessmanager.cpp @@ -84,7 +84,7 @@ QNetworkReply *AccessManager::createRequest(QNetworkAccessManager::Operation op, // http2 seems to cause issues, as with our recommended server setup we don't support http2, disable it by default for now static const bool http2EnabledEnv = qEnvironmentVariableIntValue("OWNCLOUD_HTTP2_ENABLED") == 1; - newRequest.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, http2EnabledEnv); + newRequest.setAttribute(QNetworkRequest::Http2AllowedAttribute, http2EnabledEnv); } #endif diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 5162160ee..8c5244eed 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -95,7 +95,12 @@ Account::~Account() = default; QString Account::davPath() const { - return davPathBase() + QLatin1Char('/') + davUser() + QLatin1Char('/'); + return davPathRoot() + QLatin1Char('/'); +} + +QString Account::davPathRoot() const +{ + return davPathBase() + QLatin1Char('/') + davUser(); } void Account::setSharedThis(AccountPtr sharedThis) @@ -130,6 +135,7 @@ void Account::setDavUser(const QString &newDavUser) return; _davUser = newDavUser; emit wantsAccountSaved(this); + emit prettyNameChanged(); } #ifndef TOKEN_AUTH_ONLY @@ -183,6 +189,19 @@ void Account::setDavDisplayName(const QString &newDisplayName) { _displayName = newDisplayName; emit accountChangedDisplayName(); + emit prettyNameChanged(); +} + +QString Account::prettyName() const +{ + // If davDisplayName is empty (can be several reasons, simplest is missing login at startup), fall back to username + auto name = davDisplayName(); + + if (name.isEmpty()) { + name = davUser(); + } + + return name; } QColor Account::headerColor() const @@ -734,7 +753,7 @@ void Account::writeAppPasswordOnce(QString appPassword){ job->setKey(kck); job->setBinaryData(appPassword.toLatin1()); connect(job, &WritePasswordJob::finished, [this](Job *incoming) { - auto *writeJob = static_cast(incoming); + auto *writeJob = dynamic_cast(incoming); if (writeJob->error() == NoError) qCInfo(lcAccount) << "appPassword stored in keychain"; else @@ -757,7 +776,7 @@ void Account::retrieveAppPassword(){ job->setInsecureFallback(false); job->setKey(kck); connect(job, &ReadPasswordJob::finished, [this](Job *incoming) { - auto *readJob = static_cast(incoming); + auto *readJob = dynamic_cast(incoming); QString pwd(""); // Error or no valid public key error out if (readJob->error() == NoError && @@ -787,7 +806,7 @@ void Account::deleteAppPassword() job->setInsecureFallback(false); job->setKey(kck); connect(job, &DeletePasswordJob::finished, [this](Job *incoming) { - auto *deleteJob = static_cast(incoming); + auto *deleteJob = dynamic_cast(incoming); if (deleteJob->error() == NoError) qCInfo(lcAccount) << "appPassword deleted from keychain"; else @@ -942,9 +961,20 @@ void Account::setE2eEncryptionKeysGenerationAllowed(bool allowed) _e2eEncryptionKeysGenerationAllowed = allowed; } -bool Account::e2eEncryptionKeysGenerationAllowed() const +[[nodiscard]] bool Account::e2eEncryptionKeysGenerationAllowed() const { return _e2eEncryptionKeysGenerationAllowed; } +bool Account::askUserForMnemonic() const +{ + return _e2eAskUserForMnemonic; +} + +void Account::setAskUserForMnemonic(const bool ask) +{ + _e2eAskUserForMnemonic = ask; + emit askUserForMnemonicChanged(); +} + } // namespace OCC diff --git a/src/libsync/account.h b/src/libsync/account.h index cb0810b62..b752fff13 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -83,8 +83,10 @@ class OWNCLOUDSYNC_EXPORT Account : public QObject Q_PROPERTY(QString id MEMBER _id) Q_PROPERTY(QString davUser MEMBER _davUser) Q_PROPERTY(QString displayName MEMBER _displayName) + Q_PROPERTY(QString prettyName READ prettyName NOTIFY prettyNameChanged) Q_PROPERTY(QUrl url MEMBER _url) Q_PROPERTY(bool e2eEncryptionKeysGenerationAllowed MEMBER _e2eEncryptionKeysGenerationAllowed) + Q_PROPERTY(bool askUserForMnemonic READ askUserForMnemonic WRITE setAskUserForMnemonic NOTIFY askUserForMnemonicChanged) public: static AccountPtr create(); @@ -92,7 +94,7 @@ public: AccountPtr sharedFromThis(); - AccountPtr sharedFromThis() const; + [[nodiscard]] AccountPtr sharedFromThis() const; /** * The user that can be used in dav url. @@ -100,33 +102,38 @@ public: * This can very well be different frome the login user that's * stored in credentials()->user(). */ - QString davUser() const; + [[nodiscard]] QString davUser() const; void setDavUser(const QString &newDavUser); - QString davDisplayName() const; + [[nodiscard]] QString davDisplayName() const; void setDavDisplayName(const QString &newDisplayName); #ifndef TOKEN_AUTH_ONLY - QImage avatar() const; + [[nodiscard]] QImage avatar() const; void setAvatar(const QImage &img); #endif /// The name of the account as shown in the toolbar - QString displayName() const; + [[nodiscard]] QString displayName() const; /// User id in a form 'user@example.de, optionally port is added (if it is not 80 or 443) - QString userIdAtHostWithPort() const; + [[nodiscard]] QString userIdAtHostWithPort() const; - QColor accentColor() const; - QColor headerColor() const; - QColor headerTextColor() const; + /// The name of the account that is displayed as nicely as possible, + /// e.g. the actual name of the user (John Doe). If this cannot be + /// provided, defaults to davUser (e.g. johndoe) + [[nodiscard]] QString prettyName() const; + + [[nodiscard]] QColor accentColor() const; + [[nodiscard]] QColor headerColor() const; + [[nodiscard]] QColor headerTextColor() const; /// The internal id of the account. - QString id() const; + [[nodiscard]] QString id() const; /** Server url of the account */ void setUrl(const QUrl &url); - QUrl url() const { return _url; } + [[nodiscard]] QUrl url() const { return _url; } /// Adjusts _userVisibleUrl once the host to use is discovered. void setUserVisibleHost(const QString &host); @@ -136,20 +143,27 @@ public: * a trailing slash. * @returns the (themeable) dav path for the account. */ - QString davPath() const; + [[nodiscard]] QString davPath() const; + + /** + * @brief The possibly themed dav path root for the account. It has + * no trailing slash. + * @returns the (themeable) dav path for the account. + */ + [[nodiscard]] QString davPathRoot() const; /** Returns webdav entry URL, based on url() */ - QUrl davUrl() const; + [[nodiscard]] QUrl davUrl() const; /** Returns the legacy permalink url for a file. * * This uses the old way of manually building the url. New code should * use the "privatelink" property accessible via PROPFIND. */ - QUrl deprecatedPrivateLinkUrl(const QByteArray &numericFileId) const; + [[nodiscard]] QUrl deprecatedPrivateLinkUrl(const QByteArray &numericFileId) const; /** Holds the accounts credentials */ - AbstractCredentials *credentials() const; + [[nodiscard]] AbstractCredentials *credentials() const; void setCredentials(AbstractCredentials *cred); /** Create a network request on the account's QNAM. @@ -180,7 +194,7 @@ public: /** The ssl configuration during the first connection */ QSslConfiguration getOrCreateSslConfig(); - QSslConfiguration sslConfiguration() const { return _sslConfiguration; } + [[nodiscard]] QSslConfiguration sslConfiguration() const { return _sslConfiguration; } void setSslConfiguration(const QSslConfiguration &config); // Because of bugs in Qt, we use this to store info needed for the SSL Button QSslCipher _sessionCipher; @@ -189,7 +203,7 @@ public: /** The certificates of the account */ - QList approvedCerts() const { return _approvedCerts; } + [[nodiscard]] QList approvedCerts() const { return _approvedCerts; } void setApprovedCerts(const QList certs); void addApprovedCerts(const QList certs); @@ -202,14 +216,14 @@ public: void setSslErrorHandler(AbstractSslErrorHandler *handler); // To be called by credentials only, for storing username and the like - QVariant credentialSetting(const QString &key) const; + [[nodiscard]] QVariant credentialSetting(const QString &key) const; void setCredentialSetting(const QString &key, const QVariant &value); /** Assign a client certificate */ void setCertificate(const QByteArray certficate = QByteArray(), const QString privateKey = QString()); /** Access the server capabilities */ - const Capabilities &capabilities() const; + [[nodiscard]] const Capabilities &capabilities() const; void setCapabilities(const QVariantMap &caps); /** Access the server version @@ -217,7 +231,7 @@ public: * For servers >= 10.0.0, this can be the empty string until capabilities * have been received. */ - QString serverVersion() const; + [[nodiscard]] QString serverVersion() const; /** Server version for easy comparison. * @@ -225,7 +239,7 @@ public: * * Will be 0 if the version is not available yet. */ - int serverVersionInt() const; + [[nodiscard]] int serverVersionInt() const; static constexpr int makeServerVersion(const int majorVersion, const int minorVersion, const int patchVersion) { return (majorVersion << 16) + (minorVersion << 8) + patchVersion; @@ -243,13 +257,13 @@ public: * * This function returns true if the server is beyond the weak limit. */ - bool serverVersionUnsupported() const; + [[nodiscard]] bool serverVersionUnsupported() const; - bool isUsernamePrefillSupported() const; + [[nodiscard]] bool isUsernamePrefillSupported() const; - bool isChecksumRecalculateRequestSupported() const; + [[nodiscard]] bool isChecksumRecalculateRequestSupported() const; - int checksumRecalculateServerVersionMinSupportedMajor() const; + [[nodiscard]] int checksumRecalculateServerVersionMinSupportedMajor() const; /** True when the server connection is using HTTP2 */ bool isHttp2Supported() { return _http2Supported; } @@ -281,10 +295,10 @@ public: void setupUserStatusConnector(); void trySetupPushNotifications(); - PushNotifications *pushNotifications() const; + [[nodiscard]] PushNotifications *pushNotifications() const; void setPushNotificationsReconnectInterval(int interval); - std::shared_ptr userStatusConnector() const; + [[nodiscard]] std::shared_ptr userStatusConnector() const; void setLockFileState(const QString &serverRelativePath, SyncJournalDb * const journal, @@ -296,15 +310,18 @@ public: bool fileCanBeUnlocked(SyncJournalDb * const journal, const QString &folderRelativePath) const; void setTrustCertificates(bool trustCertificates); - bool trustCertificates() const; + [[nodiscard]] bool trustCertificates() const; void setE2eEncryptionKeysGenerationAllowed(bool allowed); - bool e2eEncryptionKeysGenerationAllowed() const; + [[nodiscard]] bool e2eEncryptionKeysGenerationAllowed() const; + + [[nodiscard]] bool askUserForMnemonic() const; public slots: /// Used when forgetting credentials void clearQNAMCache(); void slotHandleSslErrors(QNetworkReply *, QList); + void setAskUserForMnemonic(const bool ask); signals: /// Emitted whenever there's network activity @@ -313,25 +330,27 @@ signals: /// Triggered by handleInvalidCredentials() void invalidCredentials(); - void credentialsFetched(AbstractCredentials *credentials); - void credentialsAsked(AbstractCredentials *credentials); + void credentialsFetched(OCC::AbstractCredentials *credentials); + void credentialsAsked(OCC::AbstractCredentials *credentials); /// Forwards from QNetworkAccessManager::proxyAuthenticationRequired(). void proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *); // e.g. when the approved SSL certificates changed - void wantsAccountSaved(Account *acc); + void wantsAccountSaved(OCC::Account *acc); - void serverVersionChanged(Account *account, const QString &newVersion, const QString &oldVersion); + void serverVersionChanged(OCC::Account *account, const QString &newVersion, const QString &oldVersion); void accountChangedAvatar(); void accountChangedDisplayName(); + void prettyNameChanged(); + void askUserForMnemonicChanged(); /// Used in RemoteWipe void appPasswordRetrieved(QString); - void pushNotificationsReady(Account *account); - void pushNotificationsDisabled(Account *account); + void pushNotificationsReady(OCC::Account *account); + void pushNotificationsDisabled(OCC::Account *account); void userStatusChanged(); @@ -356,6 +375,7 @@ private: bool _trustCertificates = false; bool _e2eEncryptionKeysGenerationAllowed = false; + bool _e2eAskUserForMnemonic = false; QWeakPointer _sharedThis; QString _id; diff --git a/src/libsync/bandwidthmanager.h b/src/libsync/bandwidthmanager.h index adef4e668..15e08f997 100644 --- a/src/libsync/bandwidthmanager.h +++ b/src/libsync/bandwidthmanager.h @@ -44,10 +44,10 @@ public: public slots: - void registerUploadDevice(UploadDevice *); + void registerUploadDevice(OCC::UploadDevice *); void unregisterUploadDevice(QObject *); - void registerDownloadJob(GETFileJob *); + void registerDownloadJob(OCC::GETFileJob *); void unregisterDownloadJob(QObject *); void absoluteLimitTimerExpired(); diff --git a/src/libsync/bulkpropagatorjob.cpp b/src/libsync/bulkpropagatorjob.cpp index 228180711..330b17fbb 100644 --- a/src/libsync/bulkpropagatorjob.cpp +++ b/src/libsync/bulkpropagatorjob.cpp @@ -256,10 +256,6 @@ void BulkPropagatorJob::checkPropagationIsDone() void BulkPropagatorJob::slotComputeTransmissionChecksum(SyncFileItemPtr item, UploadFileInfo fileToUpload) { - // Reuse the content checksum as the transmission checksum if possible - const auto supportedTransmissionChecksums = - propagator()->account()->capabilities().supportedChecksumTypes(); - // Compute the transmission checksum. auto computeChecksum = std::make_unique(this); if (uploadChecksumEnabled()) { @@ -393,6 +389,8 @@ void BulkPropagatorJob::slotPutFinishedOneFile(const BulkUploadItem &singleFile, singleFile._item->_etag = etag; singleFile._item->_fileId = getHeaderFromJsonReply(fileReply, "fileid"); singleFile._item->_remotePerm = RemotePermissions::fromServerString(getHeaderFromJsonReply(fileReply, "permissions")); + singleFile._item->_isShared = singleFile._item->_remotePerm.hasPermission(RemotePermissions::IsShared) || singleFile._item->_sharedByMe; + singleFile._item->_lastShareStateFetchedTimestamp = QDateTime::currentMSecsSinceEpoch(); if (getHeaderFromJsonReply(fileReply, "X-OC-MTime") != "accepted") { // X-OC-MTime is supported since owncloud 5.0. But not when chunking. diff --git a/src/libsync/bulkpropagatorjob.h b/src/libsync/bulkpropagatorjob.h index 1502332e3..451bcf88f 100644 --- a/src/libsync/bulkpropagatorjob.h +++ b/src/libsync/bulkpropagatorjob.h @@ -67,26 +67,26 @@ public: JobParallelism parallelism() override; private slots: - void startUploadFile(SyncFileItemPtr item, UploadFileInfo fileToUpload); + void startUploadFile(OCC::SyncFileItemPtr item, OCC::BulkPropagatorJob::UploadFileInfo fileToUpload); // Content checksum computed, compute the transmission checksum - void slotComputeTransmissionChecksum(SyncFileItemPtr item, - UploadFileInfo fileToUpload); + void slotComputeTransmissionChecksum(OCC::SyncFileItemPtr item, + OCC::BulkPropagatorJob::UploadFileInfo fileToUpload); // transmission checksum computed, prepare the upload - void slotStartUpload(SyncFileItemPtr item, - UploadFileInfo fileToUpload, + void slotStartUpload(OCC::SyncFileItemPtr item, + OCC::BulkPropagatorJob::UploadFileInfo fileToUpload, const QByteArray &transmissionChecksumType, const QByteArray &transmissionChecksum); // invoked on internal error to unlock a folder and faile - void slotOnErrorStartFolderUnlock(SyncFileItemPtr item, - SyncFileItem::Status status, + void slotOnErrorStartFolderUnlock(OCC::SyncFileItemPtr item, + OCC::SyncFileItem::Status status, const QString &errorString); void slotPutFinished(); - void slotUploadProgress(SyncFileItemPtr item, qint64 sent, qint64 total); + void slotUploadProgress(OCC::SyncFileItemPtr item, qint64 sent, qint64 total); void slotJobDestroyed(QObject *job); @@ -111,7 +111,7 @@ private: const QString &errorString); /** Bases headers that need to be sent on the PUT, or in the MOVE for chunking-ng */ - QMap headers(SyncFileItemPtr item) const; + [[nodiscard]] QMap headers(SyncFileItemPtr item) const; void abortWithError(SyncFileItemPtr item, SyncFileItem::Status status, diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index da713b46c..1f4131e00 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -143,24 +143,27 @@ bool Capabilities::clientSideEncryptionAvailable() const } const auto version = properties.value(QStringLiteral("api-version"), "1.0").toByteArray(); - qCInfo(lcServerCapabilities) << "E2EE API version:" << version; const auto splittedVersion = version.split('.'); bool ok = false; const auto major = !splittedVersion.isEmpty() ? splittedVersion.at(0).toInt(&ok) : 0; if (!ok) { - qCWarning(lcServerCapabilities) << "Didn't understand version scheme (major), E2EE disabled"; + qCWarning(lcServerCapabilities) << "Didn't understand version scheme (major), E2EE disabled" << version; return false; } ok = false; const auto minor = splittedVersion.size() > 1 ? splittedVersion.at(1).toInt(&ok) : 0; if (!ok) { - qCWarning(lcServerCapabilities) << "Didn't understand version scheme (minor), E2EE disabled"; + qCWarning(lcServerCapabilities) << "Didn't understand version scheme (minor), E2EE disabled" << version; return false; } - return major == 1 && minor >= 1; + const auto capabilityAvailable = (major == 1 && minor >= 1); + if (!capabilityAvailable) { + qCInfo(lcServerCapabilities) << "Incompatible E2EE API version:" << version; + } + return capabilityAvailable; } bool Capabilities::notificationsAvailable() const diff --git a/src/libsync/capabilities.h b/src/libsync/capabilities.h index bbc2fd1b6..1029bcc5e 100644 --- a/src/libsync/capabilities.h +++ b/src/libsync/capabilities.h @@ -46,54 +46,54 @@ class OWNCLOUDSYNC_EXPORT Capabilities public: Capabilities(const QVariantMap &capabilities); - bool shareAPI() const; - bool shareEmailPasswordEnabled() const; - bool shareEmailPasswordEnforced() const; - bool sharePublicLink() const; - bool sharePublicLinkAllowUpload() const; - bool sharePublicLinkSupportsUploadOnly() const; - bool sharePublicLinkAskOptionalPassword() const; - bool sharePublicLinkEnforcePassword() const; - bool sharePublicLinkEnforceExpireDate() const; - int sharePublicLinkExpireDateDays() const; - bool shareInternalEnforceExpireDate() const; - int shareInternalExpireDateDays() const; - bool shareRemoteEnforceExpireDate() const; - int shareRemoteExpireDateDays() const; - bool sharePublicLinkMultiple() const; - bool shareResharing() const; - int shareDefaultPermissions() const; - bool chunkingNg() const; - bool bulkUpload() const; - bool filesLockAvailable() const; - bool userStatus() const; - bool userStatusSupportsEmoji() const; - QColor serverColor() const; - QColor serverTextColor() const; + [[nodiscard]] bool shareAPI() const; + [[nodiscard]] bool shareEmailPasswordEnabled() const; + [[nodiscard]] bool shareEmailPasswordEnforced() const; + [[nodiscard]] bool sharePublicLink() const; + [[nodiscard]] bool sharePublicLinkAllowUpload() const; + [[nodiscard]] bool sharePublicLinkSupportsUploadOnly() const; + [[nodiscard]] bool sharePublicLinkAskOptionalPassword() const; + [[nodiscard]] bool sharePublicLinkEnforcePassword() const; + [[nodiscard]] bool sharePublicLinkEnforceExpireDate() const; + [[nodiscard]] int sharePublicLinkExpireDateDays() const; + [[nodiscard]] bool shareInternalEnforceExpireDate() const; + [[nodiscard]] int shareInternalExpireDateDays() const; + [[nodiscard]] bool shareRemoteEnforceExpireDate() const; + [[nodiscard]] int shareRemoteExpireDateDays() const; + [[nodiscard]] bool sharePublicLinkMultiple() const; + [[nodiscard]] bool shareResharing() const; + [[nodiscard]] int shareDefaultPermissions() const; + [[nodiscard]] bool chunkingNg() const; + [[nodiscard]] bool bulkUpload() const; + [[nodiscard]] bool filesLockAvailable() const; + [[nodiscard]] bool userStatus() const; + [[nodiscard]] bool userStatusSupportsEmoji() const; + [[nodiscard]] QColor serverColor() const; + [[nodiscard]] QColor serverTextColor() const; /// Returns which kind of push notfications are available - PushNotificationTypes availablePushNotifications() const; + [[nodiscard]] PushNotificationTypes availablePushNotifications() const; /// Websocket url for files push notifications if available - QUrl pushNotificationsWebSocketUrl() const; + [[nodiscard]] QUrl pushNotificationsWebSocketUrl() const; /// disable parallel upload in chunking - bool chunkingParallelUploadDisabled() const; + [[nodiscard]] bool chunkingParallelUploadDisabled() const; /// Whether the "privatelink" DAV property is available - bool privateLinkPropertyAvailable() const; + [[nodiscard]] bool privateLinkPropertyAvailable() const; /// returns true if the capabilities report notifications - bool notificationsAvailable() const; + [[nodiscard]] bool notificationsAvailable() const; /// returns true if the server supports client side encryption - bool clientSideEncryptionAvailable() const; + [[nodiscard]] bool clientSideEncryptionAvailable() const; /// returns true if the capabilities are loaded already. - bool isValid() const; + [[nodiscard]] bool isValid() const; /// return true if the activity app is enabled - bool hasActivities() const; + [[nodiscard]] bool hasActivities() const; /** * Returns the checksum types the server understands. @@ -106,7 +106,7 @@ public: * Default: [] * Possible entries: "Adler32", "MD5", "SHA1" */ - QList supportedChecksumTypes() const; + [[nodiscard]] QList supportedChecksumTypes() const; /** * The checksum algorithm that the server recommends for file uploads. @@ -116,14 +116,14 @@ public: * Default: empty, meaning "no preference" * Possible values: empty or any of the supportedTypes */ - QByteArray preferredUploadChecksumType() const; + [[nodiscard]] QByteArray preferredUploadChecksumType() const; /** * Helper that returns the preferredUploadChecksumType() if set, or one * of the supportedChecksumTypes() if it isn't. May return an empty * QByteArray if no checksum types are supported. */ - QByteArray uploadChecksumType() const; + [[nodiscard]] QByteArray uploadChecksumType() const; /** * List of HTTP error codes should be guaranteed to eventually reset @@ -142,7 +142,7 @@ public: * Default: [] * Example: [503, 500] */ - QList httpErrorCodesThatResetFailingChunkedUploads() const; + [[nodiscard]] QList httpErrorCodesThatResetFailingChunkedUploads() const; /** * Regex that, if contained in a filename, will result in it not being uploaded. @@ -153,17 +153,17 @@ public: * * Note that it just needs to be contained. The regex [ab] is contained in "car". */ - QString invalidFilenameRegex() const; + [[nodiscard]] QString invalidFilenameRegex() const; /** * return the list of filename that should not be uploaded */ - QStringList blacklistedFiles() const; + [[nodiscard]] QStringList blacklistedFiles() const; /** * Whether conflict files should remain local (default) or should be uploaded. */ - bool uploadConflictFiles() const; + [[nodiscard]] bool uploadConflictFiles() const; // Direct Editing void addDirectEditor(DirectEditor* directEditor); @@ -171,7 +171,7 @@ public: DirectEditor* getDirectEditorForOptionalMimetype(const QMimeType &mimeType); private: - QMap serverThemingMap() const; + [[nodiscard]] QMap serverThemingMap() const; QVariantMap _capabilities; @@ -192,11 +192,11 @@ public: bool hasMimetype(const QMimeType &mimeType); bool hasOptionalMimetype(const QMimeType &mimeType); - QString id() const; - QString name() const; + [[nodiscard]] QString id() const; + [[nodiscard]] QString name() const; - QList mimeTypes() const; - QList optionalMimeTypes() const; + [[nodiscard]] QList mimeTypes() const; + [[nodiscard]] QList optionalMimeTypes() const; private: QString _id; diff --git a/src/libsync/caseclashconflictsolver.cpp b/src/libsync/caseclashconflictsolver.cpp new file mode 100644 index 000000000..f6f5b94be --- /dev/null +++ b/src/libsync/caseclashconflictsolver.cpp @@ -0,0 +1,227 @@ +/* + * Copyright 2021 (c) Felix Weilbach + * Copyright 2022 (c) Matthieu Gallien + * + * 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 "caseclashconflictsolver.h" + +#include "networkjobs.h" +#include "propagateremotemove.h" +#include "account.h" +#include "common/syncjournaldb.h" +#include "common/filesystembase.h" + +#include +#include +#include + +using namespace OCC; + +Q_LOGGING_CATEGORY(lcCaseClashConflictSolver, "nextcloud.sync.caseclash.solver", QtInfoMsg) + +CaseClashConflictSolver::CaseClashConflictSolver(const QString &targetFilePath, + const QString &conflictFilePath, + const QString &remotePath, + const QString &localPath, + AccountPtr account, + SyncJournalDb *journal, + QObject *parent) + : QObject{parent} + , _account(account) + , _targetFilePath(targetFilePath) + , _conflictFilePath(conflictFilePath) + , _remotePath(remotePath) + , _localPath(localPath) + , _journal(journal) +{ +#if !defined(QT_NO_DEBUG) + QFileInfo targetFileInfo(_targetFilePath); + Q_ASSERT(targetFileInfo.isAbsolute()); + Q_ASSERT(QFileInfo::exists(_conflictFilePath)); +#endif +} + +bool CaseClashConflictSolver::allowedToRename() const +{ + return _allowedToRename; +} + +QString CaseClashConflictSolver::errorString() const +{ + return _errorString; +} + +void CaseClashConflictSolver::solveConflict(const QString &newFilename) +{ + _newFilename = newFilename; + + const auto propfindJob = new PropfindJob(_account, QDir::cleanPath(remoteNewFilename())); + connect(propfindJob, &PropfindJob::result, this, &CaseClashConflictSolver::onRemoteDestinationFileAlreadyExists); + connect(propfindJob, &PropfindJob::finishedWithError, this, &CaseClashConflictSolver::onRemoteDestinationFileDoesNotExist); + propfindJob->start(); +} + +void CaseClashConflictSolver::onRemoteDestinationFileAlreadyExists() +{ + _allowedToRename = false; + emit allowedToRenameChanged(); + _errorString = tr("Cannot rename file because a file with the same name does already exist on the server. Please pick another name."); + emit errorStringChanged(); +} + +void CaseClashConflictSolver::onRemoteDestinationFileDoesNotExist() +{ + const auto propfindJob = new PropfindJob(_account, QDir::cleanPath(remoteTargetFilePath())); + connect(propfindJob, &PropfindJob::result, this, &CaseClashConflictSolver::onRemoteSourceFileAlreadyExists); + connect(propfindJob, &PropfindJob::finishedWithError, this, &CaseClashConflictSolver::onRemoteSourceFileDoesNotExist); + propfindJob->start(); +} + +void CaseClashConflictSolver::onPropfindPermissionSuccess(const QVariantMap &values) +{ + onCheckIfAllowedToRenameComplete(values); +} + +void CaseClashConflictSolver::onPropfindPermissionError(QNetworkReply *reply) +{ + onCheckIfAllowedToRenameComplete({}, reply); +} + +void CaseClashConflictSolver::onRemoteSourceFileAlreadyExists() +{ + const auto remoteSource = QDir::cleanPath(remoteTargetFilePath()); + const auto remoteDestionation = QDir::cleanPath(_account->davUrl().path() + remoteNewFilename()); + qCInfo(lcCaseClashConflictSolver) << "rename case clashing file from" << remoteSource << "to" << remoteDestionation; + const auto moveJob = new MoveJob(_account, remoteSource, remoteDestionation, this); + connect(moveJob, &MoveJob::finishedSignal, this, &CaseClashConflictSolver::onMoveJobFinished); + moveJob->start(); +} + +void CaseClashConflictSolver::onRemoteSourceFileDoesNotExist() +{ + Q_EMIT failed(); +} + +void CaseClashConflictSolver::onMoveJobFinished() +{ + const auto job = qobject_cast(sender()); + const auto error = job->reply()->error(); + + if (error != QNetworkReply::NoError) { + _errorString = tr("Could not rename file. Please make sure you are connected to the server."); + emit errorStringChanged(); + + emit failed(); + return; + } + + qCInfo(lcCaseClashConflictSolver) << "going to delete case clash conflict record" << _targetFilePath; + _journal->deleteCaseClashConflictByPathRecord(_targetFilePath); + + qCInfo(lcCaseClashConflictSolver) << "going to delete" << _conflictFilePath; + FileSystem::remove(_conflictFilePath); + + Q_EMIT done(); +} + +QString CaseClashConflictSolver::remoteNewFilename() const +{ + if (_remotePath == QStringLiteral("/")) { + qCDebug(lcCaseClashConflictSolver) << _newFilename << _remotePath << _newFilename; + return _newFilename; + } else { + const auto result = QString{_remotePath + _newFilename}; + qCDebug(lcCaseClashConflictSolver) << result << _remotePath << _newFilename; + return result; + } +} + +QString CaseClashConflictSolver::remoteTargetFilePath() const +{ + if (_remotePath == QStringLiteral("/")) { + const auto result = QString{_targetFilePath.mid(_localPath.length())}; + return result; + } else { + const auto result = QString{_remotePath + _targetFilePath.mid(_localPath.length())}; + return result; + } +} + +void CaseClashConflictSolver::onCheckIfAllowedToRenameComplete(const QVariantMap &values, QNetworkReply *reply) +{ + constexpr auto CONTENT_NOT_FOUND_ERROR = 404; + + const auto isAllowedToRename = [](const RemotePermissions remotePermissions) { + return remotePermissions.hasPermission(remotePermissions.CanRename) + && remotePermissions.hasPermission(remotePermissions.CanMove); + }; + + if (values.contains("permissions") && !isAllowedToRename(RemotePermissions::fromServerString(values["permissions"].toString()))) { + _allowedToRename = false; + emit allowedToRenameChanged(); + _errorString = tr("You don't have the permission to rename this file. Please ask the author of the file to rename it."); + emit errorStringChanged(); + + return; + } else if (reply && reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != CONTENT_NOT_FOUND_ERROR) { + _allowedToRename = false; + emit allowedToRenameChanged(); + _errorString = tr("Failed to fetch permissions with error %1").arg(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()); + emit errorStringChanged(); + + return; + } + + _allowedToRename = true; + emit allowedToRenameChanged(); + + const auto filePathFileInfo = QFileInfo(_newFilename); + const auto fileName = filePathFileInfo.fileName(); + processLeadingOrTrailingSpacesError(fileName); +} + +void CaseClashConflictSolver::processLeadingOrTrailingSpacesError(const QString &fileName) +{ + const auto hasLeadingSpaces = fileName.startsWith(QLatin1Char(' ')); + const auto hasTrailingSpaces = fileName.endsWith(QLatin1Char(' ')); + + if (hasLeadingSpaces || hasTrailingSpaces) { + if (hasLeadingSpaces && hasTrailingSpaces) { + _errorString = tr("Filename contains leading and trailing spaces."); + emit errorStringChanged(); + } else if (hasLeadingSpaces) { + _errorString = tr("Filename contains leading spaces."); + emit errorStringChanged(); + } else if (hasTrailingSpaces) { + _errorString = tr("Filename contains trailing spaces."); + emit errorStringChanged(); + } + + _allowedToRename = false; + emit allowedToRenameChanged(); + + return; + } + + _allowedToRename = true; + emit allowedToRenameChanged(); +} + +void CaseClashConflictSolver::checkIfAllowedToRename() +{ + const auto propfindJob = new PropfindJob(_account, QDir::cleanPath(remoteTargetFilePath())); + propfindJob->setProperties({ "http://owncloud.org/ns:permissions" }); + connect(propfindJob, &PropfindJob::result, this, &CaseClashConflictSolver::onPropfindPermissionSuccess); + connect(propfindJob, &PropfindJob::finishedWithError, this, &CaseClashConflictSolver::onPropfindPermissionError); + propfindJob->start(); +} diff --git a/src/libsync/caseclashconflictsolver.h b/src/libsync/caseclashconflictsolver.h new file mode 100644 index 000000000..d8f3ac11b --- /dev/null +++ b/src/libsync/caseclashconflictsolver.h @@ -0,0 +1,107 @@ +/* + * Copyright 2021 (c) Felix Weilbach + * Copyright 2022 (c) Matthieu Gallien + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include + +#include "accountfwd.h" +#include "owncloudlib.h" + +class QNetworkReply; + +namespace OCC { + +class SyncJournalDb; + +class OWNCLOUDSYNC_EXPORT CaseClashConflictSolver : public QObject +{ + Q_OBJECT + + Q_PROPERTY(bool allowedToRename READ allowedToRename NOTIFY allowedToRenameChanged) + + Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged) + +public: + explicit CaseClashConflictSolver(const QString &targetFilePath, + const QString &conflictFilePath, + const QString &remotePath, + const QString &localPath, + AccountPtr account, + SyncJournalDb *journal, + QObject *parent = nullptr); + + [[nodiscard]] bool allowedToRename() const; + + [[nodiscard]] QString errorString() const; + +signals: + void allowedToRenameChanged(); + + void errorStringChanged(); + + void done(); + + void failed(); + +public slots: + void solveConflict(const QString &newFilename); + + void checkIfAllowedToRename(); + +private slots: + void onRemoteDestinationFileAlreadyExists(); + + void onRemoteDestinationFileDoesNotExist(); + + void onPropfindPermissionSuccess(const QVariantMap &values); + + void onPropfindPermissionError(QNetworkReply *reply); + + void onRemoteSourceFileAlreadyExists(); + + void onRemoteSourceFileDoesNotExist(); + + void onMoveJobFinished(); + +private: + [[nodiscard]] QString remoteNewFilename() const; + + [[nodiscard]] QString remoteTargetFilePath() const; + + void onCheckIfAllowedToRenameComplete(const QVariantMap &values, QNetworkReply *reply = nullptr); + + void processLeadingOrTrailingSpacesError(const QString &fileName); + + AccountPtr _account; + + QString _targetFilePath; + + QString _conflictFilePath; + + QString _newFilename; + + QString _remotePath; + + QString _localPath; + + QString _errorString; + + SyncJournalDb *_journal = nullptr; + + bool _allowedToRename = false; +}; + +} diff --git a/src/libsync/clientsideencryption.cpp b/src/libsync/clientsideencryption.cpp index 7d056dd70..7cd3dd248 100644 --- a/src/libsync/clientsideencryption.cpp +++ b/src/libsync/clientsideencryption.cpp @@ -196,7 +196,9 @@ namespace { EVP_PKEY_CTX* _ctx = nullptr; }; - class PKey { + } + + class ClientSideEncryption::PKey { public: ~PKey() { @@ -255,6 +257,8 @@ namespace { EVP_PKEY* _pkey = nullptr; }; + namespace + { class X509Certificate { public: ~X509Certificate() @@ -619,7 +623,7 @@ QByteArray decryptStringSymmetric(const QByteArray& key, const QByteArray& data) QByteArray privateKeyToPem(const QByteArray key) { Bio privateKeyBio; BIO_write(privateKeyBio, key.constData(), key.size()); - auto pkey = PKey::readPrivateKey(privateKeyBio); + auto pkey = ClientSideEncryption::PKey::readPrivateKey(privateKeyBio); Bio pemBio; PEM_write_bio_PKCS8PrivateKey(pemBio, pkey, nullptr, nullptr, 0, nullptr, nullptr); @@ -628,6 +632,42 @@ QByteArray privateKeyToPem(const QByteArray key) { return pem; } +QByteArray encryptStringAsymmetric(const QSslKey key, const QByteArray &data) +{ + Q_ASSERT(!key.isNull()); + if (key.isNull()) { + qCDebug(lcCse) << "Public key is null. Could not encrypt."; + return {}; + } + Bio publicKeyBio; + const auto publicKeyPem = key.toPem(); + BIO_write(publicKeyBio, publicKeyPem.constData(), publicKeyPem.size()); + const auto publicKey = ClientSideEncryption::PKey::readPublicKey(publicKeyBio); + return EncryptionHelper::encryptStringAsymmetric(publicKey, data.toBase64()); +} + +QByteArray decryptStringAsymmetric(const QByteArray &privateKeyPem, const QByteArray &data) +{ + Q_ASSERT(!privateKeyPem.isEmpty()); + if (privateKeyPem.isEmpty()) { + qCDebug(lcCse) << "Private key is empty. Could not encrypt."; + return {}; + } + + Bio privateKeyBio; + BIO_write(privateKeyBio, privateKeyPem.constData(), privateKeyPem.size()); + const auto key = ClientSideEncryption::PKey::readPrivateKey(privateKeyBio); + + // Also base64 decode the result + const auto decryptResult = EncryptionHelper::decryptStringAsymmetric(key, QByteArray::fromBase64(data)); + + if (decryptResult.isEmpty()) { + qCDebug(lcCse()) << "ERROR. Could not decrypt data"; + return {}; + } + return QByteArray::fromBase64(decryptResult); +} + QByteArray encryptStringSymmetric(const QByteArray& key, const QByteArray& data) { QByteArray iv = generateRandom(16); @@ -906,7 +946,7 @@ bool ClientSideEncryption::checkServerPublicKeyValidity(const QByteArray &server void ClientSideEncryption::publicKeyFetched(Job *incoming) { - auto *readJob = static_cast(incoming); + auto *readJob = dynamic_cast(incoming); auto account = readJob->property(accountProperty).value(); Q_ASSERT(account); @@ -943,7 +983,7 @@ void ClientSideEncryption::publicKeyFetched(Job *incoming) void ClientSideEncryption::privateKeyFetched(Job *incoming) { - auto *readJob = static_cast(incoming); + auto *readJob = dynamic_cast(incoming); auto account = readJob->property(accountProperty).value(); Q_ASSERT(account); @@ -981,7 +1021,7 @@ void ClientSideEncryption::privateKeyFetched(Job *incoming) void ClientSideEncryption::mnemonicKeyFetched(QKeychain::Job *incoming) { - auto *readJob = static_cast(incoming); + auto *readJob = dynamic_cast(incoming); auto account = readJob->property(accountProperty).value(); Q_ASSERT(account); @@ -1060,22 +1100,78 @@ void ClientSideEncryption::writeMnemonic(const AccountPtr &account) void ClientSideEncryption::forgetSensitiveData(const AccountPtr &account) { - _privateKey = QByteArray(); - _certificate = QSslCertificate(); _publicKey = QSslKey(); - _mnemonic = QString(); - auto startDeleteJob = [account](QString user) { + const auto createDeleteJob = [account](const QString user) { auto *job = new DeletePasswordJob(Theme::instance()->appName()); job->setInsecureFallback(false); job->setKey(AbstractCredentials::keychainKey(account->url().toString(), user, account->id())); - job->start(); + return job; }; - auto user = account->credentials()->user(); - startDeleteJob(user + e2e_private); - startDeleteJob(user + e2e_cert); - startDeleteJob(user + e2e_mnemonic); + const auto user = account->credentials()->user(); + const auto deletePrivateKeyJob = createDeleteJob(user + e2e_private); + const auto deleteCertJob = createDeleteJob(user + e2e_cert); + const auto deleteMnemonicJob = createDeleteJob(user + e2e_mnemonic); + + connect(deletePrivateKeyJob, &DeletePasswordJob::finished, this, &ClientSideEncryption::handlePrivateKeyDeleted); + connect(deleteCertJob, &DeletePasswordJob::finished, this, &ClientSideEncryption::handleCertificateDeleted); + connect(deleteMnemonicJob, &DeletePasswordJob::finished, this, &ClientSideEncryption::handleMnemonicDeleted); + deletePrivateKeyJob->start(); + deleteCertJob->start(); + deleteMnemonicJob->start(); +} + +void ClientSideEncryption::handlePrivateKeyDeleted(const QKeychain::Job* const incoming) +{ + if (incoming->error() != QKeychain::NoError) { + qCWarning(lcCse) << "Private key could not be deleted:" << incoming->errorString(); + return; + } + + qCDebug(lcCse) << "Private key successfully deleted from keychain. Clearing."; + _privateKey = QByteArray(); + Q_EMIT privateKeyDeleted(); + checkAllSensitiveDataDeleted(); +} + +void ClientSideEncryption::handleCertificateDeleted(const QKeychain::Job* const incoming) +{ + if (incoming->error() != QKeychain::NoError) { + qCWarning(lcCse) << "Certificate could not be deleted:" << incoming->errorString(); + return; + } + + qCDebug(lcCse) << "Certificate successfully deleted from keychain. Clearing."; + _certificate = QSslCertificate(); + Q_EMIT certificateDeleted(); + checkAllSensitiveDataDeleted(); +} + +void ClientSideEncryption::handleMnemonicDeleted(const QKeychain::Job* const incoming) +{ + if (incoming->error() != QKeychain::NoError) { + qCWarning(lcCse) << "Mnemonic could not be deleted:" << incoming->errorString(); + return; + } + + qCDebug(lcCse) << "Mnemonic successfully deleted from keychain. Clearing."; + _mnemonic = QString(); + Q_EMIT mnemonicDeleted(); + checkAllSensitiveDataDeleted(); +} + +void ClientSideEncryption::checkAllSensitiveDataDeleted() +{ + if (_privateKey.isEmpty() && _certificate.isNull() && _mnemonic.isEmpty()) { + qCDebug(lcCse) << "All sensitive encryption data has been deleted."; + Q_EMIT sensitiveDataForgotten(); + } + + qCDebug(lcCse) << "Some sensitive data emaining:" + << "Private key:" << _privateKey + << "Certificate is null:" << _certificate.isNull() + << "Mnemonic:" << _mnemonic; } void ClientSideEncryption::generateKeyPair(const AccountPtr &account) @@ -1118,10 +1214,10 @@ void ClientSideEncryption::generateKeyPair(const AccountPtr &account) _privateKey = key; qCInfo(lcCse()) << "Keys generated correctly, sending to server."; - generateCSR(account, localKeyPair); + generateCSR(account, std::move(localKeyPair)); } -void ClientSideEncryption::generateCSR(const AccountPtr &account, EVP_PKEY *keyPair) +void ClientSideEncryption::generateCSR(const AccountPtr &account, PKey keyPair) { // OpenSSL expects const char. auto cnArray = account->davUser().toLocal8Bit(); @@ -1176,14 +1272,33 @@ void ClientSideEncryption::generateCSR(const AccountPtr &account, EVP_PKEY *keyP qCInfo(lcCse()) << "Returning the certificate"; qCInfo(lcCse()) << output; + sendSignRequestCSR(account, std::move(keyPair), output); +} + +void ClientSideEncryption::sendSignRequestCSR(const AccountPtr &account, PKey keyPair, const QByteArray &csrContent) +{ auto job = new SignPublicKeyApiJob(account, e2eeBaseUrl() + "public-key", this); - job->setCsr(output); + job->setCsr(csrContent); - connect(job, &SignPublicKeyApiJob::jsonReceived, [this, account](const QJsonDocument& json, int retCode) { + connect(job, &SignPublicKeyApiJob::jsonReceived, [this, account, keyPair = std::move(keyPair)](const QJsonDocument& json, const int retCode) { if (retCode == 200) { - QString cert = json.object().value("ocs").toObject().value("data").toObject().value("public-key").toString(); + const auto cert = json.object().value("ocs").toObject().value("data").toObject().value("public-key").toString(); _certificate = QSslCertificate(cert.toLocal8Bit(), QSsl::Pem); _publicKey = _certificate.publicKey(); + Bio certificateBio; + const auto certificatePem = _certificate.toPem(); + BIO_write(certificateBio, certificatePem.constData(), certificatePem.size()); + const auto x509Certificate = X509Certificate::readCertificate(certificateBio); + if (!X509_check_private_key(x509Certificate, keyPair)) { + auto lastError = ERR_get_error(); + while (lastError) { + qCInfo(lcCse()) << ERR_lib_error_string(lastError); + lastError = ERR_get_error(); + } + forgetSensitiveData(account); + return; + } + qCInfo(lcCse()) << "received a valid certificate"; fetchAndValidatePublicKeyFromServer(account); } qCInfo(lcCse()) << retCode; @@ -1225,7 +1340,13 @@ void ClientSideEncryption::encryptPrivateKey(const AccountPtr &account) } void ClientSideEncryption::decryptPrivateKey(const AccountPtr &account, const QByteArray &key) { - QString msg = tr("Please enter your End-to-End encryption passphrase:
" + if (!account->askUserForMnemonic()) { + qCDebug(lcCse) << "Not allowed to ask user for mnemonic"; + emit initializationFinished(); + return; + } + + QString msg = tr("Please enter your end-to-end encryption passphrase:
" "
" "Username: %2
" "Account: %3
") @@ -1390,6 +1511,12 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata) QJsonDocument metaDataDoc = QJsonDocument::fromJson(metaDataStr.toLocal8Bit()); QJsonObject metadataObj = metaDataDoc.object()["metadata"].toObject(); QJsonObject metadataKeys = metadataObj["metadataKeys"].toObject(); + + if (metadataKeys.isEmpty()) { + qCDebug(lcCse()) << "Could not setup existing metadata with missing metadataKeys!"; + return; + } + QByteArray sharing = metadataObj["sharing"].toString().toLocal8Bit(); QJsonObject files = metaDataDoc.object()["files"].toObject(); @@ -1418,14 +1545,19 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata) // Cool, We actually have the key, we can decrypt the rest of the metadata. qCDebug(lcCse) << "Sharing: " << sharing; if (sharing.size()) { - auto sharingDecrypted = decryptJsonObject(sharing, _metadataKeys.last()); - qCDebug(lcCse) << "Sharing Decrypted" << sharingDecrypted; - - //Sharing is also a JSON object, so extract it and populate. - auto sharingDoc = QJsonDocument::fromJson(sharingDecrypted); - auto sharingObj = sharingDoc.object(); - for (auto it = sharingObj.constBegin(), end = sharingObj.constEnd(); it != end; it++) { - _sharing.push_back({it.key(), it.value().toString()}); + const auto metaDataKey = !_metadataKeys.isEmpty() ? _metadataKeys.last() : QByteArray{}; + if (metaDataKey.isEmpty()) { + qCDebug(lcCse) << "Failed to decrypt sharing! Empty metadata key!"; + } else { + auto sharingDecrypted = decryptJsonObject(sharing, metaDataKey); + qCDebug(lcCse) << "Sharing Decrypted" << sharingDecrypted; + + // Sharing is also a JSON object, so extract it and populate. + auto sharingDoc = QJsonDocument::fromJson(sharingDecrypted); + auto sharingObj = sharingDoc.object(); + for (auto it = sharingObj.constBegin(), end = sharingObj.constEnd(); it != end; it++) { + _sharing.push_back({it.key(), it.value().toString()}); + } } } else { qCDebug(lcCse) << "Skipping sharing section since it is empty"; @@ -1441,9 +1573,9 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata) file.initializationVector = QByteArray::fromBase64(fileObj["initializationVector"].toString().toLocal8Bit()); //Decrypt encrypted part - QByteArray key = _metadataKeys[file.metadataKey]; + const auto key = _metadataKeys.value(file.metadataKey, {}); auto encryptedFile = fileObj["encrypted"].toString().toLocal8Bit(); - auto decryptedFile = decryptJsonObject(encryptedFile, key); + auto decryptedFile = !key.isEmpty() ? decryptJsonObject(encryptedFile, key) : QByteArray{}; auto decryptedFileDoc = QJsonDocument::fromJson(decryptedFile); auto decryptedFileObj = decryptedFileDoc.object(); @@ -1467,7 +1599,7 @@ QByteArray FolderMetadata::encryptMetadataKey(const QByteArray& data) const Bio publicKeyBio; QByteArray publicKeyPem = _account->e2e()->_publicKey.toPem(); BIO_write(publicKeyBio, publicKeyPem.constData(), publicKeyPem.size()); - auto publicKey = PKey::readPublicKey(publicKeyBio); + auto publicKey = ClientSideEncryption::PKey::readPublicKey(publicKeyBio); // The metadata key is binary so base64 encode it first return EncryptionHelper::encryptStringAsymmetric(publicKey, data.toBase64()); @@ -1478,7 +1610,7 @@ QByteArray FolderMetadata::decryptMetadataKey(const QByteArray& encryptedMetadat Bio privateKeyBio; QByteArray privateKeyPem = _account->e2e()->_privateKey; BIO_write(privateKeyBio, privateKeyPem.constData(), privateKeyPem.size()); - auto key = PKey::readPrivateKey(privateKeyBio); + auto key = ClientSideEncryption::PKey::readPrivateKey(privateKeyBio); // Also base64 decode the result QByteArray decryptResult = EncryptionHelper::decryptStringAsymmetric( @@ -1503,6 +1635,11 @@ QByteArray FolderMetadata::decryptJsonObject(const QByteArray& encryptedMetadata return EncryptionHelper::decryptStringSymmetric(pass, encryptedMetadata); } +bool FolderMetadata::isMetadataSetup() const +{ + return !_metadataKeys.isEmpty(); +} + void FolderMetadata::setupEmptyMetadata() { qCDebug(lcCse) << "Settint up empty metadata"; QByteArray newMetadataPass = EncryptionHelper::generateRandom(16); @@ -1517,6 +1654,11 @@ void FolderMetadata::setupEmptyMetadata() { QByteArray FolderMetadata::encryptedMetadata() { qCDebug(lcCse) << "Generating metadata"; + if (_metadataKeys.isEmpty()) { + qCDebug(lcCse) << "Metadata generation failed! Empty metadata key!"; + return {}; + } + QJsonObject metadataKeys; for (auto it = _metadataKeys.constBegin(), end = _metadataKeys.constEnd(); it != end; it++) { /* @@ -1527,16 +1669,6 @@ QByteArray FolderMetadata::encryptedMetadata() { metadataKeys.insert(QString::number(it.key()), QString(encryptedKey)); } - /* NO SHARING IN V1 - QJsonObject recepients; - for (auto it = _sharing.constBegin(), end = _sharing.constEnd(); it != end; it++) { - recepients.insert(it->first, it->second); - } - QJsonDocument recepientDoc; - recepientDoc.setObject(recepients); - QString sharingEncrypted = encryptJsonObject(recepientDoc.toJson(QJsonDocument::Compact), _metadataKeys.last()); - */ - QJsonObject metadata = { {"metadataKeys", metadataKeys}, // {"sharing", sharingEncrypted}, diff --git a/src/libsync/clientsideencryption.h b/src/libsync/clientsideencryption.h index 9163a3864..239bf877e 100644 --- a/src/libsync/clientsideencryption.h +++ b/src/libsync/clientsideencryption.h @@ -47,6 +47,8 @@ namespace EncryptionHelper { const QByteArray& key, const QByteArray& data ); + OWNCLOUDSYNC_EXPORT QByteArray encryptStringAsymmetric(const QSslKey key, const QByteArray &data); + OWNCLOUDSYNC_EXPORT QByteArray decryptStringAsymmetric(const QByteArray &privateKeyPem, const QByteArray &data); QByteArray privateKeyToPem(const QByteArray key); @@ -99,8 +101,8 @@ public: QByteArray chunkDecryption(const char *input, quint64 chunkSize); - bool isInitialized() const; - bool isFinished() const; + [[nodiscard]] bool isInitialized() const; + [[nodiscard]] bool isFinished() const; private: Q_DISABLE_COPY(StreamingDecryptor) @@ -116,48 +118,58 @@ private: class OWNCLOUDSYNC_EXPORT ClientSideEncryption : public QObject { Q_OBJECT public: + class PKey; + ClientSideEncryption(); - void initialize(const AccountPtr &account); -private: - void generateKeyPair(const AccountPtr &account); - void generateCSR(const AccountPtr &account, EVP_PKEY *keyPair); - void encryptPrivateKey(const AccountPtr &account); + QByteArray _privateKey; + QSslKey _publicKey; + QSslCertificate _certificate; + QString _mnemonic; + bool _newMnemonicGenerated = false; -public: +signals: + void initializationFinished(bool isNewMnemonicGenerated = false); + void sensitiveDataForgotten(); + void privateKeyDeleted(); + void certificateDeleted(); + void mnemonicDeleted(); + +public slots: + void initialize(const AccountPtr &account); void forgetSensitiveData(const AccountPtr &account); private slots: + void generateKeyPair(const AccountPtr &account); + void encryptPrivateKey(const AccountPtr &account); + void publicKeyFetched(QKeychain::Job *incoming); void privateKeyFetched(QKeychain::Job *incoming); void mnemonicKeyFetched(QKeychain::Job *incoming); -signals: - void initializationFinished(bool isNewMnemonicGenerated = false); + void handlePrivateKeyDeleted(const QKeychain::Job* const incoming); + void handleCertificateDeleted(const QKeychain::Job* const incoming); + void handleMnemonicDeleted(const QKeychain::Job* const incoming); + void checkAllSensitiveDataDeleted(); -private: void getPrivateKeyFromServer(const AccountPtr &account); void getPublicKeyFromServer(const AccountPtr &account); void fetchAndValidatePublicKeyFromServer(const AccountPtr &account); void decryptPrivateKey(const AccountPtr &account, const QByteArray &key); void fetchFromKeyChain(const AccountPtr &account); - - bool checkPublicKeyValidity(const AccountPtr &account) const; - bool checkServerPublicKeyValidity(const QByteArray &serverPublicKeyString) const; void writePrivateKey(const AccountPtr &account); void writeCertificate(const AccountPtr &account); void writeMnemonic(const AccountPtr &account); - bool isInitialized = false; +private: + void generateCSR(const AccountPtr &account, PKey keyPair); + void sendSignRequestCSR(const AccountPtr &account, PKey keyPair, const QByteArray &csrContent); -public: - //QSslKey _privateKey; - QByteArray _privateKey; - QSslKey _publicKey; - QSslCertificate _certificate; - QString _mnemonic; - bool _newMnemonicGenerated = false; + [[nodiscard]] bool checkPublicKeyValidity(const AccountPtr &account) const; + [[nodiscard]] bool checkServerPublicKeyValidity(const QByteArray &serverPublicKeyString) const; + + bool isInitialized = false; }; /* Generates the Metadata for the folder */ @@ -179,7 +191,8 @@ public: void addEncryptedFile(const EncryptedFile& f); void removeEncryptedFile(const EncryptedFile& f); void removeAllEncryptedFiles(); - QVector files() const; + [[nodiscard]] QVector files() const; + [[nodiscard]] bool isMetadataSetup() const; private: @@ -189,11 +202,11 @@ private: void setupEmptyMetadata(); void setupExistingMetadata(const QByteArray& metadata); - QByteArray encryptMetadataKey(const QByteArray& metadataKey) const; - QByteArray decryptMetadataKey(const QByteArray& encryptedKey) const; + [[nodiscard]] QByteArray encryptMetadataKey(const QByteArray& metadataKey) const; + [[nodiscard]] QByteArray decryptMetadataKey(const QByteArray& encryptedKey) const; - QByteArray encryptJsonObject(const QByteArray& obj, const QByteArray pass) const; - QByteArray decryptJsonObject(const QByteArray& encryptedJsonBlob, const QByteArray& pass) const; + [[nodiscard]] QByteArray encryptJsonObject(const QByteArray& obj, const QByteArray pass) const; + [[nodiscard]] QByteArray decryptJsonObject(const QByteArray& encryptedJsonBlob, const QByteArray& pass) const; QVector _files; QMap _metadataKeys; diff --git a/src/libsync/clientsideencryptionjobs.cpp b/src/libsync/clientsideencryptionjobs.cpp index 71bb8a510..2e52a02a9 100644 --- a/src/libsync/clientsideencryptionjobs.cpp +++ b/src/libsync/clientsideencryptionjobs.cpp @@ -17,6 +17,7 @@ #include "clientsideencryptionjobs.h" #include "theme.h" #include "creds/abstractcredentials.h" +#include "common/syncjournaldb.h" Q_LOGGING_CATEGORY(lcSignPublicKeyApiJob, "nextcloud.sync.networkjob.sendcsr", QtInfoMsg) Q_LOGGING_CATEGORY(lcStorePrivateKeyApiJob, "nextcloud.sync.networkjob.storeprivatekey", QtInfoMsg) @@ -153,8 +154,12 @@ bool UpdateMetadataApiJob::finished() UnlockEncryptFolderApiJob::UnlockEncryptFolderApiJob(const AccountPtr& account, const QByteArray& fileId, const QByteArray& token, + SyncJournalDb *journalDb, QObject* parent) -: AbstractNetworkJob(account, e2eeBaseUrl() + QStringLiteral("lock/") + fileId, parent), _fileId(fileId), _token(token) + : AbstractNetworkJob(account, e2eeBaseUrl() + QStringLiteral("lock/") + fileId, parent) + , _fileId(fileId) + , _token(token) + , _journalDb(journalDb) { } @@ -169,15 +174,26 @@ void UnlockEncryptFolderApiJob::start() AbstractNetworkJob::start(); qCInfo(lcCseJob()) << "Starting the request to unlock."; + + qCInfo(lcCseJob()) << "unlock folder started for:" << path() << " for fileId: " << _fileId; } bool UnlockEncryptFolderApiJob::finished() { int retCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + qCInfo(lcCseJob()) << "unlock folder finished with code" << retCode << " for:" << path() << " for fileId: " << _fileId; + + if (retCode != 0) { + _journalDb->deleteE2EeLockedFolder(_fileId); + } + + emit done(); + if (retCode != 200) { qCInfo(lcCseJob()) << "error unlocking file" << path() << errorString() << retCode; qCInfo(lcCseJob()) << "Full Error Log" << reply()->readAll(); - emit error(_fileId, retCode); + emit error(_fileId, retCode, errorString()); return true; } emit success(_fileId); @@ -217,13 +233,33 @@ bool DeleteMetadataApiJob::finished() return true; } -LockEncryptFolderApiJob::LockEncryptFolderApiJob(const AccountPtr& account, const QByteArray& fileId, QObject* parent) -: AbstractNetworkJob(account, e2eeBaseUrl() + QStringLiteral("lock/") + fileId, parent), _fileId(fileId) +LockEncryptFolderApiJob::LockEncryptFolderApiJob(const AccountPtr &account, + const QByteArray &fileId, + SyncJournalDb *journalDb, + const QSslKey publicKey, + QObject *parent) + : AbstractNetworkJob(account, e2eeBaseUrl() + QStringLiteral("lock/") + fileId, parent) + , _fileId(fileId) + , _journalDb(journalDb) + , _publicKey(publicKey) { } void LockEncryptFolderApiJob::start() { + const auto folderTokenEncrypted = _journalDb->e2EeLockedFolder(_fileId); + + if (!folderTokenEncrypted.isEmpty()) { + qCInfo(lcCseJob()) << "lock folder started for:" << path() << " for fileId: " << _fileId << " but we need to first lift the previous lock"; + const auto folderToken = EncryptionHelper::decryptStringAsymmetric(_account->e2e()->_privateKey, folderTokenEncrypted); + const auto unlockJob = new OCC::UnlockEncryptFolderApiJob(_account, _fileId, folderToken, _journalDb, this); + connect(unlockJob, &UnlockEncryptFolderApiJob::done, this, [this]() { + this->start(); + }); + unlockJob->start(); + return; + } + QNetworkRequest req; req.setRawHeader("OCS-APIREQUEST", "true"); QUrlQuery query; @@ -234,23 +270,32 @@ void LockEncryptFolderApiJob::start() qCInfo(lcCseJob()) << "locking the folder with id" << _fileId << "as encrypted"; sendRequest("POST", url, req); AbstractNetworkJob::start(); + + qCInfo(lcCseJob()) << "lock folder started for:" << path() << " for fileId: " << _fileId; } bool LockEncryptFolderApiJob::finished() { int retCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (retCode != 200) { qCInfo(lcCseJob()) << "error locking file" << path() << errorString() << retCode; - emit error(_fileId, retCode); + emit error(_fileId, retCode, errorString()); + qCInfo(lcCseJob()) << "lock folder finished with code" << retCode << " for:" << path() << " for fileId: " << _fileId; return true; } QJsonParseError error; - auto json = QJsonDocument::fromJson(reply()->readAll(), &error); - auto obj = json.object().toVariantMap(); - auto token = obj["ocs"].toMap()["data"].toMap()["e2e-token"].toByteArray(); + const auto json = QJsonDocument::fromJson(reply()->readAll(), &error); + const auto obj = json.object().toVariantMap(); + const auto token = obj["ocs"].toMap()["data"].toMap()["e2e-token"].toByteArray(); qCInfo(lcCseJob()) << "got json:" << token; + qCInfo(lcCseJob()) << "lock folder finished with code" << retCode << " for:" << path() << " for fileId: " << _fileId << " token:" << token; + + const auto folderTokenEncrypted = EncryptionHelper::encryptStringAsymmetric(_publicKey, token); + _journalDb->setE2EeLockedFolder(_fileId, folderTokenEncrypted); + //TODO: Parse the token and submit. emit success(_fileId, token); return true; @@ -282,7 +327,7 @@ bool SetEncryptionFlagApiJob::finished() emit success(_fileId); } else { qCInfo(lcCseJob()) << "Setting the encrypted flag failed with" << path() << errorString() << retCode; - emit error(_fileId, retCode); + emit error(_fileId, retCode, errorString()); } return true; } diff --git a/src/libsync/clientsideencryptionjobs.h b/src/libsync/clientsideencryptionjobs.h index 1ab38fa5c..f5cf6fbb6 100644 --- a/src/libsync/clientsideencryptionjobs.h +++ b/src/libsync/clientsideencryptionjobs.h @@ -5,6 +5,7 @@ #include "accountfwd.h" #include #include +#include namespace OCC { /* Here are all of the network jobs for the client side encryption. @@ -24,6 +25,8 @@ namespace OCC { * * @ingroup libsync */ + +class SyncJournalDb; class OWNCLOUDSYNC_EXPORT SignPublicKeyApiJob : public AbstractNetworkJob { Q_OBJECT @@ -129,7 +132,9 @@ protected: signals: void success(const QByteArray &fileId); - void error(const QByteArray &fileId, int httpReturnCode); + void error(const QByteArray &fileId, + const int httpReturnCode, + const QString &errorMessage); private: QByteArray _fileId; @@ -140,7 +145,7 @@ class OWNCLOUDSYNC_EXPORT LockEncryptFolderApiJob : public AbstractNetworkJob { Q_OBJECT public: - explicit LockEncryptFolderApiJob(const AccountPtr &account, const QByteArray& fileId, QObject *parent = nullptr); + explicit LockEncryptFolderApiJob(const AccountPtr &account, const QByteArray &fileId, SyncJournalDb *journalDb, const QSslKey publicKey, QObject *parent = nullptr); public slots: void start() override; @@ -150,10 +155,14 @@ protected: signals: void success(const QByteArray& fileId, const QByteArray& token); - void error(const QByteArray& fileId, int httpdErrorCode); + void error(const QByteArray& fileId, + const int httpErrorCode, + const QString &errorMessage); private: QByteArray _fileId; + QPointer _journalDb; + QSslKey _publicKey; }; @@ -165,6 +174,7 @@ public: const AccountPtr &account, const QByteArray& fileId, const QByteArray& token, + SyncJournalDb *journalDb, QObject *parent = nullptr); public slots: @@ -175,12 +185,16 @@ protected: signals: void success(const QByteArray& fileId); - void error(const QByteArray& fileId, int httpReturnCode); + void error(const QByteArray& fileId, + const int httpReturnCode, + const QString &errorMessage); + void done(); private: QByteArray _fileId; QByteArray _token; QBuffer *_tokenBuf; + QPointer _journalDb; }; diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index 79ea92e83..c2c2cbca0 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -51,6 +51,58 @@ namespace { static constexpr char showMainDialogAsNormalWindowC[] = "showMainDialogAsNormalWindow"; +static constexpr char showConfigBackupWarningC[] = "showConfigBackupWarning"; + +static constexpr char remotePollIntervalC[] = "remotePollInterval"; +static constexpr char forceSyncIntervalC[] = "forceSyncInterval"; +static constexpr char fullLocalDiscoveryIntervalC[] = "fullLocalDiscoveryInterval"; +static constexpr char notificationRefreshIntervalC[] = "notificationRefreshInterval"; +static constexpr char monoIconsC[] = "monoIcons"; +static constexpr char promptDeleteC[] = "promptDeleteAllFiles"; +static constexpr char crashReporterC[] = "crashReporter"; +static constexpr char optionalServerNotificationsC[] = "optionalServerNotifications"; +static constexpr char showCallNotificationsC[] = "showCallNotifications"; +static constexpr char showInExplorerNavigationPaneC[] = "showInExplorerNavigationPane"; +static constexpr char skipUpdateCheckC[] = "skipUpdateCheck"; +static constexpr char autoUpdateCheckC[] = "autoUpdateCheck"; +static constexpr char updateCheckIntervalC[] = "updateCheckInterval"; +static constexpr char updateSegmentC[] = "updateSegment"; +static constexpr char updateChannelC[] = "updateChannel"; +static constexpr char overrideServerUrlC[] = "overrideServerUrl"; +static constexpr char overrideLocalDirC[] = "overrideLocalDir"; +static constexpr char geometryC[] = "geometry"; +static constexpr char timeoutC[] = "timeout"; +static constexpr char chunkSizeC[] = "chunkSize"; +static constexpr char minChunkSizeC[] = "minChunkSize"; +static constexpr char maxChunkSizeC[] = "maxChunkSize"; +static constexpr char targetChunkUploadDurationC[] = "targetChunkUploadDuration"; +static constexpr char automaticLogDirC[] = "logToTemporaryLogDir"; +static constexpr char logDirC[] = "logDir"; +static constexpr char logDebugC[] = "logDebug"; +static constexpr char logExpireC[] = "logExpire"; +static constexpr char logFlushC[] = "logFlush"; +static constexpr char showExperimentalOptionsC[] = "showExperimentalOptions"; +static constexpr char clientVersionC[] = "clientVersion"; + +static constexpr char proxyHostC[] = "Proxy/host"; +static constexpr char proxyTypeC[] = "Proxy/type"; +static constexpr char proxyPortC[] = "Proxy/port"; +static constexpr char proxyUserC[] = "Proxy/user"; +static constexpr char proxyPassC[] = "Proxy/pass"; +static constexpr char proxyNeedsAuthC[] = "Proxy/needsAuth"; + +static constexpr char useUploadLimitC[] = "BWLimit/useUploadLimit"; +static constexpr char useDownloadLimitC[] = "BWLimit/useDownloadLimit"; +static constexpr char uploadLimitC[] = "BWLimit/uploadLimit"; +static constexpr char downloadLimitC[] = "BWLimit/downloadLimit"; + +static constexpr char newBigFolderSizeLimitC[] = "newBigFolderSizeLimit"; +static constexpr char useNewBigFolderSizeLimitC[] = "useNewBigFolderSizeLimit"; +static constexpr char confirmExternalStorageC[] = "confirmExternalStorage"; +static constexpr char moveToTrashC[] = "moveToTrash"; + +static constexpr char certPath[] = "http_certificatePath"; +static constexpr char certPasswd[] = "http_certificatePasswd"; } namespace OCC { @@ -59,55 +111,6 @@ namespace chrono = std::chrono; Q_LOGGING_CATEGORY(lcConfigFile, "nextcloud.sync.configfile", QtInfoMsg) -//static const char caCertsKeyC[] = "CaCertificates"; only used from account.cpp -static const char remotePollIntervalC[] = "remotePollInterval"; -static const char forceSyncIntervalC[] = "forceSyncInterval"; -static const char fullLocalDiscoveryIntervalC[] = "fullLocalDiscoveryInterval"; -static const char notificationRefreshIntervalC[] = "notificationRefreshInterval"; -static const char monoIconsC[] = "monoIcons"; -static const char promptDeleteC[] = "promptDeleteAllFiles"; -static const char crashReporterC[] = "crashReporter"; -static const char optionalServerNotificationsC[] = "optionalServerNotifications"; -static const char showCallNotificationsC[] = "showCallNotifications"; -static const char showInExplorerNavigationPaneC[] = "showInExplorerNavigationPane"; -static const char skipUpdateCheckC[] = "skipUpdateCheck"; -static const char autoUpdateCheckC[] = "autoUpdateCheck"; -static const char updateCheckIntervalC[] = "updateCheckInterval"; -static const char updateSegmentC[] = "updateSegment"; -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 logDirC[] = "logDir"; -static const char logDebugC[] = "logDebug"; -static const char logExpireC[] = "logExpire"; -static const char logFlushC[] = "logFlush"; -static const char showExperimentalOptionsC[] = "showExperimentalOptions"; -static const char clientVersionC[] = "clientVersion"; - -static const char proxyHostC[] = "Proxy/host"; -static const char proxyTypeC[] = "Proxy/type"; -static const char proxyPortC[] = "Proxy/port"; -static const char proxyUserC[] = "Proxy/user"; -static const char proxyPassC[] = "Proxy/pass"; -static const char proxyNeedsAuthC[] = "Proxy/needsAuth"; - -static const char useUploadLimitC[] = "BWLimit/useUploadLimit"; -static const char useDownloadLimitC[] = "BWLimit/useDownloadLimit"; -static const char uploadLimitC[] = "BWLimit/uploadLimit"; -static const char downloadLimitC[] = "BWLimit/downloadLimit"; - -static const char newBigFolderSizeLimitC[] = "newBigFolderSizeLimit"; -static const char useNewBigFolderSizeLimitC[] = "useNewBigFolderSizeLimit"; -static const char confirmExternalStorageC[] = "confirmExternalStorage"; -static const char moveToTrashC[] = "moveToTrash"; - -const char certPath[] = "http_certificatePath"; -const char certPasswd[] = "http_certificatePasswd"; QString ConfigFile::_confDir = QString(); bool ConfigFile::_askedUser = false; @@ -428,28 +431,37 @@ QString ConfigFile::excludeFileFromSystem() return fi.absoluteFilePath(); } -QString ConfigFile::backup() const +QString ConfigFile::backup(const QString &fileName) const { - QString baseFile = configFile(); + const QString baseFilePath = configPath() + fileName; auto versionString = clientVersionString(); - if (!versionString.isEmpty()) + + if (!versionString.isEmpty()) { versionString.prepend('_'); + } + QString backupFile = QString("%1.backup_%2%3") - .arg(baseFile) + .arg(baseFilePath) .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); + // QFile does not overwrite backupFile + if(!QFile::copy(baseFilePath, backupFile)) { + qCWarning(lcConfigFile) << "Failed to create a backup of the config file" << baseFilePath; } + return backupFile; } +bool ConfigFile::showConfigBackupWarning() const +{ + return getValue(showConfigBackupWarningC, QString(), false).toBool(); +} + QString ConfigFile::configFile() const { return configPath() + Theme::instance()->configFileName(); @@ -688,6 +700,30 @@ void ConfigFile::setUpdateChannel(const QString &channel) settings.setValue(QLatin1String(updateChannelC), channel); } +[[nodiscard]] QString ConfigFile::overrideServerUrl() const +{ + QSettings settings(configFile(), QSettings::IniFormat); + return settings.value(QLatin1String(overrideServerUrlC), {}).toString(); +} + +void ConfigFile::setOverrideServerUrl(const QString &url) +{ + QSettings settings(configFile(), QSettings::IniFormat); + settings.setValue(QLatin1String(overrideServerUrlC), url); +} + +[[nodiscard]] QString ConfigFile::overrideLocalDir() const +{ + QSettings settings(configFile(), QSettings::IniFormat); + return settings.value(QLatin1String(overrideLocalDirC), {}).toString(); +} + +void ConfigFile::setOverrideLocalDir(const QString &localDir) +{ + QSettings settings(configFile(), QSettings::IniFormat); + settings.setValue(QLatin1String(overrideLocalDirC), localDir); +} + void ConfigFile::setProxyType(int proxyType, const QString &host, int port, bool needsAuth, diff --git a/src/libsync/configfile.h b/src/libsync/configfile.h index cf5716770..9284d4ea2 100644 --- a/src/libsync/configfile.h +++ b/src/libsync/configfile.h @@ -43,21 +43,25 @@ public: enum Scope { UserScope, SystemScope }; - QString configPath() const; - QString configFile() const; - QString excludeFile(Scope scope) const; + [[nodiscard]] QString configPath() const; + [[nodiscard]] QString configFile() const; + [[nodiscard]] QString excludeFile(Scope scope) const; static QString excludeFileFromSystem(); // doesn't access config dir /** - * Creates a backup of the file + * Creates a backup of any given fileName in the config folder * * Returns the path of the new backup. */ - QString backup() const; + [[nodiscard]] QString backup(const QString &fileName) const; + /** + * Display warning with a list of the config files that were backed up + */ + [[nodiscard]] bool showConfigBackupWarning() const; bool exists(); - QString defaultConnection() const; + [[nodiscard]] QString defaultConnection() const; // the certs do not depend on a connection. QByteArray caCerts(); @@ -66,49 +70,49 @@ public: bool passwordStorageAllowed(const QString &connection = QString()); /* Server poll interval in milliseconds */ - std::chrono::milliseconds remotePollInterval(const QString &connection = QString()) const; + [[nodiscard]] std::chrono::milliseconds remotePollInterval(const QString &connection = QString()) const; /* Set poll interval. Value in milliseconds has to be larger than 5000 */ void setRemotePollInterval(std::chrono::milliseconds interval, const QString &connection = QString()); /* Interval to check for new notifications */ - std::chrono::milliseconds notificationRefreshInterval(const QString &connection = QString()) const; + [[nodiscard]] std::chrono::milliseconds notificationRefreshInterval(const QString &connection = QString()) const; /* Force sync interval, in milliseconds */ - std::chrono::milliseconds forceSyncInterval(const QString &connection = QString()) const; + [[nodiscard]] std::chrono::milliseconds forceSyncInterval(const QString &connection = QString()) const; /** * Interval in milliseconds within which full local discovery is required * * Use -1 to disable regular full local discoveries. */ - std::chrono::milliseconds fullLocalDiscoveryInterval() const; + [[nodiscard]] std::chrono::milliseconds fullLocalDiscoveryInterval() const; - bool monoIcons() const; + [[nodiscard]] bool monoIcons() const; void setMonoIcons(bool); - bool promptDeleteFiles() const; + [[nodiscard]] bool promptDeleteFiles() const; void setPromptDeleteFiles(bool promptDeleteFiles); - bool crashReporter() const; + [[nodiscard]] bool crashReporter() const; void setCrashReporter(bool enabled); - bool automaticLogDir() const; + [[nodiscard]] bool automaticLogDir() const; void setAutomaticLogDir(bool enabled); - QString logDir() const; + [[nodiscard]] QString logDir() const; void setLogDir(const QString &dir); - bool logDebug() const; + [[nodiscard]] bool logDebug() const; void setLogDebug(bool enabled); - int logExpire() const; + [[nodiscard]] int logExpire() const; void setLogExpire(int hours); - bool logFlush() const; + [[nodiscard]] bool logFlush() const; void setLogFlush(bool enabled); // Whether experimental UI options should be shown - bool showExperimentalOptions() const; + [[nodiscard]] bool showExperimentalOptions() const; // proxy settings void setProxyType(int proxyType, @@ -117,86 +121,92 @@ public: const QString &user = QString(), const QString &pass = QString()); - int proxyType() const; - QString proxyHostName() const; - int proxyPort() const; - bool proxyNeedsAuth() const; - QString proxyUser() const; - QString proxyPassword() const; + [[nodiscard]] int proxyType() const; + [[nodiscard]] QString proxyHostName() const; + [[nodiscard]] int proxyPort() const; + [[nodiscard]] bool proxyNeedsAuth() const; + [[nodiscard]] QString proxyUser() const; + [[nodiscard]] QString proxyPassword() const; /** 0: no limit, 1: manual, >0: automatic */ - int useUploadLimit() const; - int useDownloadLimit() const; + [[nodiscard]] int useUploadLimit() const; + [[nodiscard]] int useDownloadLimit() const; void setUseUploadLimit(int); void setUseDownloadLimit(int); /** in kbyte/s */ - int uploadLimit() const; - int downloadLimit() const; + [[nodiscard]] int uploadLimit() const; + [[nodiscard]] int downloadLimit() const; void setUploadLimit(int kbytes); void setDownloadLimit(int kbytes); /** [checked, size in MB] **/ - QPair newBigFolderSizeLimit() const; + [[nodiscard]] QPair newBigFolderSizeLimit() const; void setNewBigFolderSizeLimit(bool isChecked, qint64 mbytes); - bool useNewBigFolderSizeLimit() const; - bool confirmExternalStorage() const; + [[nodiscard]] bool useNewBigFolderSizeLimit() const; + [[nodiscard]] bool confirmExternalStorage() const; void setConfirmExternalStorage(bool); /** If we should move the files deleted on the server in the trash */ - bool moveToTrash() const; + [[nodiscard]] bool moveToTrash() const; void setMoveToTrash(bool); - bool showMainDialogAsNormalWindow() const; + [[nodiscard]] bool showMainDialogAsNormalWindow() const; static bool setConfDir(const QString &value); - bool optionalServerNotifications() const; + [[nodiscard]] bool optionalServerNotifications() const; void setOptionalServerNotifications(bool show); - bool showCallNotifications() const; + [[nodiscard]] bool showCallNotifications() const; void setShowCallNotifications(bool show); - bool showInExplorerNavigationPane() const; + [[nodiscard]] bool showInExplorerNavigationPane() const; void setShowInExplorerNavigationPane(bool show); - int timeout() const; - qint64 chunkSize() const; - qint64 maxChunkSize() const; - qint64 minChunkSize() const; - std::chrono::milliseconds targetChunkUploadDuration() const; + [[nodiscard]] int timeout() const; + [[nodiscard]] qint64 chunkSize() const; + [[nodiscard]] qint64 maxChunkSize() const; + [[nodiscard]] qint64 minChunkSize() const; + [[nodiscard]] std::chrono::milliseconds targetChunkUploadDuration() const; void saveGeometry(QWidget *w); void restoreGeometry(QWidget *w); // how often the check about new versions runs - std::chrono::milliseconds updateCheckInterval(const QString &connection = QString()) const; + [[nodiscard]] std::chrono::milliseconds updateCheckInterval(const QString &connection = QString()) const; // skipUpdateCheck completely disables the updater and hides its UI - bool skipUpdateCheck(const QString &connection = QString()) const; + [[nodiscard]] bool skipUpdateCheck(const QString &connection = QString()) const; void setSkipUpdateCheck(bool, const QString &); // autoUpdateCheck allows the user to make the choice in the UI - bool autoUpdateCheck(const QString &connection = QString()) const; + [[nodiscard]] bool autoUpdateCheck(const QString &connection = QString()) const; void setAutoUpdateCheck(bool, const QString &); /** Query-parameter 'updatesegment' for the update check, value between 0 and 99. Used to throttle down desktop release rollout in order to keep the update servers alive at peak times. See: https://github.com/nextcloud/client_updater_server/pull/36 */ - int updateSegment() const; + [[nodiscard]] int updateSegment() const; - QString updateChannel() const; + [[nodiscard]] QString updateChannel() const; void setUpdateChannel(const QString &channel); + [[nodiscard]] QString overrideServerUrl() const; + void setOverrideServerUrl(const QString &url); + + [[nodiscard]] QString overrideLocalDir() const; + void setOverrideLocalDir(const QString &localDir); + void saveGeometryHeader(QHeaderView *header); void restoreGeometryHeader(QHeaderView *header); - QString certificatePath() const; + [[nodiscard]] QString certificatePath() const; void setCertificatePath(const QString &cPath); - QString certificatePasswd() const; + [[nodiscard]] 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; + [[nodiscard]] QString clientVersionString() const; void setClientVersionString(const QString &version); /** Returns a new settings pre-set in a specific group. The Settings will be created @@ -207,18 +217,18 @@ public: static void setupDefaultExcludeFilePaths(ExcludedFiles &excludedFiles); protected: - QVariant getPolicySetting(const QString &policy, const QVariant &defaultValue = QVariant()) const; + [[nodiscard]] QVariant getPolicySetting(const QString &policy, const QVariant &defaultValue = QVariant()) const; void storeData(const QString &group, const QString &key, const QVariant &value); - QVariant retrieveData(const QString &group, const QString &key) const; + [[nodiscard]] QVariant retrieveData(const QString &group, const QString &key) const; void removeData(const QString &group, const QString &key); - bool dataExists(const QString &group, const QString &key) const; + [[nodiscard]] bool dataExists(const QString &group, const QString &key) const; private: - QVariant getValue(const QString ¶m, const QString &group = QString(), + [[nodiscard]] QVariant getValue(const QString ¶m, const QString &group = QString(), const QVariant &defaultValue = QVariant()) const; void setValue(const QString &key, const QVariant &value); - QString keychainProxyPasswordKey() const; + [[nodiscard]] QString keychainProxyPasswordKey() const; private: using SharedCreds = QSharedPointer; diff --git a/src/libsync/cookiejar.h b/src/libsync/cookiejar.h index 6d3703aaa..23aed009c 100644 --- a/src/libsync/cookiejar.h +++ b/src/libsync/cookiejar.h @@ -32,7 +32,7 @@ public: explicit CookieJar(QObject *parent = nullptr); ~CookieJar() override; bool setCookiesFromUrl(const QList &cookieList, const QUrl &url) override; - QList cookiesForUrl(const QUrl &url) const override; + [[nodiscard]] QList cookiesForUrl(const QUrl &url) const override; void clearSessionCookies(); diff --git a/src/libsync/creds/abstractcredentials.h b/src/libsync/creds/abstractcredentials.h index 720caf0d2..6dfb9af6b 100644 --- a/src/libsync/creds/abstractcredentials.h +++ b/src/libsync/creds/abstractcredentials.h @@ -43,16 +43,16 @@ public: */ virtual void setAccount(Account *account); - virtual QString authType() const = 0; - virtual QString user() const = 0; - virtual QString password() const = 0; - virtual QNetworkAccessManager *createQNAM() const = 0; + [[nodiscard]] virtual QString authType() const = 0; + [[nodiscard]] virtual QString user() const = 0; + [[nodiscard]] virtual QString password() const = 0; + [[nodiscard]] virtual QNetworkAccessManager *createQNAM() const = 0; /** Whether there are credentials that can be used for a connection attempt. */ - virtual bool ready() const = 0; + [[nodiscard]] virtual bool ready() const = 0; /** Whether fetchFromKeychain() was called before. */ - bool wasFetched() const { return _wasFetched; } + [[nodiscard]] bool wasFetched() const { return _wasFetched; } /** Trigger (async) fetching of credential information * diff --git a/src/libsync/creds/dummycredentials.cpp b/src/libsync/creds/dummycredentials.cpp index caa163854..bfe952711 100644 --- a/src/libsync/creds/dummycredentials.cpp +++ b/src/libsync/creds/dummycredentials.cpp @@ -52,12 +52,12 @@ bool DummyCredentials::stillValid(QNetworkReply *reply) void DummyCredentials::fetchFromKeychain() { _wasFetched = true; - Q_EMIT(fetched()); + emit fetched(); } void DummyCredentials::askFromUser() { - Q_EMIT(asked()); + emit asked(); } void DummyCredentials::persist() diff --git a/src/libsync/creds/dummycredentials.h b/src/libsync/creds/dummycredentials.h index 80aa04109..30537fef1 100644 --- a/src/libsync/creds/dummycredentials.h +++ b/src/libsync/creds/dummycredentials.h @@ -26,11 +26,11 @@ class OWNCLOUDSYNC_EXPORT DummyCredentials : public AbstractCredentials public: QString _user; QString _password; - QString authType() const override; - QString user() const override; - QString password() const override; - QNetworkAccessManager *createQNAM() const override; - bool ready() const override; + [[nodiscard]] QString authType() const override; + [[nodiscard]] QString user() const override; + [[nodiscard]] QString password() const override; + [[nodiscard]] QNetworkAccessManager *createQNAM() const override; + [[nodiscard]] bool ready() const override; bool stillValid(QNetworkReply *reply) override; void fetchFromKeychain() override; void askFromUser() override; diff --git a/src/libsync/creds/httpcredentials.cpp b/src/libsync/creds/httpcredentials.cpp index 58ebbf455..21ec6b823 100644 --- a/src/libsync/creds/httpcredentials.cpp +++ b/src/libsync/creds/httpcredentials.cpp @@ -357,7 +357,7 @@ bool HttpCredentials::stillValid(QNetworkReply *reply) void HttpCredentials::slotReadJobDone(QKeychain::Job *incoming) { - auto *job = static_cast(incoming); + auto *job = dynamic_cast(incoming); QKeychain::Error error = job->error(); // If we can't find the credentials at the keys that include the account id, @@ -448,7 +448,7 @@ bool HttpCredentials::refreshAccessToken() persist(); } _isRenewingOAuthToken = false; - for (const auto &job : _retryQueue) { + for (const auto &job : qAsConst(_retryQueue)) { if (job) job->retry(); } @@ -523,7 +523,7 @@ void HttpCredentials::persist() // it's just written if it gets passed into the constructor. _account->setCredentialSetting(QLatin1String(clientCertBundleC), _clientCertBundle); } - _account->wantsAccountSaved(_account); + emit _account->wantsAccountSaved(_account); // write secrets to the keychain if (!_clientCertBundle.isEmpty()) { diff --git a/src/libsync/creds/httpcredentials.h b/src/libsync/creds/httpcredentials.h index 18d460cc9..a2dbb5c1f 100644 --- a/src/libsync/creds/httpcredentials.h +++ b/src/libsync/creds/httpcredentials.h @@ -83,15 +83,15 @@ public: explicit HttpCredentials(const QString &user, const QString &password, const QByteArray &clientCertBundle = QByteArray(), const QByteArray &clientCertPassword = QByteArray()); - QString authType() const override; - QNetworkAccessManager *createQNAM() const override; - bool ready() const override; + [[nodiscard]] QString authType() const override; + [[nodiscard]] QNetworkAccessManager *createQNAM() const override; + [[nodiscard]] bool ready() const override; void fetchFromKeychain() override; bool stillValid(QNetworkReply *reply) override; void persist() override; - QString user() const override; + [[nodiscard]] QString user() const override; // the password or token - QString password() const override; + [[nodiscard]] QString password() const override; void invalidateToken() override; void forgetSensitiveData() override; QString fetchUser(); @@ -106,7 +106,7 @@ public: void setAccount(Account *account) override; // Whether we are using OAuth - bool isUsingOAuth() const { return !_refreshToken.isNull(); } + [[nodiscard]] bool isUsingOAuth() const { return !_refreshToken.isNull(); } bool retryIfNeeded(AbstractNetworkJob *) override; diff --git a/src/libsync/creds/keychainchunk.h b/src/libsync/creds/keychainchunk.h index 0e8684372..b6bc50e45 100644 --- a/src/libsync/creds/keychainchunk.h +++ b/src/libsync/creds/keychainchunk.h @@ -47,13 +47,13 @@ public: ~Job() override; - QKeychain::Error error() const; - QString errorString() const; + [[nodiscard]] QKeychain::Error error() const; + [[nodiscard]] QString errorString() const; - QByteArray binaryData() const; - QString textData() const; + [[nodiscard]] QByteArray binaryData() const; + [[nodiscard]] QString textData() const; - bool insecureFallback() const; + [[nodiscard]] bool insecureFallback() const; // If we use it but don't support insecure fallback, give us nice compilation errors ;p #if defined(KEYCHAINCHUNK_ENABLE_INSECURE_FALLBACK) @@ -64,7 +64,7 @@ public: * @return Whether this job autodeletes itself once finished() has been emitted. Default is true. * @see setAutoDelete() */ - bool autoDelete() const; + [[nodiscard]] bool autoDelete() const; /** * Set whether this job should autodelete itself once finished() has been emitted. diff --git a/src/libsync/datetimeprovider.h b/src/libsync/datetimeprovider.h index 1525a2e3d..f836c5c97 100644 --- a/src/libsync/datetimeprovider.h +++ b/src/libsync/datetimeprovider.h @@ -11,8 +11,8 @@ class OWNCLOUDSYNC_EXPORT DateTimeProvider public: virtual ~DateTimeProvider(); - virtual QDateTime currentDateTime() const; + [[nodiscard]] virtual QDateTime currentDateTime() const; - virtual QDate currentDate() const; + [[nodiscard]] virtual QDate currentDate() const; }; } diff --git a/src/libsync/deletejob.h b/src/libsync/deletejob.h index 9f192c78e..4bc6351e5 100644 --- a/src/libsync/deletejob.h +++ b/src/libsync/deletejob.h @@ -32,7 +32,7 @@ public: void start() override; - QByteArray folderToken() const; + [[nodiscard]] QByteArray folderToken() const; void setFolderToken(const QByteArray &folderToken); private: diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 103b1329c..b5a563e73 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -12,6 +12,7 @@ * for more details. */ +#include "account.h" #include "discovery.h" #include "common/filesystembase.h" #include "common/syncjournaldb.h" @@ -35,7 +36,7 @@ namespace OCC { -Q_LOGGING_CATEGORY(lcDisco, "sync.discovery", QtInfoMsg) +Q_LOGGING_CATEGORY(lcDisco, "nextcloud.sync.discovery", QtInfoMsg) ProcessDirectoryJob::ProcessDirectoryJob(DiscoveryPhase *data, PinState basePinState, qint64 lastSyncTimestamp, QObject *parent) : QObject(parent) @@ -216,7 +217,14 @@ void ProcessDirectoryJob::process() if (handleExcluded(path._target, e, isHidden)) continue; - if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) { + const auto isEncryptedFolderButE2eIsNotSetup = e.serverEntry.isValid() && e.serverEntry.isE2eEncrypted && + _discoveryData->_account->e2e() && !_discoveryData->_account->e2e()->_publicKey.isNull() && _discoveryData->_account->e2e()->_privateKey.isNull(); + + if (isEncryptedFolderButE2eIsNotSetup) { + checkAndUpdateSelectiveSyncListsForE2eeFolders(path._server + "/"); + } + + if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original) || isEncryptedFolderButE2eIsNotSetup) { processBlacklisted(path, e.localEntry, e.dbEntry); continue; } @@ -364,7 +372,11 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent case CSYNC_FILE_EXCLUDE_CONFLICT: item->_errorString = tr("Conflict: Server version downloaded, local copy renamed and not uploaded."); item->_status = SyncFileItem::Conflict; - break; + break; + case CSYNC_FILE_EXCLUDE_CASE_CLASH_CONFLICT: + item->_errorString = tr("Case Clash Conflict: Server file downloaded and renamed to avoid clash."); + item->_status = SyncFileItem::FileNameClash; + break; case CSYNC_FILE_EXCLUDE_CANNOT_ENCODE: item->_errorString = tr("The filename cannot be encoded on your file system."); break; @@ -379,13 +391,33 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent return true; } +void ProcessDirectoryJob::checkAndUpdateSelectiveSyncListsForE2eeFolders(const QString &path) +{ + bool ok = false; + + const auto pathWithTrailingSpace = path.endsWith(QLatin1Char('/')) ? path : path + QLatin1Char('/'); + + auto blackListSet = _discoveryData->_statedb->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet(); + blackListSet.insert(pathWithTrailingSpace); + auto blackList = blackListSet.values(); + blackList.sort(); + _discoveryData->_statedb->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList); + + auto toRemoveFromBlacklistSet = _discoveryData->_statedb->getSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok).toSet(); + toRemoveFromBlacklistSet.insert(pathWithTrailingSpace); + // record it into a separate list to automatically remove from blacklist once the e2EE gets set up + auto toRemoveFromBlacklist = toRemoveFromBlacklistSet.values(); + toRemoveFromBlacklist.sort(); + _discoveryData->_statedb->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, toRemoveFromBlacklist); +} + void ProcessDirectoryJob::processFile(PathTuple path, const LocalInfo &localEntry, const RemoteInfo &serverEntry, const SyncJournalFileRecord &dbEntry) { const char *hasServer = serverEntry.isValid() ? "true" : _queryServer == ParentNotChanged ? "db" : "false"; const char *hasLocal = localEntry.isValid() ? "true" : _queryLocal == ParentNotChanged ? "db" : "false"; - const auto serverFileIsLocked = serverEntry.locked == SyncFileItem::LockStatus::LockedItem ? "locked" : "not locked"; + const auto serverFileIsLocked = (serverEntry.isValid() ? (serverEntry.locked == SyncFileItem::LockStatus::LockedItem ? "locked" : "not locked") : ""); const auto localFileIsLocked = dbEntry._lockstate._locked ? "locked" : "not locked"; qCInfo(lcDisco).nospace() << "Processing " << path._original << " | (db/local/remote)" @@ -492,6 +524,9 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo( item->_checksumHeader = serverEntry.checksumHeader; item->_fileId = serverEntry.fileId; item->_remotePerm = serverEntry.remotePerm; + item->_isShared = serverEntry.remotePerm.hasPermission(RemotePermissions::IsShared) || serverEntry.sharedByMe; + item->_sharedByMe = serverEntry.sharedByMe; + item->_lastShareStateFetchedTimestamp = QDateTime::currentMSecsSinceEpoch(); item->_type = serverEntry.isDirectory ? ItemTypeDirectory : ItemTypeFile; item->_etag = serverEntry.etag; item->_directDownloadUrl = serverEntry.directDownloadUrl; @@ -538,6 +573,29 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo( } } + // We want to check the lock state of this file after the lock time has expired + if(serverEntry.locked == SyncFileItem::LockStatus::LockedItem) { + const auto lockExpirationTime = serverEntry.lockTime + serverEntry.lockTimeout; + const auto timeRemaining = QDateTime::currentDateTime().secsTo(QDateTime::fromSecsSinceEpoch(lockExpirationTime)); + // Add on a second as a precaution, sometimes we catch the server before it has had a chance to update + const auto lockExpirationTimeout = qMax(5LL, timeRemaining + 1); + + qCInfo(lcDisco) << "File:" << path._original << "is locked." + << "Lock expires in:" << lockExpirationTimeout << "seconds." + << "A sync run will be scheduled for around that time."; + + _discoveryData->_anotherSyncNeeded = true; + _discoveryData->_filesNeedingScheduledSync.insert(path._original, lockExpirationTimeout); + + } else if (serverEntry.locked == SyncFileItem::LockStatus::UnlockedItem && dbEntry._lockstate._locked) { + // We have received data that this file has been unlocked remotely, so let's notify the sync engine + // that we no longer need a scheduled sync run for this file + qCInfo(lcDisco) << "File:" << path._original << "is unlocked and a scheduled sync is no longer needed." + << "Will remove scheduled sync if there is one."; + + _discoveryData->_filesUnscheduleSync.append(path._original); + } + // The file is known in the db already if (dbEntry.isValid()) { const bool isDbEntryAnE2EePlaceholder = dbEntry.isVirtualFile() && !dbEntry.e2eMangledName().isEmpty(); @@ -630,27 +688,20 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo( // Unknown in db: new file on the server Q_ASSERT(!dbEntry.isValid()); - if (!serverEntry.renameName.isEmpty()) { - item->_renameTarget = _dirItem ? _dirItem->_file + "/" + serverEntry.renameName : serverEntry.renameName; - item->_originalFile = path._original; - item->_modtime = serverEntry.modtime; - item->_size = serverEntry.size; - item->_instruction = CSYNC_INSTRUCTION_RENAME; - item->_direction = SyncFileItem::Up; - item->_fileId = serverEntry.fileId; - item->_remotePerm = serverEntry.remotePerm; - item->_etag = serverEntry.etag; - item->_type = serverEntry.isDirectory ? CSyncEnums::ItemTypeDirectory : CSyncEnums::ItemTypeFile; - - processFileAnalyzeLocalInfo(item, path, localEntry, serverEntry, dbEntry, _queryServer); - return; - } - item->_instruction = CSYNC_INSTRUCTION_NEW; item->_direction = SyncFileItem::Down; item->_modtime = serverEntry.modtime; item->_size = serverEntry.size; + auto conflictRecord = _discoveryData->_statedb->caseConflictRecordByBasePath(item->_file); + if (conflictRecord.isValid() && QString::fromUtf8(conflictRecord.path).contains(QStringLiteral("(case clash from"))) { + qCInfo(lcDisco) << "should ignore" << item->_file << "has already a case clash conflict record" << conflictRecord.path; + + item->_instruction = CSYNC_INSTRUCTION_IGNORE; + + return; + } + auto postProcessServerNew = [=]() mutable { if (item->isDirectory()) { _pendingAsyncJobs++; @@ -855,7 +906,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( bool serverModified = item->_instruction == CSYNC_INSTRUCTION_NEW || item->_instruction == CSYNC_INSTRUCTION_SYNC || item->_instruction == CSYNC_INSTRUCTION_RENAME || item->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE; - + qCDebug(lcDisco) << "File" << item->_file << "- servermodified:" << serverModified << "noServerEntry:" << noServerEntry; @@ -894,39 +945,6 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( processFileFinalize(item, path, recurse, recurseQueryLocal, recurseQueryServer); }; - auto handleInvalidSpaceRename = [&] (SyncFileItem::Direction direction) { - if (_dirItem) { - path._target = _dirItem->_file + "/" + localEntry.renameName; - } else { - path._target = localEntry.renameName; - } - OCC::SyncJournalFileRecord base; - if (!_discoveryData->_statedb->getFileRecordByInode(localEntry.inode, &base)) { - dbError(); - return; - } - const auto originalPath = base.path(); - const auto adjustedOriginalPath = _discoveryData->adjustRenamedPath(originalPath, SyncFileItem::Down); - _discoveryData->_renamedItemsLocal.insert(originalPath, path._target); - item->_renameTarget = path._target; - path._server = adjustedOriginalPath; - if (_dirItem) { - item->_file = _dirItem->_file + "/" + localEntry.name; - } else { - item->_file = localEntry.name; - } - path._original = originalPath; - item->_originalFile = path._original; - item->_modtime = base.isValid() ? base._modtime : localEntry.modtime; - item->_inode = base.isValid() ? base._inode : localEntry.inode; - item->_instruction = CSYNC_INSTRUCTION_RENAME; - item->_direction = direction; - item->_fileId = base.isValid() ? base._fileId : QByteArray{}; - item->_remotePerm = base.isValid() ? base._remotePerm : RemotePermissions{}; - item->_etag = base.isValid() ? base._etag : QByteArray{}; - item->_type = base.isValid() ? base._type : localEntry.type; - }; - if (!localEntry.isValid()) { if (_queryLocal == ParentNotChanged && dbEntry.isValid()) { // Not modified locally (ParentNotChanged) @@ -944,7 +962,10 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( } else if (noServerEntry) { // Not locally, not on the server. The entry is stale! qCInfo(lcDisco) << "Stale DB entry"; - _discoveryData->_statedb->deleteFileRecord(path._original, true); + if (!_discoveryData->_statedb->deleteFileRecord(path._original, true)) { + emit _discoveryData->fatalError(tr("Error while deleting file record %1 from the database").arg(path._original)); + qCWarning(lcDisco) << "Failed to delete a file record from the local DB" << path._original; + } return; } else if (dbEntry._type == ItemTypeVirtualFile && isVfsWithSuffix()) { // If the virtual file is removed, recreate it. @@ -1008,8 +1029,6 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( || _discoveryData->_syncOptions._vfs->needsMetadataUpdate(*item))) { item->_instruction = CSYNC_INSTRUCTION_UPDATE_METADATA; item->_direction = SyncFileItem::Down; - } else if (!localEntry.renameName.isEmpty()) { - handleInvalidSpaceRename(SyncFileItem::Up); } } else if (!typeChange && isVfsWithSuffix() && dbEntry.isVirtualFile() && !localEntry.isVirtualFile @@ -1066,7 +1085,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( item->_size = localEntry.size; item->_modtime = localEntry.modtime; _childModified = true; - + qCDebug(lcDisco) << "Local file was changed: File" << item->_file << "item->_instruction:" << item->_instruction << "noServerEntry:" << noServerEntry @@ -1105,16 +1124,6 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( return; } - if (!localEntry.renameName.isEmpty()) { - handleInvalidSpaceRename(SyncFileItem::Down); - item->_instruction = CSYNC_INSTRUCTION_NEW; - item->_direction = SyncFileItem::Up; - item->_originalFile = item->_file; - item->_file = item->_renameTarget; - finalize(); - return; - } - // New local file or rename item->_instruction = CSYNC_INSTRUCTION_NEW; item->_direction = SyncFileItem::Up; @@ -1124,6 +1133,20 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( item->_type = localEntry.isDirectory ? ItemTypeDirectory : localEntry.isVirtualFile ? ItemTypeVirtualFile : ItemTypeFile; _childModified = true; + if (!localEntry.caseClashConflictingName.isEmpty()) { + qCInfo(lcDisco) << item->_file << "case clash conflict" << localEntry.caseClashConflictingName; + item->_instruction = CSYNC_INSTRUCTION_CONFLICT; + } + + auto conflictRecord = _discoveryData->_statedb->caseConflictRecordByBasePath(item->_file); + if (conflictRecord.isValid() && QString::fromUtf8(conflictRecord.path).contains(QStringLiteral("(case clash from"))) { + qCInfo(lcDisco) << "should ignore" << item->_file << "has already a case clash conflict record" << conflictRecord.path; + + item->_instruction = CSYNC_INSTRUCTION_IGNORE; + + return; + } + auto postProcessLocalNew = [item, localEntry, path, this]() { // TODO: We may want to execute the same logic for non-VFS mode, as, moving/renaming the same folder by 2 or more clients at the same time is not possible in Web UI. // Keeping it like this (for VFS files and folders only) just to fix a user issue. @@ -1300,7 +1323,9 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( if (wasDeletedOnClient.first) { // More complicated. The REMOVE is canceled. Restore will happen next sync. qCInfo(lcDisco) << "Undid remove instruction on source" << originalPath; - _discoveryData->_statedb->deleteFileRecord(originalPath, true); + if (!_discoveryData->_statedb->deleteFileRecord(originalPath, true)) { + qCWarning(lcDisco) << "Failed to delete a file record from the local DB" << originalPath; + } _discoveryData->_statedb->schedulePathForRemoteDiscovery(originalPath); _discoveryData->_anotherSyncNeeded = true; } else { @@ -1327,6 +1352,9 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( item->_direction = SyncFileItem::Up; item->_fileId = base._fileId; item->_remotePerm = base._remotePerm; + item->_isShared = base._isShared; + item->_sharedByMe = base._sharedByMe; + item->_lastShareStateFetchedTimestamp = base._lastShareStateFetchedTimestamp; item->_etag = base._etag; item->_type = base._type; @@ -1351,7 +1379,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo( chopVirtualFileSuffix(serverOriginalPath); auto job = new RequestEtagJob(_discoveryData->_account, serverOriginalPath, this); connect(job, &RequestEtagJob::finishedWithResult, this, [=](const HttpResult &etag) mutable { - + if (!etag || (etag.get() != base._etag && !item->isDirectory()) || _discoveryData->isRenamed(originalPath) || (isAnyParentBeingRestored(originalPath) && !isRename(originalPath))) { @@ -1417,7 +1445,7 @@ void ProcessDirectoryJob::processFileConflict(const SyncFileItemPtr &item, Proce << "localEntry.modtime:" << localEntry.modtime; return; } - + if (!serverEntry.checksumHeader.isEmpty()) { qCDebug(lcDisco) << "CSYNC_INSTRUCTION_CONFLICT: File" << item->_file << "if (!serverEntry.checksumHeader.isEmpty())"; qCDebug(lcDisco) << "CSYNC_INSTRUCTION_CONFLICT: serverEntry.size:" << serverEntry.size @@ -1452,12 +1480,18 @@ void ProcessDirectoryJob::processFileConflict(const SyncFileItemPtr &item, Proce rec._type = item->_type; rec._fileSize = serverEntry.size; rec._remotePerm = serverEntry.remotePerm; + rec._isShared = serverEntry.remotePerm.hasPermission(RemotePermissions::IsShared) || serverEntry.sharedByMe; + rec._sharedByMe = serverEntry.sharedByMe; + rec._lastShareStateFetchedTimestamp = QDateTime::currentMSecsSinceEpoch(); rec._checksumHeader = serverEntry.checksumHeader; - _discoveryData->_statedb->setFileRecord(rec); + const auto result = _discoveryData->_statedb->setFileRecord(rec); + if (!result) { + qCWarning(lcDisco) << "Error when setting the file record to the database" << rec._path << result.error(); + } } return; } - + if (!up._valid || up._contentChecksum != serverEntry.checksumHeader) { qCDebug(lcDisco) << "CSYNC_INSTRUCTION_SYNC: File" << item->_file << "if (!up._valid && up._contentChecksum != serverEntry.checksumHeader)"; qCDebug(lcDisco) << "CSYNC_INSTRUCTION_SYNC: up._valid:" << up._valid @@ -1652,7 +1686,7 @@ bool ProcessDirectoryJob::checkPermissions(const OCC::SyncFileItemPtr &item) bool ProcessDirectoryJob::isAnyParentBeingRestored(const QString &file) const { - for (const auto &directoryNameToRestore : _discoveryData->_directoryNamesToRestoreOnPropagation) { + for (const auto &directoryNameToRestore : qAsConst(_discoveryData->_directoryNamesToRestoreOnPropagation)) { if (file.startsWith(QString(directoryNameToRestore + QLatin1Char('/')))) { qCWarning(lcDisco) << "File" << file << " is within the tree that's being restored" << directoryNameToRestore; return true; @@ -1668,7 +1702,7 @@ bool ProcessDirectoryJob::isRename(const QString &originalPath) const /* TODO: This was needed at some point to cover an edge case which I am no longer to reproduce and it might no longer be the case. * Still, leaving this here just in case the edge case is caught at some point in future. - * + * OCC::SyncJournalFileRecord base; // are we allowed to rename? if (!_discoveryData || !_discoveryData->_statedb || !_discoveryData->_statedb->getFileRecord(originalPath, &base)) { @@ -1776,7 +1810,7 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs) void ProcessDirectoryJob::dbError() { - _discoveryData->fatalError(tr("Error while reading the database")); + emit _discoveryData->fatalError(tr("Error while reading the database")); } void ProcessDirectoryJob::addVirtualFileSuffix(QString &str) const @@ -1909,7 +1943,7 @@ bool ProcessDirectoryJob::isVfsWithSuffix() const void ProcessDirectoryJob::computePinState(PinState parentState) { _pinState = parentState; - if (_queryLocal != ParentDontExist) { + if (_queryLocal != ParentDontExist && QFileInfo::exists(_discoveryData->_localDir + _currentFolder._local)) { if (auto state = _discoveryData->_syncOptions._vfs->pinState(_currentFolder._local)) // ouch! pin local or original? _pinState = *state; } diff --git a/src/libsync/discovery.h b/src/libsync/discovery.h index 2b3ee10b2..c77e31082 100644 --- a/src/libsync/discovery.h +++ b/src/libsync/discovery.h @@ -73,7 +73,7 @@ public: { return base.isEmpty() ? name : base + QLatin1Char('/') + name; } - PathTuple addName(const QString &name) const + [[nodiscard]] PathTuple addName(const QString &name) const { PathTuple result; result._original = pathAppend(_original, name); @@ -120,7 +120,7 @@ public: _isInsideEncryptedTree = isInsideEncryptedTree; } - bool isInsideEncryptedTree() const + [[nodiscard]] bool isInsideEncryptedTree() const { return _isInsideEncryptedTree; } @@ -148,6 +148,9 @@ private: // path is the full relative path of the file. localName is the base name of the local entry. bool handleExcluded(const QString &path, const Entries &entries, bool isHidden); + // check if the path is an e2e encrypted and the e2ee is not set up, and insert it into a corresponding list in the sync journal + void checkAndUpdateSelectiveSyncListsForE2eeFolders(const QString &path); + /** Reconcile local/remote/db information for a single item. * * Can be a file or a directory. @@ -176,9 +179,9 @@ private: */ bool checkPermissions(const SyncFileItemPtr &item); - bool isAnyParentBeingRestored(const QString &file) const; + [[nodiscard]] bool isAnyParentBeingRestored(const QString &file) const; - bool isRename(const QString &originalPath) const; + [[nodiscard]] bool isRename(const QString &originalPath) const; struct MovePermissionResult { @@ -203,11 +206,11 @@ private: void dbError(); void addVirtualFileSuffix(QString &str) const; - bool hasVirtualFileSuffix(const QString &str) const; + [[nodiscard]] bool hasVirtualFileSuffix(const QString &str) const; void chopVirtualFileSuffix(QString &str) const; /** Convenience to detect suffix-vfs modes */ - bool isVfsWithSuffix() const; + [[nodiscard]] bool isVfsWithSuffix() const; /** Start a remote discovery network job * diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp index 7d1a4f5db..d54a744d1 100644 --- a/src/libsync/discoveryphase.cpp +++ b/src/libsync/discoveryphase.cpp @@ -187,7 +187,7 @@ QPair DiscoveryPhase::findAndCancelDeletedJob(const QString &o qCWarning(lcDiscovery) << "(*it)->_type" << (*it)->_type; qCWarning(lcDiscovery) << "(*it)->_isRestoration " << (*it)->_isRestoration; Q_ASSERT(false); - addErrorToGui(SyncFileItem::Status::FatalError, tr("Error while canceling deletion of a file"), originalPath); + emit addErrorToGui(SyncFileItem::Status::FatalError, tr("Error while canceling deletion of a file"), originalPath); emit fatalError(tr("Error while canceling deletion of %1").arg(originalPath)); } (*it)->_instruction = CSYNC_INSTRUCTION_NONE; @@ -208,9 +208,11 @@ void DiscoveryPhase::enqueueDirectoryToDelete(const QString &path, ProcessDirect { _queuedDeletedDirectories[path] = directoryJob; - if (directoryJob->_dirItem && directoryJob->_dirItem->_isRestoration - && directoryJob->_dirItem->_direction == SyncFileItem::Down - && directoryJob->_dirItem->_instruction == CSYNC_INSTRUCTION_NEW) { + if (directoryJob->_dirItem && + directoryJob->_dirItem->_isRestoration && + directoryJob->_dirItem->_direction == SyncFileItem::Down && + directoryJob->_dirItem->_instruction == CSYNC_INSTRUCTION_NEW) { + _directoryNamesToRestoreOnPropagation.push_back(path); } } @@ -261,7 +263,7 @@ void DiscoveryPhase::scheduleMoreJobs() DiscoverySingleLocalDirectoryJob::DiscoverySingleLocalDirectoryJob(const AccountPtr &account, const QString &localPath, OCC::Vfs *vfs, QObject *parent) : QObject(parent), QRunnable(), _localPath(localPath), _account(account), _vfs(vfs) { - qRegisterMetaType >("QVector"); + qRegisterMetaType >("QVector"); } // Use as QRunnable @@ -452,6 +454,7 @@ static void propertyMapToRemoteInfo(const QMap &map, RemoteInf // if we are the owner or not. // Piggy back on the persmission field result.remotePerm.setPermission(RemotePermissions::IsShared); + result.sharedByMe = true; } } else if (property == "is-encrypted" && value == QStringLiteral("1")) { result.isE2eEncrypted = true; diff --git a/src/libsync/discoveryphase.h b/src/libsync/discoveryphase.h index 981dd7c24..2b48c009b 100644 --- a/src/libsync/discoveryphase.h +++ b/src/libsync/discoveryphase.h @@ -58,7 +58,6 @@ struct RemoteInfo { /** FileName of the entry (this does not contains any directory or path, just the plain name */ QString name; - QString renameName; QByteArray etag; QByteArray fileId; QByteArray checksumHeader; @@ -69,8 +68,9 @@ struct RemoteInfo bool isDirectory = false; bool isE2eEncrypted = false; QString e2eMangledName; + bool sharedByMe = false; - bool isValid() const { return !name.isNull(); } + [[nodiscard]] bool isValid() const { return !name.isNull(); } QString directDownloadUrl; QString directDownloadCookies; @@ -88,7 +88,7 @@ struct LocalInfo { /** FileName of the entry (this does not contains any directory or path, just the plain name */ QString name; - QString renameName; + QString caseClashConflictingName; time_t modtime = 0; int64_t size = 0; uint64_t inode = 0; @@ -97,7 +97,7 @@ struct LocalInfo bool isHidden = false; bool isVirtualFile = false; bool isSymLink = false; - bool isValid() const { return !name.isNull(); } + [[nodiscard]] bool isValid() const { return !name.isNull(); } }; /** @@ -113,11 +113,11 @@ public: void run() override; signals: - void finished(QVector result); + void finished(QVector result); void finishedFatalError(QString errorString); void finishedNonFatalError(QString errorString); - void itemDiscovered(SyncFileItemPtr item); + void itemDiscovered(OCC::SyncFileItemPtr item); void childIgnored(bool b); private slots: private: @@ -145,9 +145,9 @@ public: // This is not actually a network job, it is just a job signals: - void firstDirectoryPermissions(RemotePermissions); + void firstDirectoryPermissions(OCC::RemotePermissions); void etag(const QByteArray &, const QDateTime &time); - void finished(const HttpResult> &result); + void finished(const OCC::HttpResult> &result); private slots: void directoryListingIteratedSlot(const QString &, const QMap &); @@ -231,7 +231,7 @@ class DiscoveryPhase : public QObject * Useful for avoiding processing of items that have already been claimed in * a rename (would otherwise be discovered as deletions). */ - bool isRenamed(const QString &p) const { return _renamedItemsLocal.contains(p) || _renamedItemsRemote.contains(p); } + [[nodiscard]] bool isRenamed(const QString &p) const { return _renamedItemsLocal.contains(p) || _renamedItemsRemote.contains(p); } int _currentlyActiveJobs = 0; @@ -241,7 +241,7 @@ class DiscoveryPhase : public QObject void scheduleMoreJobs(); - bool isInSelectiveSyncBlackList(const QString &path) const; + [[nodiscard]] bool isInSelectiveSyncBlackList(const QString &path) const; // Check if the new folder should be deselected or not. // May be async. "Return" via the callback, true if the item is blacklisted @@ -253,7 +253,7 @@ class DiscoveryPhase : public QObject * Note that it only considers parent directory renames. So if A/B got renamed to C/D, * checking A/B/file would yield C/D/file, but checking A/B would yield A/B. */ - QString adjustRenamedPath(const QString &original, SyncFileItem::Direction) const; + [[nodiscard]] QString adjustRenamedPath(const QString &original, SyncFileItem::Direction) const; /** If the db-path is scheduled for deletion, abort it. * @@ -292,12 +292,14 @@ public: // output QByteArray _dataFingerprint; bool _anotherSyncNeeded = false; + QHash _filesNeedingScheduledSync; + QVector _filesUnscheduleSync; QStringList _listExclusiveFiles; signals: void fatalError(const QString &errorString); - void itemDiscovered(const SyncFileItemPtr &item); + void itemDiscovered(const OCC::SyncFileItemPtr &item); void finished(); // A new folder was discovered and was not synced because of the confirmation feature diff --git a/src/libsync/encryptfolderjob.cpp b/src/libsync/encryptfolderjob.cpp index 1a9fc6584..3dba706ce 100644 --- a/src/libsync/encryptfolderjob.cpp +++ b/src/libsync/encryptfolderjob.cpp @@ -48,13 +48,21 @@ QString EncryptFolderJob::errorString() const void EncryptFolderJob::slotEncryptionFlagSuccess(const QByteArray &fileId) { SyncJournalFileRecord rec; - _journal->getFileRecord(_path, &rec); - if (rec.isValid()) { - rec._isE2eEncrypted = true; - _journal->setFileRecord(rec); + if (!_journal->getFileRecord(_path, &rec)) { + qCWarning(lcEncryptFolderJob) << "could not get file from local DB" << _path; } - auto lockJob = new LockEncryptFolderApiJob(_account, fileId, this); + if (!rec.isValid()) { + qCWarning(lcEncryptFolderJob) << "No valid record found in local DB for fileId" << fileId; + } + + rec._isE2eEncrypted = true; + const auto result = _journal->setFileRecord(rec); + if (!result) { + qCWarning(lcEncryptFolderJob) << "Error when setting the file record to the database" << rec._path << result.error(); + } + + const auto lockJob = new LockEncryptFolderApiJob(_account, fileId, _journal, _account->e2e()->_publicKey, this); connect(lockJob, &LockEncryptFolderApiJob::success, this, &EncryptFolderJob::slotLockForEncryptionSuccess); connect(lockJob, &LockEncryptFolderApiJob::error, @@ -62,9 +70,12 @@ void EncryptFolderJob::slotEncryptionFlagSuccess(const QByteArray &fileId) lockJob->start(); } -void EncryptFolderJob::slotEncryptionFlagError(const QByteArray &fileId, int httpErrorCode) +void EncryptFolderJob::slotEncryptionFlagError(const QByteArray &fileId, + const int httpErrorCode, + const QString &errorMessage) { qDebug() << "Error on the encryption flag of" << fileId << "HTTP code:" << httpErrorCode; + _errorString = errorMessage; emit finished(Error); } @@ -92,7 +103,7 @@ void EncryptFolderJob::slotLockForEncryptionSuccess(const QByteArray &fileId, co void EncryptFolderJob::slotUploadMetadataSuccess(const QByteArray &folderId) { - auto unlockJob = new UnlockEncryptFolderApiJob(_account, folderId, _folderToken, this); + auto unlockJob = new UnlockEncryptFolderApiJob(_account, folderId, _folderToken, _journal, this); connect(unlockJob, &UnlockEncryptFolderApiJob::success, this, &EncryptFolderJob::slotUnlockFolderSuccess); connect(unlockJob, &UnlockEncryptFolderApiJob::error, @@ -100,11 +111,11 @@ void EncryptFolderJob::slotUploadMetadataSuccess(const QByteArray &folderId) unlockJob->start(); } -void EncryptFolderJob::slotUpdateMetadataError(const QByteArray &folderId, int httpReturnCode) +void EncryptFolderJob::slotUpdateMetadataError(const QByteArray &folderId, const int httpReturnCode) { Q_UNUSED(httpReturnCode); - auto unlockJob = new UnlockEncryptFolderApiJob(_account, folderId, _folderToken, this); + const auto unlockJob = new UnlockEncryptFolderApiJob(_account, folderId, _folderToken, _journal, this); connect(unlockJob, &UnlockEncryptFolderApiJob::success, this, &EncryptFolderJob::slotUnlockFolderSuccess); connect(unlockJob, &UnlockEncryptFolderApiJob::error, @@ -112,15 +123,21 @@ void EncryptFolderJob::slotUpdateMetadataError(const QByteArray &folderId, int h unlockJob->start(); } -void EncryptFolderJob::slotLockForEncryptionError(const QByteArray &fileId, int httpErrorCode) +void EncryptFolderJob::slotLockForEncryptionError(const QByteArray &fileId, + const int httpErrorCode, + const QString &errorMessage) { qCInfo(lcEncryptFolderJob()) << "Locking error for" << fileId << "HTTP code:" << httpErrorCode; + _errorString = errorMessage; emit finished(Error); } -void EncryptFolderJob::slotUnlockFolderError(const QByteArray &fileId, int httpErrorCode) +void EncryptFolderJob::slotUnlockFolderError(const QByteArray &fileId, + const int httpErrorCode, + const QString &errorMessage) { qCInfo(lcEncryptFolderJob()) << "Unlocking error for" << fileId << "HTTP code:" << httpErrorCode; + _errorString = errorMessage; emit finished(Error); } void EncryptFolderJob::slotUnlockFolderSuccess(const QByteArray &fileId) diff --git a/src/libsync/encryptfolderjob.h b/src/libsync/encryptfolderjob.h index 75293b81d..bad5a8976 100644 --- a/src/libsync/encryptfolderjob.h +++ b/src/libsync/encryptfolderjob.h @@ -33,20 +33,20 @@ public: explicit EncryptFolderJob(const AccountPtr &account, SyncJournalDb *journal, const QString &path, const QByteArray &fileId, QObject *parent = nullptr); void start(); - QString errorString() const; + [[nodiscard]] QString errorString() const; signals: void finished(int status); private slots: void slotEncryptionFlagSuccess(const QByteArray &folderId); - void slotEncryptionFlagError(const QByteArray &folderId, int httpReturnCode); + void slotEncryptionFlagError(const QByteArray &folderId, const int httpReturnCode, const QString &errorMessage); void slotLockForEncryptionSuccess(const QByteArray &folderId, const QByteArray &token); - void slotLockForEncryptionError(const QByteArray &folderId, int httpReturnCode); + void slotLockForEncryptionError(const QByteArray &folderId, const int httpReturnCode, const QString &errorMessage); void slotUnlockFolderSuccess(const QByteArray &folderId); - void slotUnlockFolderError(const QByteArray &folderId, int httpReturnCode); + void slotUnlockFolderError(const QByteArray &folderId, const int httpReturnCode, const QString &errorMessage); void slotUploadMetadataSuccess(const QByteArray &folderId); - void slotUpdateMetadataError(const QByteArray &folderId, int httpReturnCode); + void slotUpdateMetadataError(const QByteArray &folderId, const int httpReturnCode); private: AccountPtr _account; diff --git a/src/libsync/filesystem.cpp b/src/libsync/filesystem.cpp index b63745fed..7c58c7b2b 100644 --- a/src/libsync/filesystem.cpp +++ b/src/libsync/filesystem.cpp @@ -58,9 +58,8 @@ bool FileSystem::fileEquals(const QString &fn1, const QString &fn2) time_t FileSystem::getModTime(const QString &filename) { csync_file_stat_t stat; - qint64 result = -1; - if (csync_vio_local_stat(filename, &stat) != -1 - && (stat.modtime != 0)) { + time_t result = -1; + if (csync_vio_local_stat(filename, &stat) != -1 && (stat.modtime != 0)) { result = stat.modtime; } else { result = Utility::qDateTimeToTime_t(QFileInfo(filename).lastModified()); @@ -93,11 +92,11 @@ bool FileSystem::fileChanged(const QString &fileName, } bool FileSystem::verifyFileUnchanged(const QString &fileName, - qint64 previousSize, - time_t previousMtime) + qint64 previousSize, + time_t previousMtime) { - const qint64 actualSize = getSize(fileName); - const time_t actualMtime = getModTime(fileName); + const auto actualSize = getSize(fileName); + const auto actualMtime = getModTime(fileName); if ((actualSize != previousSize && actualMtime > 0) || (actualMtime != previousMtime && previousMtime > 0 && actualMtime > 0)) { qCInfo(lcFileSystem) << "File" << fileName << "has changed:" << "size: " << previousSize << "<->" << actualSize diff --git a/src/libsync/iconjob.cpp b/src/libsync/iconjob.cpp index 23a7ace7f..68263fc67 100644 --- a/src/libsync/iconjob.cpp +++ b/src/libsync/iconjob.cpp @@ -21,7 +21,7 @@ IconJob::IconJob(AccountPtr account, const QUrl &url, QObject *parent) { QNetworkRequest request(url); #if (QT_VERSION >= 0x050600) - request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); + request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, true); #endif const auto reply = account->sendRawRequest(QByteArrayLiteral("GET"), url, request); connect(reply, &QNetworkReply::finished, this, &IconJob::finished); diff --git a/src/libsync/localdiscoverytracker.h b/src/libsync/localdiscoverytracker.h index b813ea97e..7cc12895a 100644 --- a/src/libsync/localdiscoverytracker.h +++ b/src/libsync/localdiscoverytracker.h @@ -66,14 +66,14 @@ public: void startSyncPartialDiscovery(); /** Access list of files that shall be locally rediscovered. */ - const std::set &localDiscoveryPaths() const; + [[nodiscard]] const std::set &localDiscoveryPaths() const; public slots: /** * Success and failure of sync items adjust what the next sync is * supposed to do. */ - void slotItemCompleted(const SyncFileItemPtr &item); + void slotItemCompleted(const OCC::SyncFileItemPtr &item); /** * When a sync finishes, the lists must be updated diff --git a/src/libsync/lockfilejobs.cpp b/src/libsync/lockfilejobs.cpp index 4a398c2b0..b5bccd9df 100644 --- a/src/libsync/lockfilejobs.cpp +++ b/src/libsync/lockfilejobs.cpp @@ -171,7 +171,10 @@ SyncJournalFileRecord LockFileJob::handleReply() _userId != account()->davUser()) { FileSystem::setFileReadOnly(relativePath, true); } - _journal->setFileRecord(record); + const auto result = _journal->setFileRecord(record); + if (!result) { + qCWarning(lcLockFileJob) << "Error when setting the file record to the database" << record._path << result.error(); + } _journal->commit("lock file job"); } diff --git a/src/libsync/logger.cpp b/src/libsync/logger.cpp index 294ad2bb6..f6c95e375 100644 --- a/src/libsync/logger.cpp +++ b/src/libsync/logger.cpp @@ -301,12 +301,12 @@ void Logger::enterNextLogFile() // 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"; + QString newLogName = now.toString("yyyyMMdd_HHmm") + "_nextcloud.log"; // Expire old log files and deal with conflicts - QStringList files = dir.entryList(QStringList("*owncloud.log.*"), - QDir::Files, QDir::Name); - const QRegularExpression rx(QRegularExpression::anchoredPattern(R"(.*owncloud\.log\.(\d+).*)")); + QStringList files = dir.entryList(QStringList("*owncloud.log.*"), QDir::Files, QDir::Name) + + dir.entryList(QStringList("*nextcloud.log.*"), QDir::Files, QDir::Name); + static const QRegularExpression rx(QRegularExpression::anchoredPattern(R"(.*(next|own)cloud\.log\.(\d+).*)")); int maxNumber = -1; foreach (const QString &s, files) { if (_logExpire > 0) { @@ -317,7 +317,7 @@ void Logger::enterNextLogFile() } const auto rxMatch = rx.match(s); if (s.startsWith(newLogName) && rxMatch.hasMatch()) { - maxNumber = qMax(maxNumber, rxMatch.captured(1).toInt()); + maxNumber = qMax(maxNumber, rxMatch.captured(2).toInt()); } } newLogName.append("." + QString::number(maxNumber + 1)); diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index dd26a9550..19951674d 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -840,7 +840,7 @@ bool JsonApiJob::finished() QString jsonStr = QString::fromUtf8(reply()->readAll()); if (jsonStr.contains("")) { - const QRegularExpression rex("(\\d+)"); + static const QRegularExpression rex("(\\d+)"); const auto rexMatch = rex.match(jsonStr); if (rexMatch.hasMatch()) { // this is a error message coming back from ocs. @@ -850,7 +850,7 @@ bool JsonApiJob::finished() qCWarning(lcJsonApiJob) << "Nothing changed so nothing to retrieve - status code: " << httpStatusCode; statusCode = httpStatusCode; } else { - const QRegularExpression rex(R"("statuscode":(\d+))"); + static const QRegularExpression rex(R"("statuscode":(\d+))"); // example: "{"ocs":{"meta":{"status":"ok","statuscode":100,"message":null},"data":{"version":{"major":8,"minor":"... (504) const auto rxMatch = rex.match(jsonStr); if (rxMatch.hasMatch()) { diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h index 3ed099622..fb9536043 100644 --- a/src/libsync/networkjobs.h +++ b/src/libsync/networkjobs.h @@ -147,7 +147,7 @@ public: * e.g. "ns:with:colons:bar", which is "bar" in the "ns:with:colons" namespace */ void setProperties(QList properties); - QList properties() const; + [[nodiscard]] QList properties() const; signals: void directoryListingSubfolders(const QStringList &items); @@ -189,7 +189,7 @@ public: * e.g. "ns:with:colons:bar", which is "bar" in the "ns:with:colons" namespace */ void setProperties(QList properties); - QList properties() const; + [[nodiscard]] QList properties() const; signals: void result(const QVariantMap &values); @@ -265,7 +265,7 @@ public: * e.g. "ns:with:colons:bar", which is "bar" in the "ns:with:colons" namespace */ void setProperties(QMap properties); - QMap properties() const; + [[nodiscard]] QMap properties() const; signals: void success(); @@ -419,10 +419,10 @@ Q_SIGNALS: protected: bool finished() override; - QNetworkRequest& request(); - QByteArray& body(); - QUrlQuery& additionalParams(); - QByteArray verbToString() const; + [[nodiscard]] QNetworkRequest& request(); + [[nodiscard]] QByteArray& body(); + [[nodiscard]] QUrlQuery& additionalParams(); + [[nodiscard]] QByteArray verbToString() const; private: QByteArray _body; @@ -499,7 +499,7 @@ public: explicit DetermineAuthTypeJob(AccountPtr account, QObject *parent = nullptr); void start(); signals: - void authType(AuthType); + void authType(OCC::DetermineAuthTypeJob::AuthType); private: void checkAllDone(); diff --git a/src/libsync/ocsprofileconnector.h b/src/libsync/ocsprofileconnector.h index 69cd60116..aeb82d87c 100644 --- a/src/libsync/ocsprofileconnector.h +++ b/src/libsync/ocsprofileconnector.h @@ -34,7 +34,7 @@ public: explicit OcsProfileConnector(AccountPtr account, QObject *parent = nullptr); void fetchHovercard(const QString &userId); - const Hovercard &hovercard() const; + [[nodiscard]] const Hovercard &hovercard() const; signals: void error(); diff --git a/src/libsync/ocsuserstatusconnector.h b/src/libsync/ocsuserstatusconnector.h index 0d366419f..3f42a7230 100644 --- a/src/libsync/ocsuserstatusconnector.h +++ b/src/libsync/ocsuserstatusconnector.h @@ -37,7 +37,7 @@ public: void clearMessage() override; - UserStatus userStatus() const override; + [[nodiscard]] UserStatus userStatus() const override; private: void onUserStatusFetched(const QJsonDocument &json, int statusCode); diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 489919e1b..0143f8f6f 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -320,7 +320,11 @@ bool PropagateItemJob::hasEncryptedAncestor() const auto pathComponents = parentPath.split('/'); while (!pathComponents.isEmpty()) { SyncJournalFileRecord rec; - propagator()->_journal->getFileRecord(pathComponents.join('/'), &rec); + const auto pathCompontentsJointed = pathComponents.join('/'); + if (!propagator()->_journal->getFileRecord(pathCompontentsJointed, &rec)) { + qCWarning(lcPropagator) << "could not get file from local DB" << pathCompontentsJointed; + } + if (rec.isValid() && rec._isE2eEncrypted) { return true; } @@ -590,7 +594,7 @@ void OwncloudPropagator::start(SyncFileItemVector &&items) } foreach (PropagatorJob *it, directoriesToRemove) { - _rootJob->_dirDeletionJobs.appendJob(it); + _rootJob->appendDirDeletionJob(it); } connect(_rootJob.data(), &PropagatorJob::finished, this, &OwncloudPropagator::emitFinished); @@ -909,6 +913,63 @@ bool OwncloudPropagator::createConflict(const SyncFileItemPtr &item, return true; } +OCC::Optional OwncloudPropagator::createCaseClashConflict(const SyncFileItemPtr &item, const QString &temporaryDownloadedFile) +{ + auto filename = QString{}; + + if (item->_type == ItemType::ItemTypeFile) { + filename = fullLocalPath(item->_file); + } else if (item->_type == ItemType::ItemTypeVirtualFileDownload) { + filename = fullLocalPath(item->_file + syncOptions()._vfs->fileSuffix()); + } + + const auto conflictModTime = FileSystem::getModTime(filename); + if (conflictModTime <= 0) { + return tr("Impossible to get modification time for file in conflict %1").arg(filename); + } + + const auto conflictFileName = Utility::makeCaseClashConflictFileName(item->_file, Utility::qDateTimeFromTime_t(conflictModTime)); + const auto conflictFilePath = fullLocalPath(conflictFileName); + + emit touchedFile(filename); + emit touchedFile(conflictFilePath); + + qCInfo(lcPropagator) << "rename from" << temporaryDownloadedFile << "to" << conflictFilePath; + if (QString renameError; !FileSystem::rename(temporaryDownloadedFile, conflictFilePath, &renameError)) { + // If the rename fails, don't replace it. + + // If the file is locked, we want to retry this sync when it + // becomes available again. + if (FileSystem::isFileLocked(filename)) { + emit seenLockedFile(filename); + } + + return renameError; + } + FileSystem::setFileHidden(conflictFilePath, false); + qCInfo(lcPropagator) << "Created case clash conflict file" << filename << "->" << conflictFilePath; + + // Create a new conflict record. To get the base etag, we need to read it from the db. + auto conflictBasePath = item->_file.toUtf8(); + if (!item->_renameTarget.isEmpty()) { + conflictBasePath = item->_renameTarget.toUtf8(); + } + auto conflictRecord = ConflictRecord{conflictFileName.toUtf8(), {}, item->_previousModtime, {}, conflictBasePath}; + + SyncJournalFileRecord baseRecord; + if (_journal->getFileRecord(item->_originalFile, &baseRecord) && baseRecord.isValid()) { + conflictRecord.baseEtag = baseRecord._etag; + conflictRecord.baseFileId = baseRecord._fileId; + } + + _journal->setCaseConflictRecord(conflictRecord); + + // Need a new sync to detect the created copy of the conflicting file + _anotherSyncNeeded = true; + + return {}; +} + QString OwncloudPropagator::adjustRenamedPath(const QString &original) const { return OCC::adjustRenamedPath(_renamedDirectories, original); @@ -939,7 +1000,29 @@ Result OwncloudPropagator::staticUpdat bool OwncloudPropagator::isDelayedUploadItem(const SyncFileItemPtr &item) const { - return account()->capabilities().bulkUpload() && !_scheduleDelayedTasks && !item->_isEncrypted && _syncOptions._minChunkSize > item->_size && !isInBulkUploadBlackList(item->_file); + const auto checkFileShouldBeEncrypted = [this] (const SyncFileItemPtr &item) -> bool { + const auto path = item->_file; + const auto slashPosition = path.lastIndexOf('/'); + const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString(); + + SyncJournalFileRecord parentRec; + bool ok = _journal->getFileRecord(parentPath, &parentRec); + if (!ok) { + return false; + } + + const auto accountPtr = account(); + + if (!accountPtr->capabilities().clientSideEncryptionAvailable() || + !parentRec.isValid() || + !parentRec._isE2eEncrypted) { + return false; + } + + return true; + }; + + return account()->capabilities().bulkUpload() && !_scheduleDelayedTasks && !item->_isEncrypted && _syncOptions._minChunkSize > item->_size && !isInBulkUploadBlackList(item->_file) && !checkFileShouldBeEncrypted(item); } void OwncloudPropagator::setScheduleDelayedTasks(bool active) @@ -1072,7 +1155,7 @@ bool PropagatorCompositeJob::scheduleSelfOrChild() void PropagatorCompositeJob::slotSubJobFinished(SyncFileItem::Status status) { - auto *subJob = static_cast(sender()); + auto *subJob = dynamic_cast(sender()); ASSERT(subJob); // Delete the job and remove it from our list of jobs. @@ -1193,9 +1276,17 @@ void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status) if (!_item->isEmpty() && status == SyncFileItem::Success) { // If a directory is renamed, recursively delete any stale items // that may still exist below the old path. - if (_item->_instruction == CSYNC_INSTRUCTION_RENAME - && _item->_originalFile != _item->_renameTarget) { - propagator()->_journal->deleteFileRecord(_item->_originalFile, true); + if (_item->_instruction == CSYNC_INSTRUCTION_RENAME && _item->_originalFile != _item->_renameTarget) { + if (!propagator()->_journal->deleteFileRecord(_item->_originalFile, true)) { + qCWarning(lcDirectory) << "could not delete file from local DB" << _item->_originalFile; + _state = Finished; + status = _item->_status = SyncFileItem::FatalError; + _item->_errorString = tr("could not delete file %1 from local DB").arg(_item->_originalFile); + qCInfo(lcPropagator) << "PropagateDirectory::slotSubJobsFinished" + << "emit finished" << status; + emit finished(status); + return; + } } if (_item->_instruction == CSYNC_INSTRUCTION_NEW && _item->_direction == SyncFileItem::Down) { @@ -1280,6 +1371,11 @@ qint64 PropagateRootDirectory::committedDiskSpace() const return _subJobs.committedDiskSpace() + _dirDeletionJobs.committedDiskSpace(); } +void PropagateRootDirectory::appendDirDeletionJob(PropagatorJob *job) +{ + _dirDeletionJobs.appendJob(job); +} + bool PropagateRootDirectory::scheduleSelfOrChild() { qCInfo(lcRootDirectory()) << "scheduleSelfOrChild" << _state << "pending uploads" << propagator()->delayedTasks().size() << "subjobs state" << _subJobs._state; @@ -1315,6 +1411,8 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status) if (status != SyncFileItem::Success && status != SyncFileItem::Restoration + && status != SyncFileItem::BlacklistedError + && status != SyncFileItem::FileNameClash && status != SyncFileItem::Conflict) { if (_state != Finished) { // Synchronously abort @@ -1326,11 +1424,37 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status) return; } + if (_errorStatus == SyncFileItem::NoStatus) { + switch (status) { + case SyncFileItem::NoStatus: + case SyncFileItem::FatalError: + case SyncFileItem::NormalError: + case SyncFileItem::SoftError: + case SyncFileItem::Conflict: + case SyncFileItem::FileIgnored: + case SyncFileItem::FileLocked: + case SyncFileItem::Restoration: + case SyncFileItem::FileNameInvalid: + case SyncFileItem::DetailError: + case SyncFileItem::Success: + break; + case SyncFileItem::FileNameClash: + case SyncFileItem::BlacklistedError: + _errorStatus = status; + break; + } + } + propagator()->scheduleNextJob(); } void PropagateRootDirectory::slotDirDeletionJobsFinished(SyncFileItem::Status status) { + if (_errorStatus != SyncFileItem::NoStatus && status == SyncFileItem::Success) { + qCInfo(lcPropagator) << "PropagateRootDirectory::slotDirDeletionJobsFinished" << "reporting previous error" << _errorStatus; + status = _errorStatus; + } + _state = Finished; qCInfo(lcPropagator) << "PropagateRootDirectory::slotDirDeletionJobsFinished" << "emit finished" << status; emit finished(status); @@ -1406,4 +1530,23 @@ QString OwncloudPropagator::remotePath() const return _remoteFolder; } +void PropagateIgnoreJob::start() +{ + SyncFileItem::Status status = _item->_status; + if (status == SyncFileItem::NoStatus) { + if (_item->_instruction == CSYNC_INSTRUCTION_ERROR) { + status = SyncFileItem::NormalError; + } else { + status = SyncFileItem::FileIgnored; + ASSERT(_item->_instruction == CSYNC_INSTRUCTION_IGNORE); + } + } else if (status == SyncFileItem::FileNameClash) { + const auto conflictRecord = propagator()->_journal->caseConflictRecordByPath(_item->_file); + if (conflictRecord.isValid()) { + _item->_file = conflictRecord.initialBasePath; + } + } + done(status, _item->_errorString); +} + } diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index 951a63d5a..afd364dc9 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -110,7 +110,7 @@ public: * Note that this does *not* include the disk space that's already * in use by running jobs for things like a download-in-progress. */ - virtual qint64 committedDiskSpace() const { return 0; } + [[nodiscard]] virtual qint64 committedDiskSpace() const { return 0; } /** Set the associated composite job * @@ -145,7 +145,7 @@ signals: */ void abortFinished(SyncFileItem::Status status = SyncFileItem::NormalError); protected: - OwncloudPropagator *propagator() const; + [[nodiscard]] OwncloudPropagator *propagator() const; /** If this job gets added to a composite job, this will point to the parent. * @@ -171,7 +171,7 @@ protected: * set a custom restore job message that is used if the restore job succeeded. * It is displayed in the activity view. */ - QString restoreJobMsg() const + [[nodiscard]] QString restoreJobMsg() const { return _item->_isRestoration ? _item->_errorString : QString(); } @@ -181,7 +181,7 @@ protected: _item->_errorString = msg; } - bool hasEncryptedAncestor() const; + [[nodiscard]] bool hasEncryptedAncestor() const; protected slots: void slotRestoreJobFinished(SyncFileItem::Status status); @@ -279,11 +279,11 @@ public: } } - qint64 committedDiskSpace() const override; + [[nodiscard]] qint64 committedDiskSpace() const override; private slots: void slotSubJobAbortFinished(); - bool possiblyRunNextJob(PropagatorJob *next) + bool possiblyRunNextJob(OCC::PropagatorJob *next) { if (next->_state == NotYetStarted) { connect(next, &PropagatorJob::finished, this, &PropagatorCompositeJob::slotSubJobFinished); @@ -291,7 +291,7 @@ private slots: return next->scheduleSelfOrChild(); } - void slotSubJobFinished(SyncFileItem::Status status); + void slotSubJobFinished(OCC::SyncFileItem::Status status); void finalize(); }; @@ -342,15 +342,15 @@ public: } - qint64 committedDiskSpace() const override + [[nodiscard]] qint64 committedDiskSpace() const override { return _subJobs.committedDiskSpace(); } private slots: - void slotFirstJobFinished(SyncFileItem::Status status); - virtual void slotSubJobsFinished(SyncFileItem::Status status); + void slotFirstJobFinished(OCC::SyncFileItem::Status status); + virtual void slotSubJobsFinished(OCC::SyncFileItem::Status status); }; @@ -365,23 +365,28 @@ class OWNCLOUDSYNC_EXPORT PropagateRootDirectory : public PropagateDirectory { Q_OBJECT public: - PropagatorCompositeJob _dirDeletionJobs; - explicit PropagateRootDirectory(OwncloudPropagator *propagator); bool scheduleSelfOrChild() override; JobParallelism parallelism() override; void abort(PropagatorJob::AbortType abortType) override; - qint64 committedDiskSpace() const override; + [[nodiscard]] qint64 committedDiskSpace() const override; + +public slots: + void appendDirDeletionJob(OCC::PropagatorJob *job); private slots: - void slotSubJobsFinished(SyncFileItem::Status status) override; - void slotDirDeletionJobsFinished(SyncFileItem::Status status); + void slotSubJobsFinished(OCC::SyncFileItem::Status status) override; + void slotDirDeletionJobsFinished(OCC::SyncFileItem::Status status); private: bool scheduleDelayedJobs(); + + PropagatorCompositeJob _dirDeletionJobs; + + SyncFileItem::Status _errorStatus = SyncFileItem::Status::NoStatus; }; /** @@ -396,19 +401,7 @@ public: : PropagateItemJob(propagator, item) { } - void start() override - { - SyncFileItem::Status status = _item->_status; - if (status == SyncFileItem::NoStatus) { - if (_item->_instruction == CSYNC_INSTRUCTION_ERROR) { - status = SyncFileItem::NormalError; - } else { - status = SyncFileItem::FileIgnored; - ASSERT(_item->_instruction == CSYNC_INSTRUCTION_IGNORE); - } - } - done(status, _item->_errorString); - } + void start() override; }; class PropagateUploadFileCommon; @@ -453,7 +446,7 @@ public: QString &removedDirectory, QString &maybeConflictDirectory); - const SyncOptions &syncOptions() const; + [[nodiscard]] const SyncOptions &syncOptions() const; void setSyncOptions(const SyncOptions &syncOptions); int _downloadLimit = 0; @@ -518,14 +511,14 @@ public: bool hasCaseClashAccessibilityProblem(const QString &relfile); Q_REQUIRED_RESULT QString fullLocalPath(const QString &tmp_file_name) const; - QString localPath() const; + [[nodiscard]] QString localPath() const; /** * Returns the full remote path including the folder root of a * folder sync path. */ Q_REQUIRED_RESULT QString fullRemotePath(const QString &tmp_file_name) const; - QString remotePath() const; + [[nodiscard]] QString remotePath() const; /** Creates the job for an item. */ @@ -556,7 +549,7 @@ public: } } - AccountPtr account() const; + [[nodiscard]] AccountPtr account() const; enum DiskSpaceResult { DiskSpaceOk, @@ -567,7 +560,7 @@ public: /** Checks whether there's enough disk space available to complete * all jobs that are currently running. */ - DiskSpaceResult diskSpaceCheck() const; + [[nodiscard]] DiskSpaceResult diskSpaceCheck() const; /** Handles a conflict by renaming the file 'item'. * @@ -581,9 +574,17 @@ public: bool createConflict(const SyncFileItemPtr &item, PropagatorCompositeJob *composite, QString *error); + /** Handles a case clash conflict by renaming the file 'item'. + * + * Sets up conflict records. + * + * Returns true on success, false and error on error. + */ + OCC::Optional createCaseClashConflict(const SyncFileItemPtr &item, const QString &temporaryDownloadedFile); + // Map original path (as in the DB) to target final path QMap _renamedDirectories; - QString adjustRenamedPath(const QString &original) const; + [[nodiscard]] QString adjustRenamedPath(const QString &original) const; /** Update the database for an item. * @@ -619,7 +620,7 @@ public: void removeFromBulkUploadBlackList(const QString &file); - bool isInBulkUploadBlackList(const QString &file) const; + [[nodiscard]] bool isInBulkUploadBlackList(const QString &file) const; private slots: @@ -631,7 +632,7 @@ private slots: } /** Emit the finished signal and make sure it is only emitted once */ - void emitFinished(SyncFileItem::Status status) + void emitFinished(OCC::SyncFileItem::Status status) { if (!_finishedEmited) emit finished(status == SyncFileItem::Success); @@ -642,9 +643,9 @@ private slots: void scheduleNextJobImpl(); signals: - void newItem(const SyncFileItemPtr &); - void itemCompleted(const SyncFileItemPtr &); - void progress(const SyncFileItem &, qint64 bytes); + void newItem(const OCC::SyncFileItemPtr &); + void itemCompleted(const OCC::SyncFileItemPtr &); + void progress(const OCC::SyncFileItem &, qint64 bytes); void finished(bool success); /** Emitted when propagation has problems with a locked file. */ @@ -701,10 +702,13 @@ class CleanupPollsJob : public QObject QSharedPointer _vfs; public: - explicit CleanupPollsJob(const QVector &pollInfos, AccountPtr account, SyncJournalDb *journal, const QString &localPath, - const QSharedPointer &vfs, QObject *parent = nullptr) + explicit CleanupPollsJob(AccountPtr account, + SyncJournalDb *journal, + const QString &localPath, + const QSharedPointer &vfs, + QObject *parent = nullptr) : QObject(parent) - , _pollInfos(pollInfos) + , _pollInfos(journal->getPollInfos()) , _account(account) , _journal(journal) , _localPath(localPath) diff --git a/src/libsync/progressdispatcher.cpp b/src/libsync/progressdispatcher.cpp index 8daf74b46..85b99fb66 100644 --- a/src/libsync/progressdispatcher.cpp +++ b/src/libsync/progressdispatcher.cpp @@ -41,6 +41,8 @@ QString Progress::asResultString(const SyncFileItem &item) } case CSYNC_INSTRUCTION_CONFLICT: return QCoreApplication::translate("progress", "Server version downloaded, copied changed local file into conflict file"); + case CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT: + return QCoreApplication::translate("progress", "Server version downloaded, copied changed local file into case conflict conflict file"); case CSYNC_INSTRUCTION_REMOVE: return QCoreApplication::translate("progress", "Deleted"); case CSYNC_INSTRUCTION_EVAL_RENAME: @@ -65,6 +67,7 @@ QString Progress::asActionString(const SyncFileItem &item) { switch (item._instruction) { case CSYNC_INSTRUCTION_CONFLICT: + case CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT: case CSYNC_INSTRUCTION_SYNC: case CSYNC_INSTRUCTION_NEW: case CSYNC_INSTRUCTION_TYPE_CHANGE: diff --git a/src/libsync/progressdispatcher.h b/src/libsync/progressdispatcher.h index 3e34fdd8f..3276586cd 100644 --- a/src/libsync/progressdispatcher.h +++ b/src/libsync/progressdispatcher.h @@ -68,7 +68,7 @@ public: Done }; - Status status() const; + [[nodiscard]] Status status() const; /** * Called when propagation starts. @@ -84,21 +84,21 @@ public: * is about to start via the transmissionProgress() signal. The * first ProgressInfo will have isUpdatingEstimates() == false. */ - bool isUpdatingEstimates() const; + [[nodiscard]] bool isUpdatingEstimates() const; /** * Increase the file and size totals by the amount indicated in item. */ void adjustTotalsForFile(const SyncFileItem &item); - qint64 totalFiles() const; - qint64 completedFiles() const; + [[nodiscard]] qint64 totalFiles() const; + [[nodiscard]] qint64 completedFiles() const; - qint64 totalSize() const; - qint64 completedSize() const; + [[nodiscard]] qint64 totalSize() const; + [[nodiscard]] qint64 completedSize() const; /** Number of a file that is currently in progress. */ - qint64 currentFile() const; + [[nodiscard]] qint64 currentFile() const; /** Return true if the size needs to be taken in account in the total amount of time */ static inline bool isSizeDependent(const SyncFileItem &item) @@ -131,10 +131,10 @@ public: struct OWNCLOUDSYNC_EXPORT Progress { /** Returns the estimates about progress per second and eta. */ - Estimates estimates() const; + [[nodiscard]] Estimates estimates() const; - qint64 completed() const; - qint64 remaining() const; + [[nodiscard]] qint64 completed() const; + [[nodiscard]] qint64 remaining() const; private: /** @@ -185,7 +185,7 @@ public: /** * Get the total completion estimate */ - Estimates totalProgress() const; + [[nodiscard]] Estimates totalProgress() const; /** * Get the optimistic eta. @@ -193,7 +193,7 @@ public: * This value is based on the highest observed transfer bandwidth * and files-per-second speed. */ - quint64 optimisticEta() const; + [[nodiscard]] quint64 optimisticEta() const; /** * Whether the remaining-time estimate is trusted. @@ -201,12 +201,12 @@ public: * We don't trust it if it is hugely above the optimistic estimate. * See #5046. */ - bool trustEta() const; + [[nodiscard]] bool trustEta() const; /** * Get the current file completion estimate structure */ - Estimates fileProgress(const SyncFileItem &item) const; + [[nodiscard]] Estimates fileProgress(const SyncFileItem &item) const; private slots: /** @@ -279,16 +279,16 @@ signals: @param[out] progress A struct with all progress info. */ - void progressInfo(const QString &folder, const ProgressInfo &progress); + void progressInfo(const QString &folder, const OCC::ProgressInfo &progress); /** * @brief: the item was completed by a job */ - void itemCompleted(const QString &folder, const SyncFileItemPtr &item); + void itemCompleted(const QString &folder, const OCC::SyncFileItemPtr &item); /** * @brief A new folder-wide sync error was seen. */ - void syncError(const QString &folder, const QString &message, ErrorCategory category); + void syncError(const QString &folder, const QString &message, OCC::ErrorCategory category); /** * @brief Emitted when an error needs to be added into GUI @@ -297,7 +297,7 @@ signals: * @param[out] full error message * @param[out] subject (optional) */ - void addErrorToGui(const QString &folder, SyncFileItem::Status status, const QString &errorMessage, const QString &subject); + void addErrorToGui(const QString &folder, OCC::SyncFileItem::Status status, const QString &errorMessage, const QString &subject); /** * @brief Emitted for a folder when a sync is done, listing all pending conflicts diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index d9b3fd7c2..ead85459f 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -219,7 +219,7 @@ void GETFileJob::slotMetaDataChanged() qint64 start = 0; QByteArray ranges = reply()->rawHeader("Content-Range"); if (!ranges.isEmpty()) { - const QRegularExpression rx("bytes (\\d+)-"); + static const QRegularExpression rx("bytes (\\d+)-"); const auto rxMatch = rx.match(ranges); if (rxMatch.hasMatch()) { start = rxMatch.captured(1).toLongLong(); @@ -459,7 +459,11 @@ void PropagateDownloadFile::start() const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString(); SyncJournalFileRecord parentRec; - propagator()->_journal->getFileRecord(parentPath, &parentRec); + if (!propagator()->_journal->getFileRecord(parentPath, &parentRec)) { + qCWarning(lcPropagateDownload) << "could not get file from local DB" << parentPath; + done(SyncFileItem::NormalError, tr("could not get file %1 from local DB").arg(parentPath)); + return; + } const auto account = propagator()->account(); if (!account->capabilities().clientSideEncryptionAvailable() || @@ -502,7 +506,13 @@ void PropagateDownloadFile::startAfterIsEncryptedIsChecked() done(SyncFileItem::NormalError, r.error()); return; } - propagator()->_journal->deleteFileRecord(_item->_originalFile); + + if (!propagator()->_journal->deleteFileRecord(_item->_originalFile)) { + qCWarning(lcPropagateDownload) << "could not delete file from local DB" << _item->_originalFile; + done(SyncFileItem::NormalError, tr("Could not delete file record %1 from local DB").arg(_item->_originalFile)); + return; + } + updateMetadata(false); if (!_item->_remotePerm.isNull() && !_item->_remotePerm.hasPermission(RemotePermissions::CanWrite)) { @@ -516,12 +526,7 @@ void PropagateDownloadFile::startAfterIsEncryptedIsChecked() qCWarning(lcPropagateDownload) << "ignored virtual file type of" << _item->_file; _item->_type = ItemTypeFile; } - if (_item->_type == ItemTypeVirtualFile) { - if (propagator()->localFileNameClash(_item->_file)) { - done(SyncFileItem::FileNameClash, tr("File %1 cannot be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file))); - return; - } - + if (_item->_type == ItemTypeVirtualFile && !propagator()->localFileNameClash(_item->_file)) { qCDebug(lcPropagateDownload) << "creating virtual file" << _item->_file; // do a klaas' case clash check. if (propagator()->localFileNameClash(_item->_file)) { @@ -622,9 +627,18 @@ void PropagateDownloadFile::startDownload() return; // do a klaas' case clash check. - if (propagator()->localFileNameClash(_item->_file)) { - done(SyncFileItem::FileNameClash, tr("File %1 cannot be downloaded because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file))); - return; + if (propagator()->localFileNameClash(_item->_file) && _item->_type != ItemTypeVirtualFile) { + _item->_instruction = CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT; + qCInfo(lcPropagateDownload) << "setting instruction to" << _item->_instruction << _item->_file; + } else if (propagator()->localFileNameClash(_item->_file)) { + _item->_instruction = CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT; + _item->_type = CSyncEnums::ItemTypeVirtualFileDownload; + qCInfo(lcPropagateDownload) << "setting instruction to" << _item->_instruction << _item->_file << "setting type to" << _item->_type; + auto fileName = _item->_file; + if (propagator()->syncOptions()._vfs->mode() == Vfs::WithSuffix) { + fileName.chop(propagator()->syncOptions()._vfs->fileSuffix().size()); + _item->_file = fileName; + } } propagator()->reportProgress(*_item, 0); @@ -855,7 +869,7 @@ void PropagateDownloadFile::slotGetFinished() // of the compressed data. See QTBUG-73364. const auto contentEncoding = job->reply()->rawHeader("content-encoding").toLower(); if ((contentEncoding == "gzip" || contentEncoding == "deflate") - && (job->reply()->attribute(QNetworkRequest::HTTP2WasUsedAttribute).toBool() + && (job->reply()->attribute(QNetworkRequest::Http2WasUsedAttribute).toBool() || job->reply()->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool())) { bodySize = 0; hasSizeHeader = false; @@ -1096,13 +1110,39 @@ void PropagateDownloadFile::contentChecksumComputed(const QByteArray &checksumTy { _item->_checksumHeader = makeChecksumHeader(checksumType, checksum); + const auto localFilePath = propagator()->fullLocalPath(_item->_file); + SyncJournalFileRecord record; + if (_item->_instruction != CSYNC_INSTRUCTION_CONFLICT && FileSystem::fileExists(localFilePath) + && (propagator()->_journal->getFileRecord(_item->_file, &record) && record.isValid()) + && (record._modtime == _item->_modtime && record._etag != _item->_etag)) { + const auto computeChecksum = new ComputeChecksum(this); + computeChecksum->setChecksumType(checksumType); + connect(computeChecksum, &ComputeChecksum::done, this, &PropagateDownloadFile::localFileContentChecksumComputed); + computeChecksum->start(localFilePath); + return; + } + + finalizeDownload(); +} + +void PropagateDownloadFile::localFileContentChecksumComputed(const QByteArray &checksumType, const QByteArray &checksum) +{ + if (_item->_checksumHeader == makeChecksumHeader(checksumType, checksum)) { + FileSystem::remove(_tmpFile.fileName()); + updateMetadata(false); + return; + } + finalizeDownload(); +} + +void PropagateDownloadFile::finalizeDownload() +{ if (_isEncrypted) { if (_downloadEncryptedHelper->decryptFile(_tmpFile)) { - downloadFinished(); + downloadFinished(); } else { - done(SyncFileItem::NormalError, _downloadEncryptedHelper->errorString()); + done(SyncFileItem::NormalError, _downloadEncryptedHelper->errorString()); } - } else { downloadFinished(); } @@ -1111,14 +1151,7 @@ void PropagateDownloadFile::contentChecksumComputed(const QByteArray &checksumTy void PropagateDownloadFile::downloadFinished() { ASSERT(!_tmpFile.isOpen()); - QString fn = propagator()->fullLocalPath(_item->_file); - - // In case of file name clash, report an error - // This can happen if another parallel download saved a clashing file. - if (propagator()->localFileNameClash(_item->_file)) { - done(SyncFileItem::FileNameClash, tr("File %1 cannot be saved because of a local file name clash!").arg(QDir::toNativeSeparators(_item->_file))); - return; - } + const auto filename = propagator()->fullLocalPath(_item->_file); if (_item->_modtime <= 0) { FileSystem::remove(_tmpFile.fileName()); @@ -1143,17 +1176,22 @@ void PropagateDownloadFile::downloadFinished() qCWarning(lcPropagateDownload()) << "invalid modified time" << _item->_file << _item->_modtime; } - bool previousFileExists = FileSystem::fileExists(fn); + if (propagator()->localFileNameClash(_item->_file)) { + _item->_instruction = CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT; + qCInfo(lcPropagateDownload) << "setting instruction to" << _item->_instruction << _item->_file; + } + + auto previousFileExists = FileSystem::fileExists(filename) && _item->_instruction != CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT; if (previousFileExists) { // Preserve the existing file permissions. - QFileInfo existingFile(fn); + const auto existingFile = QFileInfo{filename}; if (existingFile.permissions() != _tmpFile.permissions()) { _tmpFile.setPermissions(existingFile.permissions()); } preserveGroupOwnership(_tmpFile.fileName(), existingFile); // Make the file a hydrated placeholder if possible - const auto result = propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn); + const auto result = propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, filename); if (!result) { done(SyncFileItem::NormalError, result.error()); return; @@ -1163,15 +1201,28 @@ void PropagateDownloadFile::downloadFinished() // Apply the remote permissions FileSystem::setFileReadOnlyWeak(_tmpFile.fileName(), !_item->_remotePerm.isNull() && !_item->_remotePerm.hasPermission(RemotePermissions::CanWrite)); - bool isConflict = _item->_instruction == CSYNC_INSTRUCTION_CONFLICT - && (QFileInfo(fn).isDir() || !FileSystem::fileEquals(fn, _tmpFile.fileName())); + const auto isConflict = (_item->_instruction == CSYNC_INSTRUCTION_CONFLICT + && (QFileInfo(filename).isDir() || !FileSystem::fileEquals(filename, _tmpFile.fileName()))) || + _item->_instruction == CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT; + if (isConflict) { - QString error; - if (!propagator()->createConflict(_item, _associatedComposite, &error)) { - done(SyncFileItem::SoftError, error); + if (_item->_instruction == CSYNC_INSTRUCTION_CASE_CLASH_CONFLICT) { + qCInfo(lcPropagateDownload) << "downloading case clashed file" << _item->_file; + const auto caseClashConflictResult = propagator()->createCaseClashConflict(_item, _tmpFile.fileName()); + if (caseClashConflictResult) { + done(SyncFileItem::SoftError, *caseClashConflictResult); + } else { + done(SyncFileItem::FileNameClash, tr("File %1 downloaded but it resulted in a local file name clash!").arg(QDir::toNativeSeparators(_item->_file))); + } return; + } else { + QString error; + if (!propagator()->createConflict(_item, _associatedComposite, &error)) { + done(SyncFileItem::SoftError, error); + } else { + previousFileExists = false; + } } - previousFileExists = false; } const auto vfs = propagator()->syncOptions()._vfs; @@ -1187,7 +1238,7 @@ void PropagateDownloadFile::downloadFinished() // the discovery phase and now. const qint64 expectedSize = _item->_previousSize; const time_t expectedMtime = _item->_previousModtime; - if (!FileSystem::verifyFileUnchanged(fn, expectedSize, expectedMtime)) { + if (!FileSystem::verifyFileUnchanged(filename, expectedSize, expectedMtime)) { propagator()->_anotherSyncNeeded = true; done(SyncFileItem::SoftError, tr("File has changed since discovery")); return; @@ -1195,14 +1246,14 @@ void PropagateDownloadFile::downloadFinished() } QString error; - emit propagator()->touchedFile(fn); + emit propagator()->touchedFile(filename); // The fileChanged() check is done above to generate better error messages. - if (!FileSystem::uncheckedRenameReplace(_tmpFile.fileName(), fn, &error)) { - qCWarning(lcPropagateDownload) << QString("Rename failed: %1 => %2").arg(_tmpFile.fileName()).arg(fn); + if (!FileSystem::uncheckedRenameReplace(_tmpFile.fileName(), filename, &error)) { + qCWarning(lcPropagateDownload) << QString("Rename failed: %1 => %2").arg(_tmpFile.fileName()).arg(filename); // If the file is locked, we want to retry this sync when it // becomes available again, otherwise try again directly - if (FileSystem::isFileLocked(fn)) { - emit propagator()->seenLockedFile(fn); + if (FileSystem::isFileLocked(filename)) { + emit propagator()->seenLockedFile(filename); } else { propagator()->_anotherSyncNeeded = true; } @@ -1214,14 +1265,14 @@ void PropagateDownloadFile::downloadFinished() qCInfo(lcPropagateDownload()) << propagator()->account()->davUser() << propagator()->account()->davDisplayName() << propagator()->account()->displayName(); if (_item->_locked == SyncFileItem::LockStatus::LockedItem && (_item->_lockOwnerType != SyncFileItem::LockOwnerType::UserLock || _item->_lockOwnerId != propagator()->account()->davUser())) { qCInfo(lcPropagateDownload()) << "file is locked: making it read only"; - FileSystem::setFileReadOnly(fn, true); + FileSystem::setFileReadOnly(filename, true); } - FileSystem::setFileHidden(fn, false); + FileSystem::setFileHidden(filename, false); // Maybe we downloaded a newer version of the file than we thought we would... // Get up to date information for the journal. - _item->_size = FileSystem::getSize(fn); + _item->_size = FileSystem::getSize(filename); // Maybe what we downloaded was a conflict file? If so, set a conflict record. // (the data was prepared in slotGetFinished above) @@ -1236,7 +1287,12 @@ void PropagateDownloadFile::downloadFinished() auto fn = propagator()->fullLocalPath(virtualFile); qCDebug(lcPropagateDownload) << "Download of previous virtual file finished" << fn; QFile::remove(fn); - propagator()->_journal->deleteFileRecord(virtualFile); + + if (!propagator()->_journal->deleteFileRecord(virtualFile)) { + qCWarning(lcPropagateDownload) << "could not delete file from local DB" << virtualFile; + done(SyncFileItem::NormalError, tr("Could not delete file record %1 from local DB").arg(virtualFile)); + return; + } // Move the pin state to the new location auto pin = propagator()->_journal->internalPinStates().rawForPath(virtualFile.toUtf8()); diff --git a/src/libsync/propagatedownload.h b/src/libsync/propagatedownload.h index 941d349b0..cb9304d3e 100644 --- a/src/libsync/propagatedownload.h +++ b/src/libsync/propagatedownload.h @@ -97,7 +97,7 @@ public: void giveBandwidthQuota(qint64 q); qint64 currentDownloadPosition(); - QString errorString() const override; + [[nodiscard]] QString errorString() const override; void setErrorString(const QString &s) { _errorString = s; } SyncFileItem::Status errorStatus() { return _errorStatus; } @@ -109,8 +109,8 @@ public: qint64 resumeStart() { return _resumeStart; } time_t lastModified() { return _lastModified; } - qint64 contentLength() const { return _contentLength; } - qint64 expectedContentLength() const { return _expectedContentLength; } + [[nodiscard]] qint64 contentLength() const { return _contentLength; } + [[nodiscard]] qint64 expectedContentLength() const { return _expectedContentLength; } void setExpectedContentLength(qint64 size) { _expectedContentLength = size; } protected: @@ -202,7 +202,7 @@ public: { } void start() override; - qint64 committedDiskSpace() const override; + [[nodiscard]] qint64 committedDiskSpace() const override; // We think it might finish quickly because it is a small file. bool isLikelyFinishedQuickly() override { return _item->_size < propagator()->smallFileSize(); } @@ -230,6 +230,10 @@ private slots: void transmissionChecksumValidated(const QByteArray &checksumType, const QByteArray &checksum); /// Called when the download's checksum computation is done void contentChecksumComputed(const QByteArray &checksumType, const QByteArray &checksum); + /// Called when the local file's checksum computation is done + void localFileContentChecksumComputed(const QByteArray &checksumType, const QByteArray &checksum); + + void finalizeDownload(); void downloadFinished(); /// Called when it's time to update the db metadata void updateMetadata(bool isConflict); diff --git a/src/libsync/propagatedownloadencrypted.cpp b/src/libsync/propagatedownloadencrypted.cpp index 74f671cd7..77aadbce9 100644 --- a/src/libsync/propagatedownloadencrypted.cpp +++ b/src/libsync/propagatedownloadencrypted.cpp @@ -73,18 +73,20 @@ void PropagateDownloadEncrypted::checkFolderEncryptedMetadata(const QJsonDocumen qCDebug(lcPropagateDownloadEncrypted) << "Metadata Received reading" << _item->_instruction << _item->_file << _item->_encryptedFileName; const QString filename = _info.fileName(); - auto meta = new FolderMetadata(_propagator->account(), json.toJson(QJsonDocument::Compact)); - const QVector files = meta->files(); - - const QString encryptedFilename = _item->_encryptedFileName.section(QLatin1Char('/'), -1); - for (const EncryptedFile &file : files) { - if (encryptedFilename == file.encryptedFilename) { - _encryptedInfo = file; - - qCDebug(lcPropagateDownloadEncrypted) << "Found matching encrypted metadata for file, starting download"; - emit fileMetadataFound(); - return; - } + const FolderMetadata metadata(_propagator->account(), json.toJson(QJsonDocument::Compact)); + if (metadata.isMetadataSetup()) { + const QVector files = metadata.files(); + + const QString encryptedFilename = _item->_encryptedFileName.section(QLatin1Char('/'), -1); + for (const EncryptedFile &file : files) { + if (encryptedFilename == file.encryptedFilename) { + _encryptedInfo = file; + + qCDebug(lcPropagateDownloadEncrypted) << "Found matching encrypted metadata for file, starting download"; + emit fileMetadataFound(); + return; + } + } } emit failed(); diff --git a/src/libsync/propagatedownloadencrypted.h b/src/libsync/propagatedownloadencrypted.h index 3d60adb2e..b379f96cb 100644 --- a/src/libsync/propagatedownloadencrypted.h +++ b/src/libsync/propagatedownloadencrypted.h @@ -18,7 +18,7 @@ public: PropagateDownloadEncrypted(OwncloudPropagator *propagator, const QString &localParentPath, SyncFileItemPtr item, QObject *parent = nullptr); void start(); bool decryptFile(QFile& tmpFile); - QString errorString() const; + [[nodiscard]] QString errorString() const; public slots: void checkFolderId(const QStringList &list); diff --git a/src/libsync/propagateremotedelete.cpp b/src/libsync/propagateremotedelete.cpp index 5006ff432..ddf3f11f7 100644 --- a/src/libsync/propagateremotedelete.cpp +++ b/src/libsync/propagateremotedelete.cpp @@ -113,7 +113,12 @@ void PropagateRemoteDelete::slotDeleteJobFinished() return; } - propagator()->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory()); + if (!propagator()->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory())) { + qCWarning(lcPropagateRemoteDelete) << "could not delete file from local DB" << _item->_originalFile; + done(SyncFileItem::NormalError, tr("Could not delete file record %1 from local DB").arg(_item->_originalFile)); + return; + } + propagator()->_journal->commit("Remote Remove"); done(SyncFileItem::Success); diff --git a/src/libsync/propagateremotedeleteencrypted.cpp b/src/libsync/propagateremotedeleteencrypted.cpp index c648d79e6..1d7ae8aa6 100644 --- a/src/libsync/propagateremotedeleteencrypted.cpp +++ b/src/libsync/propagateremotedeleteencrypted.cpp @@ -53,6 +53,11 @@ void PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived(const Q FolderMetadata metadata(_propagator->account(), json.toJson(QJsonDocument::Compact), statusCode); + if (!metadata.isMetadataSetup()) { + taskFailed(); + return; + } + qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata Received, preparing it for removal of the file"; const QFileInfo info(_propagator->fullLocalPath(_item->_file)); diff --git a/src/libsync/propagateremotedeleteencryptedrootfolder.cpp b/src/libsync/propagateremotedeleteencryptedrootfolder.cpp index add0c00da..e8d86e308 100644 --- a/src/libsync/propagateremotedeleteencryptedrootfolder.cpp +++ b/src/libsync/propagateremotedeleteencryptedrootfolder.cpp @@ -83,6 +83,11 @@ void PropagateRemoteDeleteEncryptedRootFolder::slotFolderEncryptedMetadataReceiv FolderMetadata metadata(_propagator->account(), json.toJson(QJsonDocument::Compact), statusCode); + if (!metadata.isMetadataSetup()) { + taskFailed(); + return; + } + qCDebug(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "It's a root encrypted folder. Let's remove nested items first."; metadata.removeAllEncryptedFiles(); @@ -116,7 +121,9 @@ void PropagateRemoteDeleteEncryptedRootFolder::slotDeleteNestedRemoteItemFinishe const auto nestedItem = _nestedItems.take(encryptedFileName); if (nestedItem.isValid()) { - _propagator->_journal->deleteFileRecord(nestedItem._path, nestedItem._type == ItemTypeDirectory); + if (!_propagator->_journal->deleteFileRecord(nestedItem._path, nestedItem._type == ItemTypeDirectory)) { + qCWarning(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Failed to delete file record from local DB" << nestedItem._path; + } _propagator->_journal->commit("Remote Remove"); } } diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp index f95fbca01..0a2eb2a3c 100644 --- a/src/libsync/propagateremotemkdir.cpp +++ b/src/libsync/propagateremotemkdir.cpp @@ -140,10 +140,13 @@ void PropagateRemoteMkdir::finalizeMkColJob(QNetworkReply::NetworkError err, con propagator()->_activeJobList.append(this); auto propfindJob = new PropfindJob(propagator()->account(), jobPath, this); - propfindJob->setProperties({"http://owncloud.org/ns:permissions"}); + propfindJob->setProperties({QByteArrayLiteral("http://owncloud.org/ns:share-types"), QByteArrayLiteral("http://owncloud.org/ns:permissions")}); connect(propfindJob, &PropfindJob::result, this, [this, jobPath](const QVariantMap &result){ propagator()->_activeJobList.removeOne(this); _item->_remotePerm = RemotePermissions::fromServerString(result.value(QStringLiteral("permissions")).toString()); + _item->_sharedByMe = !result.value(QStringLiteral("share-types")).toString().isEmpty(); + _item->_isShared = _item->_remotePerm.hasPermission(RemotePermissions::IsShared) || _item->_sharedByMe; + _item->_lastShareStateFetchedTimestamp = QDateTime::currentMSecsSinceEpoch(); if (!_uploadEncryptedHelper && !_item->_isEncrypted) { success(); diff --git a/src/libsync/propagateremotemove.cpp b/src/libsync/propagateremotemove.cpp index a101feb12..64ad05641 100644 --- a/src/libsync/propagateremotemove.cpp +++ b/src/libsync/propagateremotemove.cpp @@ -82,8 +82,6 @@ void PropagateRemoteMove::start() QString origin = propagator()->adjustRenamedPath(_item->_file); qCInfo(lcPropagateRemoteMove) << origin << _item->_renameTarget; - QString targetFile(propagator()->fullLocalPath(_item->_renameTarget)); - if (origin == _item->_renameTarget) { // The parent has been renamed already so there is nothing more to do. @@ -245,7 +243,11 @@ void PropagateRemoteMove::finalize() // The db is only queried to transfer the content checksum from the old // to the new record. It is not a problem to skip it here. SyncJournalFileRecord oldRecord; - propagator()->_journal->getFileRecord(_item->_originalFile, &oldRecord); + if (!propagator()->_journal->getFileRecord(_item->_originalFile, &oldRecord)) { + qCWarning(lcPropagateRemoteMove) << "could not get file from local DB" << _item->_originalFile; + done(SyncFileItem::NormalError, tr("could not get file %1 from local DB").arg(_item->_originalFile)); + return; + } auto &vfs = propagator()->syncOptions()._vfs; auto pinState = vfs->pinState(_item->_originalFile); @@ -253,7 +255,11 @@ void PropagateRemoteMove::finalize() if (QFileInfo::exists(targetFile)) { // Delete old db data. - propagator()->_journal->deleteFileRecord(_item->_originalFile); + if (!propagator()->_journal->deleteFileRecord(_item->_originalFile)) { + qCWarning(lcPropagateRemoteMove) << "could not delete file from local DB" << _item->_originalFile; + done(SyncFileItem::NormalError, tr("Could not delete file record %1 from local DB").arg(_item->_originalFile)); + return; + } if (!vfs->setPinState(_item->_originalFile, PinState::Inherited)) { qCWarning(lcPropagateRemoteMove) << "Could not set pin state of" << _item->_originalFile << "to inherited"; } diff --git a/src/libsync/propagateupload.h b/src/libsync/propagateupload.h index b53cc6520..12e06177a 100644 --- a/src/libsync/propagateupload.h +++ b/src/libsync/propagateupload.h @@ -46,10 +46,10 @@ public: qint64 writeData(const char *, qint64) override; qint64 readData(char *data, qint64 maxlen) override; - bool atEnd() const override; - qint64 size() const override; - qint64 bytesAvailable() const override; - bool isSequential() const override; + [[nodiscard]] bool atEnd() const override; + [[nodiscard]] qint64 size() const override; + [[nodiscard]] qint64 bytesAvailable() const override; + [[nodiscard]] bool isSequential() const override; bool seek(qint64 pos) override; void setBandwidthLimited(bool); @@ -131,12 +131,12 @@ public: return _device; } - QString errorString() const override + [[nodiscard]] QString errorString() const override { return _errorString.isEmpty() ? AbstractNetworkJob::errorString() : _errorString; } - std::chrono::milliseconds msSinceStart() const + [[nodiscard]] std::chrono::milliseconds msSinceStart() const { return std::chrono::milliseconds(_requestTimer.elapsed()); } @@ -348,7 +348,7 @@ private: int _chunkCount = 0; /// Total number of chunks for this file uint _transferId = 0; /// transfer id (part of the url) - qint64 chunkSize() const { + [[nodiscard]] qint64 chunkSize() const { // Old chunking does not use dynamic chunking algorithm, and does not adjusts the chunk size respectively, // thus this value should be used as the one classifing item to be chunked return propagator()->syncOptions()._initialChunkSize; @@ -362,7 +362,7 @@ public: void doStartUpload() override; public slots: - void abort(PropagatorJob::AbortType abortType) override; + void abort(OCC::PropagatorJob::AbortType abortType) override; private slots: void startNextChunk(); void slotPutFinished(); @@ -412,7 +412,7 @@ private: void startNewUpload(); void startNextChunk(); public slots: - void abort(AbortType abortType) override; + void abort(OCC::PropagateUploadFileNG::AbortType abortType) override; private slots: void slotPropfindFinished(); void slotPropfindFinishedWithError(); diff --git a/src/libsync/propagateuploadencrypted.cpp b/src/libsync/propagateuploadencrypted.cpp index b81f45b15..41bf8e8ae 100644 --- a/src/libsync/propagateuploadencrypted.cpp +++ b/src/libsync/propagateuploadencrypted.cpp @@ -82,7 +82,7 @@ void PropagateUploadEncrypted::slotFolderEncryptedIdReceived(const QStringList & void PropagateUploadEncrypted::slotTryLock(const QByteArray& fileId) { - auto *lockJob = new LockEncryptFolderApiJob(_propagator->account(), fileId, this); + const auto lockJob = new LockEncryptFolderApiJob(_propagator->account(), fileId, _propagator->_journal, _propagator->account()->e2e()->_publicKey, this); connect(lockJob, &LockEncryptFolderApiJob::success, this, &PropagateUploadEncrypted::slotFolderLockedSuccessfully); connect(lockJob, &LockEncryptFolderApiJob::error, this, &PropagateUploadEncrypted::slotFolderLockedError); lockJob->start(); @@ -122,7 +122,17 @@ void PropagateUploadEncrypted::slotFolderEncryptedMetadataReceived(const QJsonDo qCDebug(lcPropagateUploadEncrypted) << "Metadata Received, Preparing it for the new file." << json.toVariant(); // Encrypt File! - _metadata = new FolderMetadata(_propagator->account(), json.toJson(QJsonDocument::Compact), statusCode); + _metadata.reset(new FolderMetadata(_propagator->account(), json.toJson(QJsonDocument::Compact), statusCode)); + + if (!_metadata->isMetadataSetup()) { + if (_isFolderLocked) { + connect(this, &PropagateUploadEncrypted::folderUnlocked, this, &PropagateUploadEncrypted::error); + unlockFolder(); + } else { + emit error(); + } + return; + } QFileInfo info(_propagator->fullLocalPath(_item->_file)); const QString fileName = info.fileName(); @@ -145,7 +155,6 @@ void PropagateUploadEncrypted::slotFolderEncryptedMetadataReceived(const QJsonDo if (!found) { encryptedFile.encryptionKey = EncryptionHelper::generateRandom(16); encryptedFile.encryptedFilename = EncryptionHelper::generateRandomFilename(); - encryptedFile.initializationVector = EncryptionHelper::generateRandom(16); encryptedFile.fileVersion = 1; encryptedFile.metadataKey = 1; encryptedFile.originalFilename = fileName; @@ -159,6 +168,8 @@ void PropagateUploadEncrypted::slotFolderEncryptedMetadataReceived(const QJsonDo encryptedFile.mimetype = QByteArrayLiteral("httpd/unix-directory"); } } + + encryptedFile.initializationVector = EncryptionHelper::generateRandom(16); _item->_encryptedFileName = _remoteParentPath + QLatin1Char('/') + encryptedFile.encryptedFilename; _item->_isEncrypted = true; @@ -277,8 +288,7 @@ void PropagateUploadEncrypted::unlockFolder() _isUnlockRunning = true; qDebug() << "Calling Unlock"; - auto *unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(), - _folderId, _folderToken, this); + auto *unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(), _folderId, _folderToken, _propagator->_journal, this); connect(unlockJob, &UnlockEncryptFolderApiJob::success, [this](const QByteArray &folderId) { qDebug() << "Successfully Unlocked"; diff --git a/src/libsync/propagateuploadencrypted.h b/src/libsync/propagateuploadencrypted.h index 246b32cac..7faa2ab90 100644 --- a/src/libsync/propagateuploadencrypted.h +++ b/src/libsync/propagateuploadencrypted.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -39,9 +40,9 @@ public: void unlockFolder(); - bool isUnlockRunning() const { return _isUnlockRunning; } - bool isFolderLocked() const { return _isFolderLocked; } - const QByteArray folderToken() const { return _folderToken; } + [[nodiscard]] bool isUnlockRunning() const { return _isUnlockRunning; } + [[nodiscard]] bool isFolderLocked() const { return _isFolderLocked; } + [[nodiscard]] const QByteArray folderToken() const { return _folderToken; } private slots: void slotFolderEncryptedIdReceived(const QStringList &list); @@ -76,7 +77,7 @@ private: QByteArray _generatedKey; QByteArray _generatedIv; - FolderMetadata *_metadata; + QScopedPointer _metadata; EncryptedFile _encryptedFile; QString _completeFileName; }; diff --git a/src/libsync/propagatorjobs.cpp b/src/libsync/propagatorjobs.cpp index 25bc8a7ed..84005cdb9 100644 --- a/src/libsync/propagatorjobs.cpp +++ b/src/libsync/propagatorjobs.cpp @@ -79,7 +79,9 @@ bool PropagateLocalRemove::removeRecursively(const QString &path) if (it.second) { deletedDir = it.first; } - propagator()->_journal->deleteFileRecord(it.first.mid(propagator()->localPath().size()), it.second); + if (!propagator()->_journal->deleteFileRecord(it.first.mid(propagator()->localPath().size()), it.second)) { + qCWarning(lcPropagateLocalRemove) << "Failed to delete file record from local DB" << it.first.mid(propagator()->localPath().size()); + } } _error = errors.join(", "); @@ -100,7 +102,7 @@ void PropagateLocalRemove::start() qCInfo(lcPropagateLocalRemove) << "Going to delete:" << filename; if (propagator()->localFileNameClash(_item->_file)) { - done(SyncFileItem::NormalError, tr("Could not remove %1 because of a local file name clash").arg(QDir::toNativeSeparators(filename))); + done(SyncFileItem::FileNameClash, tr("Could not remove %1 because of a local file name clash").arg(QDir::toNativeSeparators(filename))); return; } @@ -126,7 +128,11 @@ void PropagateLocalRemove::start() } } propagator()->reportProgress(*_item, 0); - propagator()->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory()); + if (!propagator()->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory())) { + qCWarning(lcPropagateLocalRename) << "could not delete file from local DB" << _item->_originalFile; + done(SyncFileItem::NormalError, tr("Could not delete file record %1 from local DB").arg(_item->_originalFile)); + return; + } propagator()->_journal->commit("Local remove"); done(SyncFileItem::Success); } @@ -172,7 +178,7 @@ void PropagateLocalMkdir::startLocalMkdir() if (Utility::fsCasePreserving() && propagator()->localFileNameClash(_item->_file)) { qCWarning(lcPropagateLocalMkdir) << "New folder to create locally already exists with different case:" << _item->_file; - done(SyncFileItem::NormalError, tr("Attention, possible case sensitivity clash with %1").arg(newDirStr)); + done(SyncFileItem::FileNameClash, tr("Folder %1 cannot be created because of a local file or folder name clash!").arg(newDirStr)); return; } emit propagator()->touchedFile(newDirStr); @@ -216,11 +222,19 @@ void PropagateLocalRename::start() if (propagator()->_abortRequested) return; + auto &vfs = propagator()->syncOptions()._vfs; const auto previousNameInDb = propagator()->adjustRenamedPath(_item->_file); const auto existingFile = propagator()->fullLocalPath(propagator()->adjustRenamedPath(_item->_file)); const auto targetFile = propagator()->fullLocalPath(_item->_renameTarget); const auto fileAlreadyMoved = !QFileInfo::exists(propagator()->fullLocalPath(_item->_originalFile)); + auto pinState = OCC::PinState::Unspecified; + if (!fileAlreadyMoved) { + auto pinStateResult = vfs->pinState(propagator()->adjustRenamedPath(_item->_file)); + if (pinStateResult) { + pinState = pinStateResult.get(); + } + } // if the file is a file underneath a moved dir, the _item->file is equal // to _item->renameTarget and the file is not moved as a result. @@ -231,21 +245,20 @@ void PropagateLocalRename::start() if (QString::compare(_item->_file, _item->_renameTarget, Qt::CaseInsensitive) != 0 && propagator()->localFileNameClash(_item->_renameTarget)) { - // Only use localFileNameClash for the destination if we know that the source was not - // the one conflicting (renaming A.txt -> a.txt is OK) - - // Fixme: the file that is the reason for the clash could be named here, - // it would have to come out the localFileNameClash function - done(SyncFileItem::NormalError, - tr("File %1 cannot be renamed to %2 because of a local file name clash") - .arg(QDir::toNativeSeparators(_item->_file), QDir::toNativeSeparators(_item->_renameTarget))); + + qCInfo(lcPropagateLocalRename) << "renaming a case clashed file" << _item->_file << _item->_renameTarget; + const auto caseClashConflictResult = propagator()->createCaseClashConflict(_item, existingFile); + if (caseClashConflictResult) { + done(SyncFileItem::SoftError, *caseClashConflictResult); + } else { + done(SyncFileItem::FileNameClash, tr("File %1 downloaded but it resulted in a local file name clash!").arg(QDir::toNativeSeparators(_item->_file))); + } return; } emit propagator()->touchedFile(existingFile); emit propagator()->touchedFile(targetFile); - QString renameError; - if (!FileSystem::rename(existingFile, targetFile, &renameError)) { + if (QString renameError; !FileSystem::rename(existingFile, targetFile, &renameError)) { done(SyncFileItem::NormalError, renameError); return; } @@ -264,10 +277,10 @@ void PropagateLocalRename::start() return; } - auto &vfs = propagator()->syncOptions()._vfs; - auto pinState = vfs->pinState(_item->_originalFile); - if (!vfs->setPinState(_item->_originalFile, PinState::Inherited)) { - qCWarning(lcPropagateLocalRename) << "Could not set pin state of" << _item->_originalFile << "to inherited"; + if (!vfs->setPinState(_item->_renameTarget, pinState)) { + qCWarning(lcPropagateLocalRename) << "Could not set pin state of" << _item->_renameTarget << "to old value" << pinState; + done(SyncFileItem::NormalError, tr("Error setting pin state")); + return; } const auto oldFile = _item->_file; @@ -326,11 +339,6 @@ void PropagateLocalRename::start() return; } } - if (pinState && *pinState != PinState::Inherited - && !vfs->setPinState(_item->_renameTarget, *pinState)) { - done(SyncFileItem::NormalError, tr("Error setting pin state")); - return; - } propagator()->_journal->commit("localRename"); @@ -339,8 +347,7 @@ void PropagateLocalRename::start() bool PropagateLocalRename::deleteOldDbRecord(const QString &fileName) { - SyncJournalFileRecord oldRecord; - if (!propagator()->_journal->getFileRecord(fileName, &oldRecord)) { + if (SyncJournalFileRecord oldRecord; !propagator()->_journal->getFileRecord(fileName, &oldRecord)) { qCWarning(lcPropagateLocalRename) << "could not get file from local DB" << fileName; done(SyncFileItem::NormalError, tr("could not get file %1 from local DB").arg(fileName)); return false; diff --git a/src/libsync/pushnotifications.h b/src/libsync/pushnotifications.h index 1409c92a0..321ad1cc4 100644 --- a/src/libsync/pushnotifications.h +++ b/src/libsync/pushnotifications.h @@ -52,7 +52,7 @@ public: * * Ready to use means connected and authenticated. */ - bool isReady() const; + [[nodiscard]] bool isReady() const; /** * Set the interval in which the websocket will ping the server if it is still alive. @@ -72,17 +72,17 @@ signals: /** * Will be emitted if files on the server changed */ - void filesChanged(Account *account); + void filesChanged(OCC::Account *account); /** * Will be emitted if activities have been changed on the server */ - void activitiesChanged(Account *account); + void activitiesChanged(OCC::Account *account); /** * Will be emitted if notifications have been changed on the server */ - void notificationsChanged(Account *account); + void notificationsChanged(OCC::Account *account); /** * Will be emitted if push notifications are unable to authenticate diff --git a/src/libsync/putmultifilejob.h b/src/libsync/putmultifilejob.h index a43f2805f..f53b73a41 100644 --- a/src/libsync/putmultifilejob.h +++ b/src/libsync/putmultifilejob.h @@ -69,12 +69,12 @@ public: bool finished() override; - QString errorString() const override + [[nodiscard]] QString errorString() const override { return _errorString.isEmpty() ? AbstractNetworkJob::errorString() : _errorString; } - std::chrono::milliseconds msSinceStart() const + [[nodiscard]] std::chrono::milliseconds msSinceStart() const { return std::chrono::milliseconds(_requestTimer.elapsed()); } diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 261654c9f..fe89c34e1 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -30,6 +30,8 @@ #include "configfile.h" #include "discovery.h" #include "common/vfs.h" +#include "clientsideencryption.h" +#include "clientsideencryptionjobs.h" #ifdef Q_OS_WIN #include @@ -268,7 +270,9 @@ void SyncEngine::deleteStaleErrorBlacklistEntries(const SyncFileItemVector &sync } // Delete from journal. - _journal->deleteStaleErrorBlacklistEntries(blacklist_file_paths); + if (!_journal->deleteStaleErrorBlacklistEntries(blacklist_file_paths)) { + qCWarning(lcEngine) << "Could not delete StaleErrorBlacklistEntries from DB"; + } } #if (QT_VERSION < 0x050600) @@ -284,7 +288,7 @@ void SyncEngine::conflictRecordMaintenance() const auto conflictRecordPaths = _journal->conflictRecordPaths(); for (const auto &path : conflictRecordPaths) { auto fsPath = _propagator->fullLocalPath(QString::fromUtf8(path)); - if (!QFileInfo(fsPath).exists()) { + if (!QFileInfo::exists(fsPath)) { _journal->deleteConflictRecord(path); } } @@ -315,6 +319,20 @@ void SyncEngine::conflictRecordMaintenance() } } +void SyncEngine::caseClashConflictRecordMaintenance() +{ + // Remove stale conflict entries from the database + // by checking which files still exist and removing the + // missing ones. + const auto conflictRecordPaths = _journal->caseClashConflictRecordPaths(); + for (const auto &path : conflictRecordPaths) { + const auto fsPath = _propagator->fullLocalPath(QString::fromUtf8(path)); + if (!QFileInfo::exists(fsPath)) { + _journal->deleteCaseClashConflictByPathRecord(path); + } + } +} + void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item) { @@ -377,16 +395,40 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item) emit itemCompleted(item); return; } + } else { + if (!FileSystem::setModTime(filePath, item->_modtime)) { + item->_instruction = CSYNC_INSTRUCTION_ERROR; + item->_errorString = tr("Could not update file metadata: %1").arg(filePath); + emit itemCompleted(item); + return; + } } // Updating the db happens on success - _journal->setFileRecord(rec); + if (!_journal->setFileRecord(rec)) { + item->_status = SyncFileItem::Status::NormalError; + item->_instruction = CSYNC_INSTRUCTION_ERROR; + item->_errorString = tr("Could not set file record to local DB: %1").arg(rec.path()); + qCWarning(lcEngine) << "Could not set file record to local DB" << rec.path(); + } // This might have changed the shared flag, so we must notify SyncFileStatusTracker for example emit itemCompleted(item); } else { // Update only outdated data from the disk. - _journal->updateLocalMetadata(item->_file, item->_modtime, item->_size, item->_inode); + + SyncJournalFileLockInfo lockInfo; + lockInfo._locked = item->_locked == SyncFileItem::LockStatus::LockedItem; + lockInfo._lockTime = item->_lockTime; + lockInfo._lockTimeout = item->_lockTimeout; + lockInfo._lockOwnerId = item->_lockOwnerId; + lockInfo._lockOwnerType = static_cast(item->_lockOwnerType); + lockInfo._lockOwnerDisplayName = item->_lockOwnerDisplayName; + lockInfo._lockEditorApp = item->_lockOwnerDisplayName; + + if (!_journal->updateLocalMetadata(item->_file, item->_modtime, item->_size, item->_inode, lockInfo)) { + qCWarning(lcEngine) << "Could not update local metadata for file" << item->_file; + } } _hasNoneFiles = true; return; @@ -436,17 +478,28 @@ void SyncEngine::startSync() QVector pollInfos = _journal->getPollInfos(); if (!pollInfos.isEmpty()) { qCInfo(lcEngine) << "Finish Poll jobs before starting a sync"; - auto *job = new CleanupPollsJob(pollInfos, _account, + auto *job = new CleanupPollsJob(_account, _journal, _localPath, _syncOptions._vfs, this); connect(job, &CleanupPollsJob::finished, this, &SyncEngine::startSync); connect(job, &CleanupPollsJob::aborted, this, &SyncEngine::slotCleanPollsJobAborted); job->start(); return; } + + const auto e2EeLockedFolders = _journal->e2EeLockedFolders(); + + if (!e2EeLockedFolders.isEmpty()) { + for (const auto &e2EeLockedFolder : e2EeLockedFolders) { + const auto folderId = e2EeLockedFolder.first; + qCInfo(lcEngine()) << "start unlock job for folderId:" << folderId; + const auto folderToken = EncryptionHelper::decryptStringAsymmetric(_account->e2e()->_privateKey, e2EeLockedFolder.second); + const auto unlockJob = new OCC::UnlockEncryptFolderApiJob(_account, folderId, folderToken, _journal, this); + unlockJob->start(); + } + } } if (s_anySyncRunning || _syncRunning) { - ASSERT(false) return; } @@ -732,10 +785,16 @@ void SyncEngine::slotDiscoveryFinished() restoreOldFiles(_syncItems); } - if (_discoveryPhase->_anotherSyncNeeded && _anotherSyncNeeded == NoFollowUpSync) { + if (_discoveryPhase->_anotherSyncNeeded && !_discoveryPhase->_filesNeedingScheduledSync.empty()) { + slotScheduleFilesDelayedSync(); + } else if (_discoveryPhase->_anotherSyncNeeded && _anotherSyncNeeded == NoFollowUpSync) { _anotherSyncNeeded = ImmediateFollowUp; } + if (!_discoveryPhase->_filesUnscheduleSync.empty()) { + slotUnscheduleFilesDelayedSync(); + } + Q_ASSERT(std::is_sorted(_syncItems.begin(), _syncItems.end())); qCInfo(lcEngine) << "#### Reconcile (aboutToPropagate) #################################################### " << _stopWatch.addLapTime(QStringLiteral("Reconcile (aboutToPropagate)")) << "ms"; @@ -875,6 +934,7 @@ void SyncEngine::slotPropagationFinished(bool success) } conflictRecordMaintenance(); + caseClashConflictRecordMaintenance(); _journal->deleteStaleFlagsEntries(); _journal->commit("All Finished.", false); @@ -1000,11 +1060,6 @@ bool SyncEngine::wasFileTouched(const QString &fn) const return false; } -AccountPtr SyncEngine::account() const -{ - return _account; -} - void SyncEngine::setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set paths) { _localDiscoveryStyle = style; @@ -1078,12 +1133,14 @@ bool SyncEngine::shouldDiscoverLocally(const QString &path) const void SyncEngine::wipeVirtualFiles(const QString &localPath, SyncJournalDb &journal, Vfs &vfs) { qCInfo(lcEngine) << "Wiping virtual files inside" << localPath; - journal.getFilesBelowPath(QByteArray(), [&](const SyncJournalFileRecord &rec) { + const auto resGetFilesBelowPath = journal.getFilesBelowPath(QByteArray(), [&](const SyncJournalFileRecord &rec) { if (rec._type != ItemTypeVirtualFile && rec._type != ItemTypeVirtualFileDownload) return; qCDebug(lcEngine) << "Removing db record for" << rec.path(); - journal.deleteFileRecord(rec._path); + if (!journal.deleteFileRecord(rec._path)) { + qCWarning(lcEngine) << "Could not update delete file record" << rec._path; + } // If the local file is a dehydrated placeholder, wipe it too. // Otherwise leave it to allow the next sync to have a new-new conflict. @@ -1094,6 +1151,10 @@ void SyncEngine::wipeVirtualFiles(const QString &localPath, SyncJournalDb &journ } }); + if (!resGetFilesBelowPath) { + qCWarning(lcEngine) << "Faied to get files below path" << localPath; + } + journal.forceRemoteDiscoveryNextSync(); // Postcondition: No ItemTypeVirtualFile / ItemTypeVirtualFileDownload left in the db. @@ -1103,7 +1164,7 @@ void SyncEngine::wipeVirtualFiles(const QString &localPath, SyncJournalDb &journ void SyncEngine::switchToVirtualFiles(const QString &localPath, SyncJournalDb &journal, Vfs &vfs) { qCInfo(lcEngine) << "Convert to virtual files inside" << localPath; - journal.getFilesBelowPath({}, [&](const SyncJournalFileRecord &rec) { + const auto res = journal.getFilesBelowPath({}, [&](const SyncJournalFileRecord &rec) { const auto path = rec.path(); const auto fileName = QFileInfo(path).fileName(); if (FileSystem::isExcludeFile(fileName)) { @@ -1116,6 +1177,10 @@ void SyncEngine::switchToVirtualFiles(const QString &localPath, SyncJournalDb &j qCWarning(lcEngine) << "Could not convert file to placeholder" << result.error(); } }); + + if (!res) { + qCWarning(lcEngine) << "Faied to get files below path" << localPath; + } } void SyncEngine::abort() @@ -1161,4 +1226,200 @@ void SyncEngine::slotInsufficientRemoteStorage() emit syncError(msg, ErrorCategory::InsufficientRemoteStorage); } +void SyncEngine::slotScheduleFilesDelayedSync() +{ + if (!_discoveryPhase || _discoveryPhase->_filesNeedingScheduledSync.empty()) { + return; + } + + // The latest sync of the interval bucket is the one that goes through and is used in the timer. + // By running the sync run as late as possible in the selected interval, we try to strike a + // balance between updating the needed file in a timely manner while also syncing late enough + // to cover all the files in the interval bucket. + + static constexpr qint64 intervalSecs = 60; + const auto scheduledSyncBuckets = groupNeededScheduledSyncRuns(intervalSecs); + + qCDebug(lcEngine) << "Active scheduled sync run timers:" << _scheduledSyncTimers.count(); + + for (const auto &[scheduledSyncTimerSecs, filesAffected] : scheduledSyncBuckets) { + + const auto currentSecsSinceEpoch = QDateTime::currentSecsSinceEpoch(); + const auto scheduledSyncTimerTime = QDateTime::fromSecsSinceEpoch(currentSecsSinceEpoch + scheduledSyncTimerSecs); + const auto scheduledSyncTimerMsecs = std::chrono::milliseconds(scheduledSyncTimerSecs * 1000); + + const auto addFilesToTimerAndScheduledHash = [this, &files = filesAffected] (const QSharedPointer &timer) { + for (const auto &file : files) { + timer->files.insert(file); + _filesScheduledForLaterSync.insert(file, timer); + } + }; + + // We want to make sure that this bucket won't schedule a sync near a pre-existing sync run, + // as we often get, for example, locked file notifications one by one as the user interacts + // through the web. + + const auto nearbyTimer = nearbyScheduledSyncTimer(scheduledSyncTimerSecs, intervalSecs); + + if (nearbyTimer) { + addFilesToTimerAndScheduledHash(nearbyTimer); + qCInfo(lcEngine) << "Using a nearby scheduled sync run at:" << scheduledSyncTimerTime + << "for files:" << filesAffected + << "this timer is now resoponsible for files:" << nearbyTimer->files; + continue; + } + + qCInfo(lcEngine) << "Will have a new sync run in" << scheduledSyncTimerSecs + << "seconds, at" << scheduledSyncTimerTime + << "for files:" << filesAffected; + + QSharedPointer newTimer(new ScheduledSyncTimer); + newTimer->setSingleShot(true); + newTimer->callOnTimeout(this, [this, newTimer] { + qCInfo(lcEngine) << "Rescanning now that delayed sync run is scheduled for:" << newTimer->files; + + for (const auto &file : qAsConst(newTimer->files)) { + this->_filesScheduledForLaterSync.remove(file); + } + + this->startSync(); + this->slotCleanupScheduledSyncTimers(); + }); + + addFilesToTimerAndScheduledHash(newTimer); + newTimer->start(scheduledSyncTimerMsecs); + _scheduledSyncTimers.append(newTimer); + } +} + +QHash SyncEngine::groupNeededScheduledSyncRuns(const qint64 interval) const +{ + if (!_discoveryPhase || _discoveryPhase->_filesNeedingScheduledSync.empty()) { + return {}; + } + + QHash intervalSyncBuckets; + + for (auto it = _discoveryPhase->_filesNeedingScheduledSync.cbegin(); + it != _discoveryPhase->_filesNeedingScheduledSync.cend(); + ++it) { + + const auto file = it.key(); + const auto syncScheduledSecs = it.value(); + + // We don't want to schedule syncs again for files we have already discovered needing a + // scheduled sync, unless the files have been re-locked or had their lock expire time + // extended. So we check the time-out of the already set timer with the time-out we + // receive from the server entry + // + // Since the division here is both of ints, we receive a "floor" of the division, so we + // are safe from a possible situation where the timer's interval is lower than we need + // for the file we are possibly scheduling a sync run for + + if (_filesScheduledForLaterSync.contains(file) && + _filesScheduledForLaterSync.value(file)->interval() / 1000 >= syncScheduledSecs) { + + continue; + } + + // Both qint64 so division results in floor-ed result + const auto intervalBucketKey = syncScheduledSecs / interval; + + if (!intervalSyncBuckets.contains(intervalBucketKey)) { + intervalSyncBuckets.insert(intervalBucketKey, {syncScheduledSecs, {file}}); + continue; + } + + auto bucketValue = intervalSyncBuckets.value(intervalBucketKey); + bucketValue.scheduledSyncTimerSecs = qMax(bucketValue.scheduledSyncTimerSecs, syncScheduledSecs); + bucketValue.files.append(file); + intervalSyncBuckets.insert(intervalBucketKey, bucketValue); + } + + return intervalSyncBuckets; +} + +QSharedPointer SyncEngine::nearbyScheduledSyncTimer(const qint64 scheduledSyncTimerSecs, + const qint64 intervalSecs) const +{ + const auto scheduledSyncTimerMsecs = scheduledSyncTimerSecs * 1000; + const auto halfIntervalMsecs = (intervalSecs * 1000) / 2; + + for (const auto &scheduledTimer : _scheduledSyncTimers) { + + const auto timerRemainingMsecs = scheduledTimer->remainingTime(); + const auto differenceMsecs = timerRemainingMsecs - scheduledSyncTimerMsecs; + const auto nearbyScheduledSync = differenceMsecs > -halfIntervalMsecs && + differenceMsecs < halfIntervalMsecs; + + // Iterated timer is going to fire slightly before we need it to for the parameter timer, delay it. + if (differenceMsecs > -halfIntervalMsecs && differenceMsecs < 0) { + + const auto scheduledSyncTimerTimeoutMsecs = std::chrono::milliseconds(scheduledSyncTimerMsecs); + scheduledTimer->start(scheduledSyncTimerTimeoutMsecs); + + qCDebug(lcEngine) << "Delayed sync timer with remaining time" << timerRemainingMsecs / 1000 + << "by" << (differenceMsecs * -1) / 1000 + << "seconds due to nearby new sync run needed."; + } + + if(nearbyScheduledSync) { + return scheduledTimer; + } + } + + return {}; +} + +void SyncEngine::slotCleanupScheduledSyncTimers() +{ + qCDebug(lcEngine) << "Beginning scheduled sync timer cleanup."; + + auto it = _scheduledSyncTimers.begin(); + + while(it != _scheduledSyncTimers.end()) { + const auto &timer = *it; + auto eraseTimer = false; + + if(timer && (timer->files.empty() || !timer->isActive())) { + qCInfo(lcEngine) << "Stopping and erasing an expired/empty scheduled sync run timer."; + timer->stop(); + eraseTimer = true; + } else if (!timer) { + qCInfo(lcEngine) << "Erasing a null scheduled sync run timer."; + eraseTimer = true; + } + + if(eraseTimer) { + it = _scheduledSyncTimers.erase(it); + } else { + ++it; + } + } +} + +void SyncEngine::slotUnscheduleFilesDelayedSync() +{ + if (!_discoveryPhase || _discoveryPhase->_filesUnscheduleSync.empty()) { + return; + } + + for (const auto &file : qAsConst(_discoveryPhase->_filesUnscheduleSync)) { + const auto fileSyncRunTimer = _filesScheduledForLaterSync.value(file); + + if (fileSyncRunTimer) { + fileSyncRunTimer->files.remove(file); + + // Below is only needed for logging + const auto currentMSecsSinceEpoch = QDateTime::currentMSecsSinceEpoch(); + const auto scheduledSyncTimerMSecs = fileSyncRunTimer->remainingTime(); + const auto timerExpireDate = QDateTime::fromMSecsSinceEpoch(currentMSecsSinceEpoch + scheduledSyncTimerMSecs); + qCInfo(lcEngine) << "Removed" << file << "from sync run timer elapsing at" << timerExpireDate + << "this timer is still running for files:" << fileSyncRunTimer->files; + } + } + + slotCleanupScheduledSyncTimers(); +} + } // namespace OCC diff --git a/src/libsync/syncengine.h b/src/libsync/syncengine.h index dba992215..68982e63b 100644 --- a/src/libsync/syncengine.h +++ b/src/libsync/syncengine.h @@ -71,33 +71,22 @@ public: ~SyncEngine() override; - Q_INVOKABLE void startSync(); - void setNetworkLimits(int upload, int download); - - /* Abort the sync. Called from the main thread */ - void abort(); - - bool isSyncRunning() const { return _syncRunning; } - - SyncOptions syncOptions() const { return _syncOptions; } - void setSyncOptions(const SyncOptions &options) { _syncOptions = options; } - bool ignoreHiddenFiles() const { return _ignore_hidden_files; } - void setIgnoreHiddenFiles(bool ignore) { _ignore_hidden_files = ignore; } + [[nodiscard]] bool isSyncRunning() const { return _syncRunning; } - void addAcceptedInvalidFileName(const QString& filePath); + [[nodiscard]] SyncOptions syncOptions() const { return _syncOptions; } + [[nodiscard]] bool ignoreHiddenFiles() const { return _ignore_hidden_files; } - ExcludedFiles &excludedFiles() { return *_excludedFiles; } - Utility::StopWatch &stopWatch() { return _stopWatch; } - SyncFileStatusTracker &syncFileStatusTracker() { return *_syncFileStatusTracker; } + [[nodiscard]] ExcludedFiles &excludedFiles() const { return *_excludedFiles; } + [[nodiscard]] SyncFileStatusTracker &syncFileStatusTracker() const { return *_syncFileStatusTracker; } /* Returns whether another sync is needed to complete the sync */ - AnotherSyncNeeded isAnotherSyncNeeded() { return _anotherSyncNeeded; } + [[nodiscard]] AnotherSyncNeeded isAnotherSyncNeeded() const { return _anotherSyncNeeded; } - bool wasFileTouched(const QString &fn) const; + [[nodiscard]] bool wasFileTouched(const QString &fn) const; - AccountPtr account() const; - SyncJournalDb *journal() const { return _journal; } - QString localPath() const { return _localPath; } + [[nodiscard]] AccountPtr account() const { return _account; }; + [[nodiscard]] SyncJournalDb *journal() const { return _journal; } + [[nodiscard]] QString localPath() const { return _localPath; } /** Duration in ms that uploads should be delayed after a file change * @@ -111,22 +100,6 @@ public: */ static std::chrono::milliseconds minimumFileAgeForUpload; - /** - * Control whether local discovery should read from filesystem or db. - * - * 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. - * - * Note, the style and paths are only retained for the next sync and - * revert afterwards. Use _lastLocalDiscoveryStyle to discover the last - * sync's style. - */ - void setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set paths = {}); - - void setSingleItemDiscoveryOptions(const SingleItemDiscoveryOptions &singleItemDiscoveryOptions); - const SyncEngine::SingleItemDiscoveryOptions &singleItemDiscoveryOptions() const; - /** * Returns whether the given folder-relative path should be locally discovered * given the local discovery options. @@ -134,10 +107,10 @@ public: * 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 QString &path) const; + [[nodiscard]] bool shouldDiscoverLocally(const QString &path) const; /** Access the last sync run's local discovery style */ - LocalDiscoveryStyle lastLocalDiscoveryStyle() const { return _lastLocalDiscoveryStyle; } + [[nodiscard]] LocalDiscoveryStyle lastLocalDiscoveryStyle() const { return _lastLocalDiscoveryStyle; } /** Removes all virtual file db entries and dehydrated local placeholders. * @@ -151,26 +124,53 @@ public: static void switchToVirtualFiles(const QString &localPath, SyncJournalDb &journal, Vfs &vfs); - auto getPropagator() { return _propagator; } // for the test + [[nodiscard]] QSharedPointer getPropagator() const { return _propagator; } // for the test + [[nodiscard]] const SyncEngine::SingleItemDiscoveryOptions &singleItemDiscoveryOptions() const; + +public slots: + void setSingleItemDiscoveryOptions(const SingleItemDiscoveryOptions &singleItemDiscoveryOptions); + + void startSync(); + + /* Abort the sync. Called from the main thread */ + void abort(); + + void setNetworkLimits(int upload, int download); + void setSyncOptions(const OCC::SyncOptions &options) { _syncOptions = options; } + void setIgnoreHiddenFiles(bool ignore) { _ignore_hidden_files = ignore; } + + /** + * Control whether local discovery should read from filesystem or db. + * + * 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. + * + * Note, the style and paths are only retained for the next sync and + * revert afterwards. Use _lastLocalDiscoveryStyle to discover the last + * sync's style. + */ + void setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle style, std::set paths = {}); + void addAcceptedInvalidFileName(const QString& filePath); signals: // During update, before reconcile void rootEtag(const QByteArray &, const QDateTime &); // after the above signals. with the items that actually need propagating - void aboutToPropagate(SyncFileItemVector &); + void aboutToPropagate(OCC::SyncFileItemVector &); // after each item completed by a job (successful or not) - void itemCompleted(const SyncFileItemPtr &); + void itemCompleted(const OCC::SyncFileItemPtr &); - void transmissionProgress(const ProgressInfo &progress); + void transmissionProgress(const OCC::ProgressInfo &progress); void itemDiscovered(const SyncFileItemPtr &); /// We've produced a new sync error of a type. - void syncError(const QString &message, ErrorCategory category = ErrorCategory::Normal); + void syncError(const QString &message, OCC::ErrorCategory category = OCC::ErrorCategory::Normal); - void addErrorToGui(SyncFileItem::Status status, const QString &errorMessage, const QString &subject); + void addErrorToGui(OCC::SyncFileItem::Status status, const QString &errorMessage, const QString &subject); void finished(bool success); void started(); @@ -180,7 +180,7 @@ signals: * This usually happen when the server was reset or something. * Set *cancel to true in a slot connected from this signal to abort the sync. */ - void aboutToRemoveAllFiles(SyncFileItem::Direction direction, std::function f); + void aboutToRemoveAllFiles(OCC::SyncFileItem::Direction direction, std::function f); // A new folder was discovered and was not synced because of the confirmation feature void newBigFolder(const QString &folder, bool isExternal); @@ -196,7 +196,7 @@ private slots: void slotRootEtagReceived(const QByteArray &, const QDateTime &time); /** When the discovery phase discovers an item */ - void slotItemDiscovered(const SyncFileItemPtr &item); + void slotItemDiscovered(const OCC::SyncFileItemPtr &item); /** Called when a SyncFileItem gets accepted for a sync. * @@ -204,12 +204,12 @@ private slots: * can also be called via the propagator for items that are * created during propagation. */ - void slotNewItem(const SyncFileItemPtr &item); + void slotNewItem(const OCC::SyncFileItemPtr &item); - void slotItemCompleted(const SyncFileItemPtr &item); + void slotItemCompleted(const OCC::SyncFileItemPtr &item); void slotDiscoveryFinished(); void slotPropagationFinished(bool success); - void slotProgress(const SyncFileItem &item, qint64 curent); + void slotProgress(const OCC::SyncFileItem &item, qint64 curent); void slotCleanPollsJobAborted(const QString &error); /** Records that a file was touched by a job. */ @@ -224,7 +224,50 @@ private slots: void slotInsufficientLocalStorage(); void slotInsufficientRemoteStorage(); + void slotScheduleFilesDelayedSync(); + void slotUnscheduleFilesDelayedSync(); + void slotCleanupScheduledSyncTimers(); + private: + // Some files need a sync run to be executed at a specified time after + // their status is scheduled to change (e.g. lock status will expire in + // 20 minutes.) + // + // Rather than execute a sync run for each file that needs one, we want + // to schedule as few sync runs as possible, trying to have the state of + // these files updated in a timely manner without scheduling runs too + // frequently. We can therefore group files into a bucket. + // + // A bucket contains a group of files requiring a sync run in close + // proximity to each other, with an assigned sync timer interval that can + // be used to schedule a sync run which will update all the files in the + // bucket at the time their state is scheduled to change. + // + // In the pair, first is the actual time at which the bucket is going to + // have its sync scheduled. Second is the vector of all the (paths of) + // files that fall into this bucket. + // + // See SyncEngine::groupNeededScheduledSyncRuns and + // SyncEngine::slotScheduleFilesDelayedSync for usage. + struct ScheduledSyncBucket { + qint64 scheduledSyncTimerSecs; + QVector files; + }; + + // Sometimes we schedule a timer for, say, 10 files. But we receive updated + // data from an earlier sync run and we no longer need a scheduled sync. + // + // E.g. we had a scheduled sync timer going for a file with a lock state + // scheduled to expire, but someone already unlocked the file on the web UI + // + // By keeping a counter of the files depending on this timer we can + // perform "garbage collection", by killing the timer if there are no + // longer any files depending on the scheduled sync run. + class ScheduledSyncTimer : public QTimer { + public: + QSet files; + }; + bool checkErrorBlacklisting(SyncFileItem &item); // Cleans up unnecessary downloadinfo entries in the journal as well @@ -240,9 +283,30 @@ private: // Removes stale and adds missing conflict records after sync void conflictRecordMaintenance(); + // Removes stale and adds missing conflict records after sync + void caseClashConflictRecordMaintenance(); + // cleanup and emit the finished signal void finalize(bool success); + // Aggregate scheduled sync runs into interval buckets. Can be used to + // schedule a sync run per bucket instead of per file, reducing load. + // + // Bucket classification is done by simply dividing the seconds until + // scheduled sync time by the interval (note -- integer division!) + QHash groupNeededScheduledSyncRuns(const qint64 interval) const; + + // Checks if there is already a scheduled sync run timer active near the + // time provided as the parameter. + // + // If this timer will expire within the interval provided, the return is + // true. + // + // If this expiration occurs before the scheduled sync run provided as the + // parameter, it is rescheduled to expire at the time of the parameter. + QSharedPointer nearbyScheduledSyncTimer(const qint64 scheduledSyncTimerSecs, + const qint64 intervalSecs) const; + static bool s_anySyncRunning; //true when one sync is running somewhere (for debugging) // Must only be acessed during update and reconcile @@ -274,7 +338,7 @@ private: * to recover */ void checkForPermission(SyncFileItemVector &syncItems); - RemotePermissions getPermissions(const QString &file) const; + [[nodiscard]] RemotePermissions getPermissions(const QString &file) const; /** * Instead of downloading files from the server, upload the files to the server @@ -315,6 +379,16 @@ private: QStringList _leadingAndTrailingSpacesFilesAllowed; + // Hash of files we have scheduled for later sync runs, along with a + // pointer to the timer which will trigger the sync run for it. + // + // NOTE: these sync timers are not unique and will likely be shared + // between several files + QHash> _filesScheduledForLaterSync; + + // A vector of all the (unique) scheduled sync timers + QVector> _scheduledSyncTimers; + SingleItemDiscoveryOptions _singleItemDiscoveryOptions; }; } diff --git a/src/libsync/syncfileitem.cpp b/src/libsync/syncfileitem.cpp index c9497f1ad..1727a8938 100644 --- a/src/libsync/syncfileitem.cpp +++ b/src/libsync/syncfileitem.cpp @@ -43,6 +43,9 @@ SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QStri rec._fileId = _fileId; rec._fileSize = _size; rec._remotePerm = _remotePerm; + rec._isShared = _isShared; + rec._sharedByMe = _sharedByMe; + rec._lastShareStateFetchedTimestamp = _lastShareStateFetchedTimestamp; rec._serverHasIgnoredFiles = _serverHasIgnoredFiles; rec._checksumHeader = _checksumHeader; rec._e2eMangledName = _encryptedFileName.toUtf8(); @@ -91,6 +94,9 @@ SyncFileItemPtr SyncFileItem::fromSyncJournalFileRecord(const SyncJournalFileRec item->_lockEditorApp = rec._lockstate._lockEditorApp; item->_lockTime = rec._lockstate._lockTime; item->_lockTimeout = rec._lockstate._lockTimeout; + item->_sharedByMe = rec._sharedByMe; + item->_isShared = rec._isShared; + item->_lastShareStateFetchedTimestamp = rec._lastShareStateFetchedTimestamp; return item; } @@ -114,6 +120,9 @@ SyncFileItemPtr SyncFileItem::fromProperties(const QString &filePath, const QMap item->_remotePerm.setPermission(RemotePermissions::IsShared); } + item->_isShared = item->_remotePerm.hasPermission(RemotePermissions::IsShared); + item->_lastShareStateFetchedTimestamp = QDateTime::currentMSecsSinceEpoch(); + item->_isEncrypted = properties.value(QStringLiteral("is-encrypted")) == QStringLiteral("1"); item->_locked = properties.value(QStringLiteral("lock")) == QStringLiteral("1") ? SyncFileItem::LockStatus::LockedItem : SyncFileItem::LockStatus::UnlockedItem; diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index 7750daa43..e517ee362 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -46,6 +46,7 @@ public: }; Q_ENUM(Direction) + // Note: the order of these statuses is used for ordering in the SortedActivityListModel enum Status { // stored in 4 bits NoStatus, @@ -53,8 +54,6 @@ public: NormalError, ///< Error attached to a particular file SoftError, ///< More like an information - Success, ///< The file was properly synced - /** Marks a conflict, old or new. * * With instruction:IGNORE: detected an old unresolved old conflict @@ -95,7 +94,9 @@ public: * * A SoftError caused by blacklisting. */ - BlacklistedError + BlacklistedError, + + Success, ///< The file was properly synced }; Q_ENUM(Status) @@ -114,7 +115,7 @@ public: Q_ENUM(LockOwnerType) - SyncJournalFileRecord toSyncJournalFileRecordWithInode(const QString &localFileName) const; + [[nodiscard]] SyncJournalFileRecord toSyncJournalFileRecordWithInode(const QString &localFileName) const; /** Creates a basic SyncFileItem from a DB record * @@ -125,7 +126,7 @@ public: /** Creates a basic SyncFileItem from remote properties */ - static SyncFileItemPtr fromProperties(const QString &filePath, const QMap &properties); + [[nodiscard]] static SyncFileItemPtr fromProperties(const QString &filePath, const QMap &properties); SyncFileItem() @@ -180,7 +181,7 @@ public: return data1[prefixL] < data2[prefixL]; } - QString destination() const + [[nodiscard]] QString destination() const { if (!_renameTarget.isEmpty()) { return _renameTarget; @@ -188,12 +189,12 @@ public: return _file; } - bool isEmpty() const + [[nodiscard]] bool isEmpty() const { return _file.isEmpty(); } - bool isDirectory() const + [[nodiscard]] bool isDirectory() const { return _type == ItemTypeDirectory; } @@ -201,7 +202,7 @@ public: /** * True if the item had any kind of error. */ - bool hasErrorStatus() const + [[nodiscard]] bool hasErrorStatus() const { return _status == SyncFileItem::SoftError || _status == SyncFileItem::NormalError @@ -212,7 +213,7 @@ public: /** * Whether this item should appear on the issues tab. */ - bool showInIssuesTab() const + [[nodiscard]] bool showInIssuesTab() const { return hasErrorStatus() || _status == SyncFileItem::Conflict; } @@ -220,7 +221,7 @@ public: /** * Whether this item should appear on the protocol tab. */ - bool showInProtocolTab() const + [[nodiscard]] bool showInProtocolTab() const { return (!showInIssuesTab() || _status == SyncFileItem::Restoration) // Don't show conflicts that were resolved as "not a conflict after all" @@ -311,6 +312,11 @@ public: QString _lockEditorApp; qint64 _lockTime = 0; qint64 _lockTimeout = 0; + + bool _isShared = false; + time_t _lastShareStateFetchedTimestamp = 0; + + bool _sharedByMe = false; }; inline bool operator<(const SyncFileItemPtr &item1, const SyncFileItemPtr &item2) diff --git a/src/libsync/syncfilestatustracker.h b/src/libsync/syncfilestatustracker.h index bd5d73e04..83f2e459a 100644 --- a/src/libsync/syncfilestatustracker.h +++ b/src/libsync/syncfilestatustracker.h @@ -44,11 +44,11 @@ public slots: void slotAddSilentlyExcluded(const QString &folderPath); signals: - void fileStatusChanged(const QString &systemFileName, SyncFileStatus fileStatus); + void fileStatusChanged(const QString &systemFileName, OCC::SyncFileStatus fileStatus); private slots: - void slotAboutToPropagate(SyncFileItemVector &items); - void slotItemCompleted(const SyncFileItemPtr &item); + void slotAboutToPropagate(OCC::SyncFileItemVector &items); + void slotItemCompleted(const OCC::SyncFileItemPtr &item); void slotSyncFinished(); void slotSyncEngineRunningChanged(); diff --git a/src/libsync/syncoptions.h b/src/libsync/syncoptions.h index f109ec7fc..258f5b771 100644 --- a/src/libsync/syncoptions.h +++ b/src/libsync/syncoptions.h @@ -92,7 +92,7 @@ public: /** A regular expression to match file names * If no pattern is provided the default is an invalid regular expression. */ - QRegularExpression fileRegex() const; + [[nodiscard]] QRegularExpression fileRegex() const; /** * A pattern like *.txt, matching only file names diff --git a/src/libsync/syncresult.h b/src/libsync/syncresult.h index 8a8f299fe..16f777b10 100644 --- a/src/libsync/syncresult.h +++ b/src/libsync/syncresult.h @@ -50,40 +50,40 @@ public: void reset(); void appendErrorString(const QString &); - QString errorString() const; - QStringList errorStrings() const; + [[nodiscard]] QString errorString() const; + [[nodiscard]] QStringList errorStrings() const; void clearErrors(); void setStatus(Status); - Status status() const; - QString statusString() const; - QDateTime syncTime() const; + [[nodiscard]] Status status() const; + [[nodiscard]] QString statusString() const; + [[nodiscard]] QDateTime syncTime() const; void setFolder(const QString &folder); - QString folder() const; + [[nodiscard]] QString folder() const; - bool foundFilesNotSynced() const { return _foundFilesNotSynced; } - bool folderStructureWasChanged() const { return _folderStructureWasChanged; } + [[nodiscard]] bool foundFilesNotSynced() const { return _foundFilesNotSynced; } + [[nodiscard]] bool folderStructureWasChanged() const { return _folderStructureWasChanged; } - int numNewItems() const { return _numNewItems; } - int numRemovedItems() const { return _numRemovedItems; } - int numUpdatedItems() const { return _numUpdatedItems; } - int numRenamedItems() const { return _numRenamedItems; } - int numNewConflictItems() const { return _numNewConflictItems; } - int numOldConflictItems() const { return _numOldConflictItems; } + [[nodiscard]] int numNewItems() const { return _numNewItems; } + [[nodiscard]] int numRemovedItems() const { return _numRemovedItems; } + [[nodiscard]] int numUpdatedItems() const { return _numUpdatedItems; } + [[nodiscard]] int numRenamedItems() const { return _numRenamedItems; } + [[nodiscard]] int numNewConflictItems() const { return _numNewConflictItems; } + [[nodiscard]] int numOldConflictItems() const { return _numOldConflictItems; } void setNumOldConflictItems(int n) { _numOldConflictItems = n; } - int numErrorItems() const { return _numErrorItems; } - bool hasUnresolvedConflicts() const { return _numNewConflictItems + _numOldConflictItems > 0; } - - int numLockedItems() const { return _numLockedItems; } - bool hasLockedFiles() const { return _numLockedItems > 0; } - - const SyncFileItemPtr &firstItemNew() const { return _firstItemNew; } - const SyncFileItemPtr &firstItemDeleted() const { return _firstItemDeleted; } - const SyncFileItemPtr &firstItemUpdated() const { return _firstItemUpdated; } - const SyncFileItemPtr &firstItemRenamed() const { return _firstItemRenamed; } - const SyncFileItemPtr &firstNewConflictItem() const { return _firstNewConflictItem; } - const SyncFileItemPtr &firstItemError() const { return _firstItemError; } - const SyncFileItemPtr &firstItemLocked() const { return _firstItemLocked; } + [[nodiscard]] int numErrorItems() const { return _numErrorItems; } + [[nodiscard]] bool hasUnresolvedConflicts() const { return _numNewConflictItems + _numOldConflictItems > 0; } + + [[nodiscard]] int numLockedItems() const { return _numLockedItems; } + [[nodiscard]] bool hasLockedFiles() const { return _numLockedItems > 0; } + + [[nodiscard]] const SyncFileItemPtr &firstItemNew() const { return _firstItemNew; } + [[nodiscard]] const SyncFileItemPtr &firstItemDeleted() const { return _firstItemDeleted; } + [[nodiscard]] const SyncFileItemPtr &firstItemUpdated() const { return _firstItemUpdated; } + [[nodiscard]] const SyncFileItemPtr &firstItemRenamed() const { return _firstItemRenamed; } + [[nodiscard]] const SyncFileItemPtr &firstNewConflictItem() const { return _firstNewConflictItem; } + [[nodiscard]] const SyncFileItemPtr &firstItemError() const { return _firstItemError; } + [[nodiscard]] const SyncFileItemPtr &firstItemLocked() const { return _firstItemLocked; } void processCompletedItem(const SyncFileItemPtr &item); diff --git a/src/libsync/theme.cpp b/src/libsync/theme.cpp index 897e7d070..caee23bc3 100644 --- a/src/libsync/theme.cpp +++ b/src/libsync/theme.cpp @@ -344,7 +344,39 @@ Theme::Theme() : QObject(nullptr) { #if defined(Q_OS_WIN) - reserveDarkPalette = QPalette(QColor(49,49,49,255), QColor(35,35,35,255)); // Windows 11 button and window dark colours + // Windows does not provide a dark theme for Win32 apps so let's come up with a palette + // Credit to https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle + + reserveDarkPalette.setColor(QPalette::Window, QColor(53, 53, 53)); + reserveDarkPalette.setColor(QPalette::WindowText, Qt::white); + reserveDarkPalette.setColor(QPalette::Disabled, QPalette::WindowText, + QColor(127, 127, 127)); + reserveDarkPalette.setColor(QPalette::Base, QColor(42, 42, 42)); + reserveDarkPalette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); + reserveDarkPalette.setColor(QPalette::ToolTipBase, Qt::white); + reserveDarkPalette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); + reserveDarkPalette.setColor(QPalette::Text, Qt::white); + reserveDarkPalette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + reserveDarkPalette.setColor(QPalette::Dark, QColor(35, 35, 35)); + reserveDarkPalette.setColor(QPalette::Shadow, QColor(20, 20, 20)); + reserveDarkPalette.setColor(QPalette::Button, QColor(53, 53, 53)); + reserveDarkPalette.setColor(QPalette::ButtonText, Qt::white); + reserveDarkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, + QColor(127, 127, 127)); + reserveDarkPalette.setColor(QPalette::BrightText, Qt::red); + reserveDarkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); + reserveDarkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + reserveDarkPalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); + reserveDarkPalette.setColor(QPalette::HighlightedText, Qt::white); + reserveDarkPalette.setColor(QPalette::Disabled, QPalette::HighlightedText, + QColor(127, 127, 127)); +#endif + +#ifdef APPLICATION_SERVER_URL_ENFORCE + _forceOverrideServerUrl = true; +#endif +#ifdef APPLICATION_SERVER_URL + _overrideServerUrl = QString::fromLatin1(APPLICATION_SERVER_URL); #endif } @@ -386,20 +418,17 @@ QString Theme::conflictHelpUrl() const QString Theme::overrideServerUrl() const { -#ifdef APPLICATION_SERVER_URL - return QString::fromLatin1(APPLICATION_SERVER_URL); -#else - return QString(); -#endif + return _overrideServerUrl; } bool Theme::forceOverrideServerUrl() const { -#ifdef APPLICATION_SERVER_URL_ENFORCE - return true; -#else - return false; -#endif + return _forceOverrideServerUrl; +} + +bool Theme::startLoginFlowAutomatically() const +{ + return _startLoginFlowAutomatically; } bool Theme::enableStaplingOCSP() const @@ -813,7 +842,8 @@ void Theme::replaceLinkColorStringBackgroundAware(QString &linkString) void Theme::replaceLinkColorString(QString &linkString, const QColor &newColor) { - linkString.replace(QRegularExpression("( _iconCache; #endif diff --git a/src/libsync/userstatusconnector.h b/src/libsync/userstatusconnector.h index 5d6d062ff..1af208ea0 100644 --- a/src/libsync/userstatusconnector.h +++ b/src/libsync/userstatusconnector.h @@ -76,7 +76,7 @@ public: Q_REQUIRED_RESULT OnlineStatus state() const; Q_REQUIRED_RESULT Optional clearAt() const; - QString clearAtDisplayString() const; + [[nodiscard]] QString clearAtDisplayString() const; void setId(const QString &id); void setMessage(const QString &message); @@ -125,15 +125,15 @@ public: virtual void clearMessage() = 0; - virtual UserStatus userStatus() const = 0; + [[nodiscard]] virtual UserStatus userStatus() const = 0; signals: - void userStatusFetched(const UserStatus &userStatus); - void predefinedStatusesFetched(const QVector &statuses); + void userStatusFetched(const OCC::UserStatus &userStatus); + void predefinedStatusesFetched(const QVector &statuses); void userStatusSet(); void serverUserStatusChanged(); void messageCleared(); - void error(Error error); + void error(OCC::UserStatusConnector::Error error); }; } diff --git a/src/libsync/vfs/cfapi/cfapiwrapper.cpp b/src/libsync/vfs/cfapi/cfapiwrapper.cpp index 4975ca881..e98d02792 100644 --- a/src/libsync/vfs/cfapi/cfapiwrapper.cpp +++ b/src/libsync/vfs/cfapi/cfapiwrapper.cpp @@ -442,7 +442,8 @@ bool createSyncRootRegistryKeys(const QString &providerName, const QString &fold { providerSyncRootIdRegistryKey, QStringLiteral("Flags"), REG_DWORD, flags }, { providerSyncRootIdRegistryKey, QStringLiteral("DisplayNameResource"), REG_EXPAND_SZ, displayName }, { providerSyncRootIdRegistryKey, QStringLiteral("IconResource"), REG_EXPAND_SZ, QString(QDir::toNativeSeparators(qApp->applicationFilePath()) + QStringLiteral(",0")) }, - { providerSyncRootIdUserSyncRootsRegistryKey, windowsSid, REG_SZ, syncRootPath}, + { providerSyncRootIdUserSyncRootsRegistryKey, windowsSid, REG_SZ, syncRootPath}, + { providerSyncRootIdRegistryKey, QStringLiteral("CustomStateHandler"), REG_SZ, CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG}, { providerSyncRootIdRegistryKey, QStringLiteral("ThumbnailProvider"), REG_SZ, CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG}, { providerSyncRootIdRegistryKey, QStringLiteral("NamespaceCLSID"), REG_SZ, QString(navigationPaneClsid)} }; @@ -550,6 +551,7 @@ void unregisterSyncRootShellExtensions(const QString &providerName, const QStrin const QString providerSyncRootIdRegistryKey = syncRootManagerRegKey + QStringLiteral("\\") + syncRootId; OCC::Utility::registryDeleteKeyValue(HKEY_LOCAL_MACHINE, providerSyncRootIdRegistryKey, QStringLiteral("ThumbnailProvider")); + OCC::Utility::registryDeleteKeyValue(HKEY_LOCAL_MACHINE, providerSyncRootIdRegistryKey, QStringLiteral("CustomStateHandler")); qCInfo(lcCfApiWrapper) << "Successfully unregistered SyncRoot Shell Extensions!"; } diff --git a/src/libsync/vfs/cfapi/hydrationjob.cpp b/src/libsync/vfs/cfapi/hydrationjob.cpp index 0de8967dd..e09a5343c 100644 --- a/src/libsync/vfs/cfapi/hydrationjob.cpp +++ b/src/libsync/vfs/cfapi/hydrationjob.cpp @@ -199,24 +199,27 @@ void OCC::HydrationJob::slotCheckFolderEncryptedMetadata(const QJsonDocument &js // TODO: the following code is borrowed from PropagateDownloadEncrypted (see HydrationJob::onNewConnection() for explanation of next steps) qCDebug(lcHydration) << "Metadata Received reading" << e2eMangledName(); const QString filename = e2eMangledName(); - auto meta = new FolderMetadata(_account, json.toJson(QJsonDocument::Compact)); - const QVector files = meta->files(); + const FolderMetadata metadata(_account, json.toJson(QJsonDocument::Compact)); - EncryptedFile encryptedInfo = {}; + if (metadata.isMetadataSetup()) { + const QVector files = metadata.files(); - const QString encryptedFileExactName = e2eMangledName().section(QLatin1Char('/'), -1); - for (const EncryptedFile &file : files) { - if (encryptedFileExactName == file.encryptedFilename) { - EncryptedFile encryptedInfo = file; - encryptedInfo = file; + EncryptedFile encryptedInfo = {}; - qCDebug(lcHydration) << "Found matching encrypted metadata for file, starting download" << _requestId << _folderPath; - _transferDataSocket = _transferDataServer->nextPendingConnection(); - _job = new GETEncryptedFileJob(_account, _remotePath + e2eMangledName(), _transferDataSocket, {}, {}, 0, encryptedInfo, this); + const QString encryptedFileExactName = e2eMangledName().section(QLatin1Char('/'), -1); + for (const EncryptedFile &file : files) { + if (encryptedFileExactName == file.encryptedFilename) { + EncryptedFile encryptedInfo = file; + encryptedInfo = file; - connect(qobject_cast(_job), &GETEncryptedFileJob::finishedSignal, this, &HydrationJob::onGetFinished); - _job->start(); - return; + qCDebug(lcHydration) << "Found matching encrypted metadata for file, starting download" << _requestId << _folderPath; + _transferDataSocket = _transferDataServer->nextPendingConnection(); + _job = new GETEncryptedFileJob(_account, _remotePath + e2eMangledName(), _transferDataSocket, {}, {}, 0, encryptedInfo, this); + + connect(qobject_cast(_job), &GETEncryptedFileJob::finishedSignal, this, &HydrationJob::onGetFinished); + _job->start(); + return; + } } } @@ -289,7 +292,10 @@ void OCC::HydrationJob::finalize(OCC::VfsCfApi *vfs) { // Mark the file as hydrated in the sync journal SyncJournalFileRecord record; - _journal->getFileRecord(_folderPath, &record); + if (!_journal->getFileRecord(_folderPath, &record)) { + qCWarning(lcHydration) << "could not get file from local DB" << _folderPath; + return; + } Q_ASSERT(record.isValid()); if (!record.isValid()) { qCWarning(lcHydration) << "Couldn't find record to update after hydration" << _requestId << _folderPath; @@ -320,7 +326,10 @@ void OCC::HydrationJob::finalize(OCC::VfsCfApi *vfs) // store the actual size of a file that has been decrypted as we will need its actual size when dehydrating it if requested record._fileSize = FileSystem::getSize(localPath() + folderPath()); - _journal->setFileRecord(record); + const auto result = _journal->setFileRecord(record); + if (!result) { + qCWarning(lcHydration) << "Error when setting the file record to the database" << record._path << result.error(); + } } void OCC::HydrationJob::onGetFinished() diff --git a/src/libsync/vfs/cfapi/shellext/CMakeLists.txt b/src/libsync/vfs/cfapi/shellext/CMakeLists.txt index 966ae60e0..067289ee4 100644 --- a/src/libsync/vfs/cfapi/shellext/CMakeLists.txt +++ b/src/libsync/vfs/cfapi/shellext/CMakeLists.txt @@ -1,18 +1,197 @@ +include(GenerateIconsUtils) + +# generate custom states icons +set(theme_dir ${CMAKE_SOURCE_DIR}/theme) +set(custom_state_icons_path "${theme_dir}/cfapishellext_custom_states") +set(CUSTOM_STATE_ICON_LOCKED_PATH "${custom_state_icons_path}/0-locked.svg") +set(CUSTOM_STATE_ICON_SHARED_PATH "${custom_state_icons_path}/1-shared.svg") + +foreach(size IN ITEMS 24;32;40;48;64;128;256;512;1024) + get_filename_component(output_icon_name_custom_state_locked ${CUSTOM_STATE_ICON_LOCKED_PATH} NAME_WLE) + generate_sized_png_from_svg(${CUSTOM_STATE_ICON_LOCKED_PATH} ${size} OUTPUT_ICON_NAME ${output_icon_name_custom_state_locked} OUTPUT_ICON_PATH "${custom_state_icons_path}/") +endforeach() + +foreach(size IN ITEMS 24;32;40;48;64;128;256;512;1024) + get_filename_component(output_icon_name_custom_state_shared ${CUSTOM_STATE_ICON_SHARED_PATH} NAME_WLE) + generate_sized_png_from_svg(${CUSTOM_STATE_ICON_SHARED_PATH} ${size} OUTPUT_ICON_NAME ${output_icon_name_custom_state_shared} OUTPUT_ICON_PATH "${custom_state_icons_path}/") +endforeach() + +# offset is used for referencing icon within the binary's resources (indexing start with 0, while IDI_ICON{i} 'i' starts with 1) +if(NOT DEFINED CUSTOM_STATE_ICON_INDEX_OFFSET) + set(CUSTOM_STATE_ICON_INDEX_OFFSET 1) +endif() + +# indeces used for referencing icon within the binary's resources and .rc file's IDI_ICON{i} entries 'i' +if(NOT DEFINED CUSTOM_STATE_ICON_LOCKED_INDEX) + set(CUSTOM_STATE_ICON_LOCKED_INDEX 1) +endif() +if(NOT DEFINED CUSTOM_STATE_ICON_SHARED_INDEX) + set(CUSTOM_STATE_ICON_SHARED_INDEX 2) +endif() + +file(GLOB_RECURSE CUSTOM_STATE_ICONS_LOCKED "${custom_state_icons_path}/*-locked.png*") +get_filename_component(CUSTOM_STATE_ICON_LOCKED_NAME ${CUSTOM_STATE_ICON_LOCKED_PATH} NAME_WLE) +ecm_add_app_icon(CUSTOM_STATE_ICON_LOCKED_OUT ICONS "${CUSTOM_STATE_ICONS_LOCKED}" OUTFILE_BASENAME "${CUSTOM_STATE_ICON_LOCKED_NAME}" DO_NOT_GENERATE_RC_FILE TRUE) + +file(GLOB_RECURSE CUSTOM_STATE_ICONS_SHARED "${custom_state_icons_path}/*-shared.png*") +get_filename_component(CUSTOM_STATE_ICON_SHARED_NAME ${CUSTOM_STATE_ICON_SHARED_PATH} NAME_WLE) +ecm_add_app_icon(CUSTOM_STATE_ICON_SHARED_OUT ICONS "${CUSTOM_STATE_ICONS_SHARED}" OUTFILE_BASENAME "${CUSTOM_STATE_ICON_SHARED_NAME}" DO_NOT_GENERATE_RC_FILE TRUE) + +file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in") + +file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in" "IDI_ICON${CUSTOM_STATE_ICON_LOCKED_INDEX} ICON DISCARDABLE \"${CMAKE_CURRENT_BINARY_DIR}/${CUSTOM_STATE_ICON_LOCKED_NAME}.ico\"\n") +file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in" "IDI_ICON${CUSTOM_STATE_ICON_SHARED_INDEX} ICON DISCARDABLE \"${CMAKE_CURRENT_BINARY_DIR}/${CUSTOM_STATE_ICON_SHARED_NAME}.ico\"\n") + +add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc" + COMMAND ${CMAKE_COMMAND} + ARGS -E copy "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc.in" "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CUSTOM_STATE_ICON_LOCKED_NAME}.ico" "${CMAKE_CURRENT_BINARY_DIR}/${CUSTOM_STATE_ICON_SHARED_NAME}.ico" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" +) +message("CUSTOM_STATE_ICON_LOCKED_OUT: ${CUSTOM_STATE_ICON_LOCKED_OUT}") +message("CUSTOM_STATE_ICON_SHARED_OUT: ${CUSTOM_STATE_ICON_SHARED_OUT}") +# + +# Windows SDK command-line tools require native paths +file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" MidleFileFolder) +set(GeneratedFilesPath "${CMAKE_CURRENT_BINARY_DIR}\\Generated") +set(MidlOutputPathHeader "${GeneratedFilesPath}\\CustomStateProvider.g.h") +set(MidlOutputPathTlb "${GeneratedFilesPath}\\CustomStateProvider.tlb") +set(MidlOutputPathWinmd "${GeneratedFilesPath}\\CustomStateProvider.winmd") + +add_custom_target(CustomStateProviderImpl + DEPENDS ${MidlOutputPathHeader} +) + +if(NOT DEFINED ENV{WindowsSdkDir}) + message("Getting WindowsSdkDir from Registry") + get_filename_component(WindowsSdkDir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" ABSOLUTE) +else() + set(WindowsSdkDir $ENV{WindowsSdkDir}) + message("Setting WindowsSdkDir from ENV{WindowsSdkDir") +endif() + +# we need cmake path to work with subfolders +file(TO_CMAKE_PATH "${WindowsSdkDir}" WindowsSdkDir) + +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + FOREACH(child ${children}) + IF(IS_DIRECTORY ${curdir}/${child}) + LIST(APPEND dirlist ${child}) + ENDIF() + ENDFOREACH() + SET(${result} ${dirlist}) +ENDMACRO() + +SUBDIRLIST(WindowsSdkList "${WindowsSdkDir}/bin") + +# pick only dirs that start with 10.0 +list(FILTER WindowsSdkList INCLUDE REGEX "10.0.") +# sort the list of subdirs and choose the latest +list(SORT WindowsSdkList ORDER ASCENDING) +list(GET WindowsSdkList -1 WindowsSdkLatest) +message("WindowsSdkLatest has been set to: ${WindowsSdkLatest}") + +if(NOT WindowsSdkLatest) + message( FATAL_ERROR "Windows SDK not found") +endif() + +SUBDIRLIST(listFoundationContracts "${WindowsSdkDir}/References/${WindowsSdkLatest}/Windows.Foundation.FoundationContract") +list(FILTER listFoundationContracts INCLUDE REGEX "[0-9]+\.") +list(SORT listFoundationContracts ORDER ASCENDING) +list(GET listFoundationContracts -1 WindowsFoundationContractVersion) +message("WindowsFoundationContractVersion has been set to: ${WindowsFoundationContractVersion}") + +if(NOT WindowsFoundationContractVersion) + message( FATAL_ERROR "Windows Foundation Contract is not found in ${WindowsSdkLatest} SDK.") +endif() + +SUBDIRLIST(listCloudFilesContracts "${WindowsSdkDir}/References/${WindowsSdkLatest}/Windows.Storage.Provider.CloudFilesContract") +list(FILTER listCloudFilesContracts INCLUDE REGEX "[0-9]+\.") +list(SORT listCloudFilesContracts ORDER ASCENDING) +list(GET listCloudFilesContracts -1 WindowsStorageProviderCloudFilesContractVersion) +message("WindowsStorageProviderCloudFilesContractVersion has been set to: ${WindowsStorageProviderCloudFilesContractVersion}") + +if(NOT WindowsStorageProviderCloudFilesContractVersion) + message( FATAL_ERROR "Windows Storage Provider Cloud Files Contract is not found in ${WindowsSdkLatest} SDK.") +endif() + +# we no longer need to work with sub folders, so convert the WindowsSdkDir to native path +file(TO_NATIVE_PATH ${WindowsSdkDir} WindowsSdkDir) +message("WindowsSdkDir has been set to: ${WindowsSdkDir}") +message("WindowsSdkList has been set to: ${WindowsSdkList}") +message("WindowsSdkLatest has been set to: ${WindowsSdkLatest}") + +set(TargetPlatform "x64") +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(TargetPlatform "x64") +elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(TargetPlatform "x86") +endif() + +set(WindowsSDKReferencesPath "${WindowsSdkDir}\\References\\${WindowsSdkLatest}") +set(WindowsSDKBinPathForTools "${WindowsSdkDir}\\bin\\${WindowsSdkLatest}\\${TargetPlatform}") +set(WindowsSDKMetadataDirectory "${WindowsSdkDir}\\UnionMetadata\\${WindowsSdkLatest}") + +IF(NOT EXISTS "${WindowsSDKReferencesPath}" OR NOT IS_DIRECTORY "${WindowsSDKReferencesPath}") + message( FATAL_ERROR "Please install Windows SDK ${WindowsSdkLatest}") +ENDIF() +IF(NOT EXISTS "${WindowsSDKBinPathForTools}" OR NOT IS_DIRECTORY "${WindowsSDKBinPathForTools}") + message( FATAL_ERROR "Please install Windows SDK ${WindowsSdkLatest}") +ENDIF() +IF(NOT EXISTS "${WindowsSDKMetadataDirectory}" OR NOT IS_DIRECTORY "${WindowsSDKMetadataDirectory}") + message( FATAL_ERROR "Please install Windows SDK ${WindowsSdkLatest}") +ENDIF() +set(midlExe "${WindowsSDKBinPathForTools}\\midl.exe") +set(cppWinRtExe "${WindowsSDKBinPathForTools}\\cppwinrt.exe") + +message("cppWinRtExe: ${cppWinRtExe}") +message("midlExe: ${midlExe}") + +# use midl.exe and cppwinrt.exe to generate files for CustomStateProvider (WinRT class) +add_custom_command(OUTPUT ${MidlOutputPathHeader} + COMMAND ${midlExe} /winrt /h nul /tlb ${MidlOutputPathTlb} /winmd ${MidlOutputPathWinmd} /metadata_dir "${WindowsSDKReferencesPath}\\Windows.Foundation.FoundationContract\\${WindowsFoundationContractVersion}" /nomidl /reference "${WindowsSDKReferencesPath}\\Windows.Foundation.FoundationContract\\${WindowsFoundationContractVersion}\\Windows.Foundation.FoundationContract.winmd" /reference "${WindowsSDKReferencesPath}\\Windows.Storage.Provider.CloudFilesContract\\${WindowsStorageProviderCloudFilesContractVersion}\\Windows.Storage.Provider.CloudFilesContract.winmd" /I ${MidleFileFolder} customstateprovider.idl + COMMAND ${cppWinRtExe} -in ${MidlOutputPathWinmd} -comp ${GeneratedFilesPath} -pch pch.h -ref ${WindowsSDKMetadataDirectory} -out ${GeneratedFilesPath} -verbose + COMMENT "Creating generated files from customstateprovider.idl" +) + add_library(CfApiShellExtensions MODULE dllmain.cpp cfapishellintegrationclassfactory.cpp + customstateprovideripc.cpp + ipccommon.cpp thumbnailprovider.cpp thumbnailprovideripc.cpp ${CMAKE_SOURCE_DIR}/src/common/shellextensionutils.cpp + customstateprovider.cpp CfApiShellIntegration.def ) -target_link_libraries(CfApiShellExtensions shlwapi Gdiplus Nextcloud::csync Qt5::Core Qt5::Network) +message("CUSTOM_STATE_ICON_LOCKED_OUT: ${CUSTOM_STATE_ICON_LOCKED_OUT}") +message("CUSTOM_STATE_ICON_SHARED_OUT: ${CUSTOM_STATE_ICON_SHARED_OUT}") + +if (CUSTOM_STATE_ICON_LOCKED_OUT AND CUSTOM_STATE_ICON_SHARED_OUT) + message("Adding ${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc...") + target_sources(CfApiShellExtensions PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc") +else() + message(WARNING "Could not add ${CMAKE_CURRENT_BINARY_DIR}/${CFAPI_SHELL_EXTENSIONS_LIB_NAME}.rc to CfApiShellExtensions. Custom states for Windows Virtual Files won't work.") +endif() + +add_dependencies(CfApiShellExtensions CustomStateProviderImpl) + +target_link_libraries(CfApiShellExtensions shlwapi Gdiplus onecoreuap Nextcloud::csync Qt5::Core Qt5::Network) + +target_include_directories(CfApiShellExtensions PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(CfApiShellExtensions PRIVATE ${GeneratedFilesPath}) target_include_directories(CfApiShellExtensions PRIVATE ${CMAKE_SOURCE_DIR}) +target_compile_features(CfApiShellExtensions PRIVATE cxx_std_17) + set_target_properties(CfApiShellExtensions PROPERTIES LIBRARY_OUTPUT_NAME @@ -29,3 +208,5 @@ install(TARGETS CfApiShellExtensions RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configvfscfapishellext.h.in ${CMAKE_CURRENT_BINARY_DIR}/configvfscfapishellext.h) diff --git a/src/libsync/vfs/cfapi/shellext/CustomStateProvider.idl b/src/libsync/vfs/cfapi/shellext/CustomStateProvider.idl new file mode 100644 index 000000000..174b828a9 --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/CustomStateProvider.idl @@ -0,0 +1,21 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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. + */ + +namespace CfApiShellExtensions +{ + runtimeclass CustomStateProvider : [default] Windows.Storage.Provider.IStorageProviderItemPropertySource + { + CustomStateProvider(); + } +} diff --git a/src/libsync/vfs/cfapi/shellext/configvfscfapishellext.h.in b/src/libsync/vfs/cfapi/shellext/configvfscfapishellext.h.in new file mode 100644 index 000000000..4f0b193a7 --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/configvfscfapishellext.h.in @@ -0,0 +1,20 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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 CONFIG_VFS_CFAPI_SHELLEXT_H +#define CONFIG_VFS_CFAPI_SHELLEXT_H +#cmakedefine CUSTOM_STATE_ICON_LOCKED_INDEX "@CUSTOM_STATE_ICON_LOCKED_INDEX@" +#cmakedefine CUSTOM_STATE_ICON_SHARED_INDEX "@CUSTOM_STATE_ICON_SHARED_INDEX@" +#cmakedefine CUSTOM_STATE_ICON_INDEX_OFFSET "@CUSTOM_STATE_ICON_INDEX_OFFSET@" +#endif diff --git a/src/libsync/vfs/cfapi/shellext/customstateprovider.cpp b/src/libsync/vfs/cfapi/shellext/customstateprovider.cpp new file mode 100644 index 000000000..8f7a2266f --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/customstateprovider.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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 "customstateprovider.h" +#include "customstateprovideripc.h" +#include + +extern long dllObjectsCount; + +namespace winrt::CfApiShellExtensions::implementation { + +CustomStateProvider::CustomStateProvider() +{ + InterlockedIncrement(&dllObjectsCount); +} + +CustomStateProvider::~CustomStateProvider() +{ + InterlockedDecrement(&dllObjectsCount); +} + +winrt::Windows::Foundation::Collections::IIterable +CustomStateProvider::GetItemProperties(hstring const &itemPath) +{ + std::vector properties; + + if (_dllFilePath.isEmpty()) { + return winrt::single_threaded_vector(std::move(properties)); + } + + const auto itemPathString = QString::fromStdString(winrt::to_string(itemPath)); + + const auto isItemPathValid = [&itemPathString]() { + if (itemPathString.isEmpty()) { + return false; + } + + const auto itemPathSplit = itemPathString.split(QStringLiteral("\\"), Qt::SkipEmptyParts); + + if (itemPathSplit.size() > 0) { + const auto itemName = itemPathSplit.last(); + return !itemName.startsWith(QStringLiteral(".sync_")) && !itemName.startsWith(QStringLiteral(".owncloudsync.log")); + } + + return true; + }(); + + if (!isItemPathValid) { + return winrt::single_threaded_vector(std::move(properties)); + } + + VfsShellExtensions::CustomStateProviderIpc customStateProviderIpc; + + const auto states = customStateProviderIpc.fetchCustomStatesForFile(itemPathString); + + for (const auto &state : states) { + const auto stateValue = state.canConvert() ? state.toInt() : -1; + + if (stateValue >= 0) { + auto foundAvalability = _stateIconsAvailibility.constFind(stateValue); + if (foundAvalability == std::cend(_stateIconsAvailibility)) { + const auto hIcon = ExtractIcon(NULL, _dllFilePath.toStdWString().c_str(), stateValue); + _stateIconsAvailibility[stateValue] = hIcon != NULL; + if (hIcon) { + DestroyIcon(hIcon); + } + foundAvalability = _stateIconsAvailibility.constFind(stateValue); + } + + if (!foundAvalability.value()) { + continue; + } + + winrt::Windows::Storage::Provider::StorageProviderItemProperty itemProperty; + itemProperty.Id(stateValue); + itemProperty.Value(QString("Value%1").arg(stateValue).toStdWString()); + itemProperty.IconResource(QString(_dllFilePath + QString(",%1").arg(QString::number(stateValue))).toStdWString()); + properties.push_back(std::move(itemProperty)); + } + } + + return winrt::single_threaded_vector(std::move(properties)); +} +void CustomStateProvider::setDllFilePath(LPCTSTR dllFilePath) +{ + _dllFilePath = QString::fromWCharArray(dllFilePath); + if (!_dllFilePath.endsWith(QStringLiteral(".dll"))) { + _dllFilePath.clear(); + } +} + +QString CustomStateProvider::_dllFilePath; +} diff --git a/src/libsync/vfs/cfapi/shellext/customstateprovider.h b/src/libsync/vfs/cfapi/shellext/customstateprovider.h new file mode 100644 index 000000000..30c2045e9 --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/customstateprovider.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once +#include "Generated/CfApiShellExtensions/customstateprovider.g.h" +#include "config.h" +#include +#include +#include +#include + +namespace winrt::CfApiShellExtensions::implementation { +class __declspec(uuid(CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID)) CustomStateProvider + : public CustomStateProviderT +{ +public: + CustomStateProvider(); + virtual ~CustomStateProvider(); + Windows::Foundation::Collections::IIterable + GetItemProperties(_In_ hstring const &itemPath); + + static void setDllFilePath(LPCTSTR dllFilePath); + +private: + static QString _dllFilePath; + static HINSTANCE _dllhInstance; + QMap _stateIconsAvailibility; +}; +} + +namespace winrt::CfApiShellExtensions::factory_implementation { +struct CustomStateProvider : CustomStateProviderT +{ +}; +} diff --git a/src/libsync/vfs/cfapi/shellext/customstateprovideripc.cpp b/src/libsync/vfs/cfapi/shellext/customstateprovideripc.cpp new file mode 100644 index 000000000..50939faec --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/customstateprovideripc.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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 "customstateprovideripc.h" +#include "common/shellextensionutils.h" +#include "ipccommon.h" +#include +namespace { +// we don't want to block the Explorer for too long (default is 30K, so we'd keep it at 10K, except QLocalSocket::waitForDisconnected()) +constexpr auto socketTimeoutMs = 10000; +} + +namespace VfsShellExtensions { + +CustomStateProviderIpc::~CustomStateProviderIpc() +{ + disconnectSocketFromServer(); +} + +QVariantList CustomStateProviderIpc::fetchCustomStatesForFile(const QString &filePath) +{ + const auto sendMessageAndReadyRead = [this](QVariantMap &message) { + _localSocket.write(VfsShellExtensions::Protocol::createJsonMessage(message)); + return _localSocket.waitForBytesWritten(socketTimeoutMs) && _localSocket.waitForReadyRead(socketTimeoutMs); + }; + + const auto mainServerName = getServerNameForPath(filePath); + + if (mainServerName.isEmpty()) { + return {}; + } + + // #1 Connect to the local server + if (!connectSocketToServer(mainServerName)) { + return {}; + } + + auto messageRequestCustomStatesForFile = QVariantMap { + { + VfsShellExtensions::Protocol::CustomStateProviderRequestKey, + QVariantMap { + { VfsShellExtensions::Protocol::FilePathKey, filePath } + } + } + }; + + // #2 Request custom states for a 'filePath' + if (!sendMessageAndReadyRead(messageRequestCustomStatesForFile)) { + return {}; + } + + // #3 Receive custom states as JSON + const auto message = QJsonDocument::fromJson(_localSocket.readAll()).toVariant().toMap(); + if (!VfsShellExtensions::Protocol::validateProtocolVersion(message) || !message.contains(VfsShellExtensions::Protocol::CustomStateDataKey)) { + return {}; + } + const auto customStates = message.value(VfsShellExtensions::Protocol::CustomStateDataKey).toMap().value(VfsShellExtensions::Protocol::CustomStateStatesKey).toList(); + disconnectSocketFromServer(); + + return customStates; +} + +bool CustomStateProviderIpc::disconnectSocketFromServer() +{ + const auto isConnectedOrConnecting = _localSocket.state() == QLocalSocket::ConnectedState || _localSocket.state() == QLocalSocket::ConnectingState; + if (isConnectedOrConnecting) { + _localSocket.disconnectFromServer(); + const auto isNotConnected = _localSocket.state() == QLocalSocket::UnconnectedState || _localSocket.state() == QLocalSocket::ClosingState; + return isNotConnected || _localSocket.waitForDisconnected(); + } + return true; +} + +QString CustomStateProviderIpc::getServerNameForPath(const QString &filePath) +{ + if (!overrideServerName.isEmpty()) { + return overrideServerName; + } + + return findServerNameForPath(filePath); +} + +bool CustomStateProviderIpc::connectSocketToServer(const QString &serverName) +{ + if (!disconnectSocketFromServer()) { + return false; + } + _localSocket.setServerName(serverName); + _localSocket.connectToServer(); + return _localSocket.state() == QLocalSocket::ConnectedState || _localSocket.waitForConnected(socketTimeoutMs); +} +QString CustomStateProviderIpc::overrideServerName = {}; +} diff --git a/src/libsync/vfs/cfapi/shellext/customstateprovideripc.h b/src/libsync/vfs/cfapi/shellext/customstateprovideripc.h new file mode 100644 index 000000000..bf21d91f7 --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/customstateprovideripc.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include +#include + +namespace VfsShellExtensions { +class CustomStateProviderIpc +{ +public: + CustomStateProviderIpc() = default; + ~CustomStateProviderIpc(); + + QVariantList fetchCustomStatesForFile(const QString &filePath); + +private: + bool connectSocketToServer(const QString &serverName); + bool disconnectSocketFromServer(); + + static QString getServerNameForPath(const QString &filePath); + +public: + // for unit tests (as Registry does not work on a CI VM) + static QString overrideServerName; + +private: + QLocalSocket _localSocket; +}; +} diff --git a/src/libsync/vfs/cfapi/shellext/dllmain.cpp b/src/libsync/vfs/cfapi/shellext/dllmain.cpp index c9edff1dd..07a8dea7f 100644 --- a/src/libsync/vfs/cfapi/shellext/dllmain.cpp +++ b/src/libsync/vfs/cfapi/shellext/dllmain.cpp @@ -13,16 +13,20 @@ */ #include "cfapishellintegrationclassfactory.h" +#include "customstateprovider.h" #include "thumbnailprovider.h" #include long dllReferenceCount = 0; +long dllObjectsCount = 0; HINSTANCE instanceHandle = NULL; +HRESULT CustomStateProvider_CreateInstance(REFIID riid, void **ppv); HRESULT ThumbnailProvider_CreateInstance(REFIID riid, void **ppv); const VfsShellExtensions::ClassObjectInit listClassesSupported[] = { + {&__uuidof(winrt::CfApiShellExtensions::implementation::CustomStateProvider), CustomStateProvider_CreateInstance}, {&__uuidof(VfsShellExtensions::ThumbnailProvider), ThumbnailProvider_CreateInstance} }; @@ -30,6 +34,9 @@ STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, void *) { if (dwReason == DLL_PROCESS_ATTACH) { instanceHandle = hInstance; + wchar_t dllFilePath[_MAX_PATH] = {0}; + ::GetModuleFileName(instanceHandle, dllFilePath, _MAX_PATH); + winrt::CfApiShellExtensions::implementation::CustomStateProvider::setDllFilePath(dllFilePath); DisableThreadLibraryCalls(hInstance); } @@ -38,7 +45,7 @@ STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, void *) STDAPI DllCanUnloadNow() { - return dllReferenceCount == 0 ? S_OK : S_FALSE; + return (dllReferenceCount == 0 && dllObjectsCount == 0) ? S_OK : S_FALSE; } STDAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **ppv) @@ -46,6 +53,16 @@ STDAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **ppv) return VfsShellExtensions::CfApiShellIntegrationClassFactory::CreateInstance(clsid, listClassesSupported, ARRAYSIZE(listClassesSupported), riid, ppv); } +HRESULT CustomStateProvider_CreateInstance(REFIID riid, void **ppv) +{ + try { + const auto customStateProvider = winrt::make_self(); + return customStateProvider->QueryInterface(riid, ppv); + } catch (_com_error exc) { + return exc.Error(); + } +} + HRESULT ThumbnailProvider_CreateInstance(REFIID riid, void **ppv) { auto *thumbnailProvider = new (std::nothrow) VfsShellExtensions::ThumbnailProvider(); diff --git a/src/libsync/vfs/cfapi/shellext/ipccommon.cpp b/src/libsync/vfs/cfapi/shellext/ipccommon.cpp new file mode 100644 index 000000000..a86b06b9d --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/ipccommon.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * 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 "ipccommon.h" +#include "common/shellextensionutils.h" +#include "common/utility.h" +#include + +namespace VfsShellExtensions { +QString findServerNameForPath(const QString &filePath) +{ + // SyncRootManager Registry key contains all registered folders for Cf API. It will give us the correct name of the + // current app based on the folder path + QString serverName; + constexpr auto syncRootManagerRegKey = R"(SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager)"; + + if (OCC::Utility::registryKeyExists(HKEY_LOCAL_MACHINE, syncRootManagerRegKey)) { + OCC::Utility::registryWalkSubKeys( + HKEY_LOCAL_MACHINE, syncRootManagerRegKey, [&](HKEY, const QString &syncRootId) { + const QString syncRootIdUserSyncRootsRegistryKey = + syncRootManagerRegKey + QStringLiteral("\\") + syncRootId + QStringLiteral(R"(\UserSyncRoots\)"); + OCC::Utility::registryWalkValues(HKEY_LOCAL_MACHINE, syncRootIdUserSyncRootsRegistryKey, + [&](const QString &userSyncRootName, bool *done) { + const auto userSyncRootValue = QDir::fromNativeSeparators(OCC::Utility::registryGetKeyValue( + HKEY_LOCAL_MACHINE, syncRootIdUserSyncRootsRegistryKey, userSyncRootName) + .toString()); + if (QDir::fromNativeSeparators(filePath).startsWith(userSyncRootValue)) { + const auto syncRootIdSplit = syncRootId.split(QLatin1Char('!'), Qt::SkipEmptyParts); + if (!syncRootIdSplit.isEmpty()) { + serverName = VfsShellExtensions::serverNameForApplicationName(syncRootIdSplit.first()); + *done = true; + } + } + }); + }); + } + return serverName; +} +} diff --git a/src/libsync/vfs/cfapi/shellext/ipccommon.h b/src/libsync/vfs/cfapi/shellext/ipccommon.h new file mode 100644 index 000000000..9b78787e3 --- /dev/null +++ b/src/libsync/vfs/cfapi/shellext/ipccommon.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) by Oleksandr Zolotov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include + +namespace VfsShellExtensions { +QString findServerNameForPath(const QString &filePath); +} diff --git a/src/libsync/vfs/cfapi/shellext/thumbnailprovider.cpp b/src/libsync/vfs/cfapi/shellext/thumbnailprovider.cpp index 18c0ba905..f3eb9de24 100644 --- a/src/libsync/vfs/cfapi/shellext/thumbnailprovider.cpp +++ b/src/libsync/vfs/cfapi/shellext/thumbnailprovider.cpp @@ -48,6 +48,8 @@ #include #include +extern long dllObjectsCount; + namespace VfsShellExtensions { std::pair hBitmapAndAlphaTypeFromData(const QByteArray &thumbnailData) @@ -93,8 +95,13 @@ std::pair hBitmapAndAlphaTypeFromData(const QByteArray & ThumbnailProvider::ThumbnailProvider() : _referenceCount(1) { + InterlockedIncrement(&dllObjectsCount); } +ThumbnailProvider::~ThumbnailProvider() +{ + InterlockedDecrement(&dllObjectsCount); +} IFACEMETHODIMP ThumbnailProvider::QueryInterface(REFIID riid, void **ppv) { static const QITAB qit[] = { diff --git a/src/libsync/vfs/cfapi/shellext/thumbnailprovider.h b/src/libsync/vfs/cfapi/shellext/thumbnailprovider.h index 66256c3a0..3e5e7f85f 100644 --- a/src/libsync/vfs/cfapi/shellext/thumbnailprovider.h +++ b/src/libsync/vfs/cfapi/shellext/thumbnailprovider.h @@ -30,7 +30,7 @@ class __declspec(uuid(CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID)) ThumbnailProvi public: ThumbnailProvider(); - virtual ~ThumbnailProvider() = default; + virtual ~ThumbnailProvider(); IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv); diff --git a/src/libsync/vfs/cfapi/shellext/thumbnailprovideripc.cpp b/src/libsync/vfs/cfapi/shellext/thumbnailprovideripc.cpp index 8a6d057b5..2ee66d81c 100644 --- a/src/libsync/vfs/cfapi/shellext/thumbnailprovideripc.cpp +++ b/src/libsync/vfs/cfapi/shellext/thumbnailprovideripc.cpp @@ -14,14 +14,11 @@ #include "thumbnailprovideripc.h" #include "common/shellextensionutils.h" -#include "common/utility.h" +#include "ipccommon.h" #include #include #include #include -#include -#include -#include namespace { // we don't want to block the Explorer for too long (default is 30K, so we'd keep it at 10K, except QLocalSocket::waitForDisconnected()) constexpr auto socketTimeoutMs = 10000; @@ -61,7 +58,7 @@ QByteArray ThumbnailProviderIpc::fetchThumbnailForFile(const QString &filePath, { VfsShellExtensions::Protocol::ThumbnailProviderRequestKey, QVariantMap { - {VfsShellExtensions::Protocol::ThumbnailProviderRequestFilePathKey, filePath}, + {VfsShellExtensions::Protocol::FilePathKey, filePath}, {VfsShellExtensions::Protocol::ThumbnailProviderRequestFileSizeKey, QVariantMap{{QStringLiteral("width"), size.width()}, {QStringLiteral("height"), size.height()}}} } } @@ -99,26 +96,8 @@ QString ThumbnailProviderIpc::getServerNameForPath(const QString &filePath) if (!overrideServerName.isEmpty()) { return overrideServerName; } - // SyncRootManager Registry key contains all registered folders for Cf API. It will give us the correct name of the current app based on the folder path - QString serverName; - constexpr auto syncRootManagerRegKey = R"(SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager)"; - if (OCC::Utility::registryKeyExists(HKEY_LOCAL_MACHINE, syncRootManagerRegKey)) { - OCC::Utility::registryWalkSubKeys(HKEY_LOCAL_MACHINE, syncRootManagerRegKey, [&](HKEY, const QString &syncRootId) { - const QString syncRootIdUserSyncRootsRegistryKey = syncRootManagerRegKey + QStringLiteral("\\") + syncRootId + QStringLiteral(R"(\UserSyncRoots\)"); - OCC::Utility::registryWalkValues(HKEY_LOCAL_MACHINE, syncRootIdUserSyncRootsRegistryKey, [&](const QString &userSyncRootName, bool *done) { - const auto userSyncRootValue = QDir::fromNativeSeparators(OCC::Utility::registryGetKeyValue(HKEY_LOCAL_MACHINE, syncRootIdUserSyncRootsRegistryKey, userSyncRootName).toString()); - if (QDir::fromNativeSeparators(filePath).startsWith(userSyncRootValue)) { - const auto syncRootIdSplit = syncRootId.split(QLatin1Char('!'), Qt::SkipEmptyParts); - if (!syncRootIdSplit.isEmpty()) { - serverName = VfsShellExtensions::serverNameForApplicationName(syncRootIdSplit.first()); - *done = true; - } - } - }); - }); - } - return serverName; + return findServerNameForPath(filePath); } bool ThumbnailProviderIpc::connectSocketToServer(const QString &serverName) diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.cpp b/src/libsync/vfs/cfapi/vfs_cfapi.cpp index 3893f6393..af5347ff6 100644 --- a/src/libsync/vfs/cfapi/vfs_cfapi.cpp +++ b/src/libsync/vfs/cfapi/vfs_cfapi.cpp @@ -40,12 +40,16 @@ const auto rootKey = HKEY_CURRENT_USER; bool registerShellExtension() { + const QList> listExtensions = { + {CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME, CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG}, + {CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME, CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG} + }; + // assume CFAPI_SHELL_EXTENSIONS_LIB_NAME is always in the same folder as the main executable // assume CFAPI_SHELL_EXTENSIONS_LIB_NAME is always in the same folder as the main executable const auto shellExtensionDllPath = QDir::toNativeSeparators(QString(QCoreApplication::applicationDirPath() + QStringLiteral("/") + CFAPI_SHELL_EXTENSIONS_LIB_NAME + QStringLiteral(".dll"))); if (!QFileInfo::exists(shellExtensionDllPath)) { Q_ASSERT(false); - qCWarning(lcCfApi) << "Register CfAPI shell extensions failed. Dll does not exist in " - << QCoreApplication::applicationDirPath(); + qCWarning(lcCfApi) << "Register CfAPI shell extensions failed. Dll does not exist in " << QCoreApplication::applicationDirPath(); return false; } @@ -57,20 +61,22 @@ bool registerShellExtension() return false; } - const QString clsidPath = QString() % clsIdRegKey % CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG; - const QString clsidServerPath = clsidPath % R"(\InprocServer32)"; + for (const auto extension : listExtensions) { + const QString clsidPath = QString() % clsIdRegKey % extension.second; + const QString clsidServerPath = clsidPath % R"(\InprocServer32)"; - if (!OCC::Utility::registrySetKeyValue(rootKey, clsidPath, QStringLiteral("AppID"), REG_SZ, CFAPI_SHELLEXT_APPID_REG)) { - return false; - } - if (!OCC::Utility::registrySetKeyValue(rootKey, clsidPath, {}, REG_SZ, CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME)) { - return false; - } - if (!OCC::Utility::registrySetKeyValue(rootKey, clsidServerPath, {}, REG_SZ, shellExtensionDllPath)) { - return false; - } - if (!OCC::Utility::registrySetKeyValue(rootKey, clsidServerPath, QStringLiteral("ThreadingModel"), REG_SZ, QStringLiteral("Apartment"))) { - return false; + if (!OCC::Utility::registrySetKeyValue(rootKey, clsidPath, QStringLiteral("AppID"), REG_SZ, CFAPI_SHELLEXT_APPID_REG)) { + return false; + } + if (!OCC::Utility::registrySetKeyValue(rootKey, clsidPath, {}, REG_SZ, extension.first)) { + return false; + } + if (!OCC::Utility::registrySetKeyValue(rootKey, clsidServerPath, {}, REG_SZ, shellExtensionDllPath)) { + return false; + } + if (!OCC::Utility::registrySetKeyValue(rootKey, clsidServerPath, QStringLiteral("ThreadingModel"), REG_SZ, QStringLiteral("Apartment"))) { + return false; + } } return true; @@ -83,9 +89,16 @@ void unregisterShellExtensions() OCC::Utility::registryDeleteKeyTree(rootKey, appIdPath); } - const QString clsidPath = QString() % clsIdRegKey % CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG; - if (OCC::Utility::registryKeyExists(rootKey, clsidPath)) { - OCC::Utility::registryDeleteKeyTree(rootKey, clsidPath); + const QStringList listExtensions = { + CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG, + CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG + }; + + for (const auto extension : listExtensions) { + const QString clsidPath = QString() % clsIdRegKey % extension; + if (OCC::Utility::registryKeyExists(rootKey, clsidPath)) { + OCC::Utility::registryDeleteKeyTree(rootKey, clsidPath); + } } } @@ -276,6 +289,8 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData) bool VfsCfApi::setPinState(const QString &folderPath, PinState state) { + qCDebug(lcCfApi) << "setPinState" << folderPath << state; + const auto localPath = QDir::toNativeSeparators(params().filesystemPath + folderPath); if (cfapi::setPinState(localPath, state, cfapi::Recurse)) { @@ -358,8 +373,7 @@ void VfsCfApi::requestHydration(const QString &requestId, const QString &path) // Set in the database that we should download the file SyncJournalFileRecord record; - journal->getFileRecord(relativePath, &record); - if (!record.isValid()) { + if (!journal->getFileRecord(relativePath, &record) || !record.isValid()) { qCInfo(lcCfApi) << "Couldn't hydrate, did not find file in db"; emit hydrationRequestFailed(requestId); return; diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.h b/src/libsync/vfs/cfapi/vfs_cfapi.h index 23053415a..3803bf148 100644 --- a/src/libsync/vfs/cfapi/vfs_cfapi.h +++ b/src/libsync/vfs/cfapi/vfs_cfapi.h @@ -61,7 +61,7 @@ public: public slots: void requestHydration(const QString &requestId, const QString &path); - void fileStatusChanged(const QString &systemFileName, SyncFileStatus fileStatus) override; + void fileStatusChanged(const QString &systemFileName, OCC::SyncFileStatus fileStatus) override; signals: void hydrationRequestReady(const QString &requestId); diff --git a/src/libsync/vfs/suffix/vfs_suffix.cpp b/src/libsync/vfs/suffix/vfs_suffix.cpp index 0ed2ce93b..6fcb1d2f5 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.cpp +++ b/src/libsync/vfs/suffix/vfs_suffix.cpp @@ -14,12 +14,15 @@ #include "vfs_suffix.h" -#include - #include "syncfileitem.h" #include "filesystem.h" #include "common/syncjournaldb.h" +#include +#include + +Q_LOGGING_CATEGORY(lcVfsSuffix, "nextcloud.sync.vfs.suffix", QtInfoMsg) + namespace OCC { VfsSuffix::VfsSuffix(QObject *parent) @@ -45,12 +48,17 @@ void VfsSuffix::startImpl(const VfsSetupParams ¶ms) // that are not marked as a virtual file. These could be real .owncloud // files that were synced before vfs was enabled. QByteArrayList toWipe; - params.journal->getFilesBelowPath("", [&toWipe](const SyncJournalFileRecord &rec) { + if (!params.journal->getFilesBelowPath("", [&toWipe](const SyncJournalFileRecord &rec) { if (!rec.isVirtualFile() && rec._path.endsWith(APPLICATION_DOTVIRTUALFILE_SUFFIX)) toWipe.append(rec._path); - }); - for (const auto &path : toWipe) - params.journal->deleteFileRecord(path); + })) { + qWarning() << "Could not get files below path \"\" from local DB"; + } + for (const auto &path : toWipe) { + if (!params.journal->deleteFileRecord(path)) { + qWarning() << "Failed to delete file record from local DB" << path; + } + } } void VfsSuffix::stop() @@ -153,6 +161,12 @@ bool VfsSuffix::statTypeVirtualFile(csync_file_stat_t *stat, void *) return false; } +bool VfsSuffix::setPinState(const QString &folderPath, PinState state) +{ + qCDebug(lcVfsSuffix) << "setPinState" << folderPath << state; + return setPinStateInDb(folderPath, state); +} + Vfs::AvailabilityResult VfsSuffix::availability(const QString &folderPath) { return availabilityInDb(folderPath); diff --git a/src/libsync/vfs/suffix/vfs_suffix.h b/src/libsync/vfs/suffix/vfs_suffix.h index e3ddaed69..6169290ba 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.h +++ b/src/libsync/vfs/suffix/vfs_suffix.h @@ -29,14 +29,14 @@ public: explicit VfsSuffix(QObject *parent = nullptr); ~VfsSuffix() override; - Mode mode() const override; - QString fileSuffix() const override; + [[nodiscard]] Mode mode() const override; + [[nodiscard]] QString fileSuffix() const override; void stop() override; void unregisterFolder() override; - bool socketApiPinStateActionsShown() const override { return true; } - bool isHydrating() const override; + [[nodiscard]] bool socketApiPinStateActionsShown() const override { return true; } + [[nodiscard]] bool isHydrating() const override; Result updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override; @@ -48,14 +48,13 @@ public: bool isDehydratedPlaceholder(const QString &filePath) override; bool statTypeVirtualFile(csync_file_stat_t *stat, void *stat_data) override; - bool setPinState(const QString &folderPath, PinState state) override - { return setPinStateInDb(folderPath, state); } + bool setPinState(const QString &folderPath, PinState state) override; Optional pinState(const QString &folderPath) override { return pinStateInDb(folderPath); } AvailabilityResult availability(const QString &folderPath) override; public slots: - void fileStatusChanged(const QString &, SyncFileStatus) override {} + void fileStatusChanged(const QString &, OCC::SyncFileStatus) override {} protected: void startImpl(const VfsSetupParams ¶ms) override; diff --git a/src/libsync/vfs/xattr/vfs_xattr.cpp b/src/libsync/vfs/xattr/vfs_xattr.cpp index 6a15067ac..4300f6d30 100644 --- a/src/libsync/vfs/xattr/vfs_xattr.cpp +++ b/src/libsync/vfs/xattr/vfs_xattr.cpp @@ -14,14 +14,16 @@ #include "vfs_xattr.h" -#include - #include "syncfileitem.h" #include "filesystem.h" #include "common/syncjournaldb.h" - #include "xattrwrapper.h" +#include +#include + +Q_LOGGING_CATEGORY(lcVfsXAttr, "nextcloud.sync.vfs.xattr", QtInfoMsg) + namespace xattr { using namespace OCC::XAttrWrapper; } @@ -172,6 +174,7 @@ bool VfsXAttr::statTypeVirtualFile(csync_file_stat_t *stat, void *statData) bool VfsXAttr::setPinState(const QString &folderPath, PinState state) { + qCDebug(lcVfsXAttr) << "setPinState" << folderPath << state; return setPinStateInDb(folderPath, state); } diff --git a/src/libsync/vfs/xattr/vfs_xattr.h b/src/libsync/vfs/xattr/vfs_xattr.h index 2170a42a7..118d4d286 100644 --- a/src/libsync/vfs/xattr/vfs_xattr.h +++ b/src/libsync/vfs/xattr/vfs_xattr.h @@ -29,14 +29,14 @@ public: explicit VfsXAttr(QObject *parent = nullptr); ~VfsXAttr() override; - Mode mode() const override; - QString fileSuffix() const override; + [[nodiscard]] Mode mode() const override; + [[nodiscard]] QString fileSuffix() const override; void stop() override; void unregisterFolder() override; - bool socketApiPinStateActionsShown() const override; - bool isHydrating() const override; + [[nodiscard]] bool socketApiPinStateActionsShown() const override; + [[nodiscard]] bool isHydrating() const override; Result updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override; @@ -53,7 +53,7 @@ public: AvailabilityResult availability(const QString &folderPath) override; public slots: - void fileStatusChanged(const QString &systemFileName, SyncFileStatus fileStatus) override; + void fileStatusChanged(const QString &systemFileName, OCC::SyncFileStatus fileStatus) override; protected: void startImpl(const VfsSetupParams ¶ms) override; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d7ff56515..972f40d6d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -10,6 +10,8 @@ add_library(testutils pushnotificationstestutils.cpp themeutils.cpp testhelper.cpp + sharetestutils.cpp + endtoendtestutils.cpp ) target_link_libraries(testutils PUBLIC Nextcloud::sync Qt5::Test) @@ -64,6 +66,17 @@ nextcloud_add_test(ActivityListModel) nextcloud_add_test(ActivityData) nextcloud_add_test(TalkReply) nextcloud_add_test(LockFile) +nextcloud_add_test(ShareModel) +nextcloud_add_test(ShareeModel) +nextcloud_add_test(SortedShareModel) + +if(ADD_E2E_TESTS) + nextcloud_add_test(E2eServerSetup) + nextcloud_add_test(E2eFileTransfer) +else() + nextcloud_build_test(E2eServerSetup) + nextcloud_build_test(E2eFileTransfer) +endif() if( UNIX AND NOT APPLE ) nextcloud_add_test(InotifyWatcher) @@ -76,7 +89,7 @@ if (WIN32) nextcloud_add_test(SyncCfApi) nextcloud_add_test(CfApiShellExtensionsIPC) - target_sources(CfApiShellExtensionsIPCTest PRIVATE "${CMAKE_SOURCE_DIR}/src/libsync/vfs/cfapi/shellext/thumbnailprovideripc.cpp") + target_sources(CfApiShellExtensionsIPCTest PRIVATE "${CMAKE_SOURCE_DIR}/src/libsync/vfs/cfapi/shellext/thumbnailprovideripc.cpp" "${CMAKE_SOURCE_DIR}/src/libsync/vfs/cfapi/shellext/customstateprovideripc.cpp" "${CMAKE_SOURCE_DIR}/src/libsync/vfs/cfapi/shellext/ipccommon.cpp") elseif(LINUX) # elseif(LINUX OR APPLE) nextcloud_add_test(SyncXAttr) endif() diff --git a/test/csync/vio_tests/check_vio_ext.cpp b/test/csync/vio_tests/check_vio_ext.cpp index 193a9be47..754227121 100644 --- a/test/csync/vio_tests/check_vio_ext.cpp +++ b/test/csync/vio_tests/check_vio_ext.cpp @@ -44,10 +44,10 @@ int oc_mkdir(const QString &path) static mbchar_t wd_buffer[WD_BUFFER_SIZE]; -typedef struct { +using statevar = struct { QByteArray result; QByteArray ignored_dir; -} statevar; +}; /* remove the complete test dir */ static int wipe_testdir() diff --git a/test/endtoendtestutils.cpp b/test/endtoendtestutils.cpp new file mode 100644 index 000000000..a25a7e145 --- /dev/null +++ b/test/endtoendtestutils.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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 "endtoendtestutils.h" + +#include +#include +#include + +#include "cmd/simplesslerrorhandler.h" +#include "creds/httpcredentials.h" +#include "gui/accountmanager.h" +#include "libsync/theme.h" +#include "accessmanager.h" +#include "httplogger.h" +#include "syncenginetestutils.h" +#include "testhelper.h" + +constexpr auto serverUrl = "https://server"; + +Q_LOGGING_CATEGORY(lcEndToEndTestUtils, "nextcloud.gui.endtoendtestutils", QtInfoMsg) + +/** End to end test credentials access manager class **/ + +class EndToEndTestCredentialsAccessManager : public OCC::AccessManager +{ +public: + EndToEndTestCredentialsAccessManager(const EndToEndTestCredentials *cred, QObject *parent = nullptr) + : OCC::AccessManager(parent) + , _cred(cred) + { + } + +protected: + QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) override + { + if(!_cred) { + qCWarning(lcEndToEndTestUtils) << "Could not create request -- null creds!"; + return {}; + } + + QNetworkRequest req(request); + QByteArray credHash = QByteArray(_cred->user().toUtf8() + ":" + _cred->password().toUtf8()).toBase64(); + req.setRawHeader("Authorization", "Basic " + credHash); + + return OCC::AccessManager::createRequest(op, req, outgoingData); + } + +private: + // The credentials object dies along with the account, while the QNAM might + // outlive both. + QPointer _cred; +}; + +/** End to end test credentials class **/ + +QNetworkAccessManager *EndToEndTestCredentials::createQNAM() const +{ + return new EndToEndTestCredentialsAccessManager(this); +} + +/** End to end test helper class **/ + +EndToEndTestHelper::~EndToEndTestHelper() +{ + removeConfiguredSyncFolder(); + removeConfiguredAccount(); + + OCC::AccountManager::instance()->shutdown(); +} + +void EndToEndTestHelper::startAccountConfig() +{ + const auto accountManager = OCC::AccountManager::instance(); + _account = accountManager->createAccount(); + + _account->setCredentials(new EndToEndTestCredentials); + _account->setUrl(OCC::Theme::instance()->overrideServerUrl()); + + const auto serverUrlString = QString(serverUrl); + _account->setUrl(serverUrlString); + + _account->networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::NoProxy)); + _account->setSslConfiguration(QSslConfiguration::defaultConfiguration()); + _account->setSslErrorHandler(new OCC::SimpleSslErrorHandler); + _account->setTrustCertificates(true); + + slotConnectToNCUrl(serverUrlString); +} + +void EndToEndTestHelper::slotConnectToNCUrl(const QString &url) +{ + qCDebug(lcEndToEndTestUtils) << "Connect to url: " << url; + + const auto fetchUserNameJob = new OCC::JsonApiJob(_account->sharedFromThis(), QStringLiteral("/ocs/v1.php/cloud/user")); + connect(fetchUserNameJob, &OCC::JsonApiJob::jsonReceived, this, [this, url](const QJsonDocument &json, const int statusCode) { + if (statusCode != 100) { + qCDebug(lcEndToEndTestUtils) << "Could not fetch username."; + } + + const auto objData = json.object().value("ocs").toObject().value("data").toObject(); + const auto userId = objData.value("id").toString(""); + const auto displayName = objData.value("display-name").toString(""); + _account->setDavUser(userId); + _account->setDavDisplayName(displayName); + + _accountState = new OCC::AccountState(_account); + + emit accountReady(_account); + }); + fetchUserNameJob->start(); +} + +void EndToEndTestHelper::removeConfiguredAccount() +{ + OCC::AccountManager::instance()->deleteAccount(_accountState.data()); +} + +OCC::Folder *EndToEndTestHelper::configureSyncFolder(const QString &targetPath) +{ + if(_syncFolder) { + removeConfiguredSyncFolder(); + } + + qCDebug(lcEndToEndTestUtils) << "Creating temp end-to-end test folder."; + Q_ASSERT(_tempDir.isValid()); + OCC::FileSystem::setFolderMinimumPermissions(_tempDir.path()); + qCDebug(lcEndToEndTestUtils) << "Created temp end-to-end test folder at:" << _tempDir.path(); + + setupFolderMan(); + + OCC::FolderDefinition definition; + definition.localPath = _tempDir.path(); + definition.targetPath = targetPath; + _syncFolder = _folderMan->addFolder(_accountState.data(), definition); + + return _syncFolder; +} + +void EndToEndTestHelper::removeConfiguredSyncFolder() +{ + if(!_syncFolder || !_folderMan) { + return; + } + + QSignalSpy folderSyncFinished(_syncFolder, &OCC::Folder::syncFinished); + _folderMan->forceSyncForFolder(_syncFolder); + Q_ASSERT(folderSyncFinished.wait(3000)); + _folderMan->unloadAndDeleteAllFolders(); + _syncFolder = nullptr; +} + +void EndToEndTestHelper::setupFolderMan() +{ + if(_folderMan) { + return; + } + + auto folderMan = new OCC::FolderMan; + Q_ASSERT(folderMan); + folderMan->setSyncEnabled(true); + _folderMan.reset(folderMan); +} diff --git a/test/endtoendtestutils.h b/test/endtoendtestutils.h new file mode 100644 index 000000000..c1a48329a --- /dev/null +++ b/test/endtoendtestutils.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include + +#include "gui/accountstate.h" +#include "gui/folderman.h" +#include "libsync/account.h" + +constexpr auto testUsername = "test"; +constexpr auto testPassword = "test"; + +class QNetworkReply; + +namespace OCC +{ +class Folder; +class FolderMan; +} + +class EndToEndTestCredentials : public OCC::AbstractCredentials +{ + Q_OBJECT + +public: + explicit EndToEndTestCredentials() + : OCC::AbstractCredentials() + , _user(testUsername) + , _password(testPassword) + { + _wasFetched = true; + }; + + [[nodiscard]] QString authType() const override { return QStringLiteral("http"); } + [[nodiscard]] QString user() const override { return _user; } + [[nodiscard]] QString password() const override { return _password; } + [[nodiscard]] bool ready() const override { return true; } + bool stillValid(QNetworkReply *) override { return true; } + void askFromUser() override {}; + void fetchFromKeychain() override { _wasFetched = true; Q_EMIT fetched(); }; + void persist() override {}; + void invalidateToken() override {}; + void forgetSensitiveData() override {}; + + [[nodiscard]] QNetworkAccessManager *createQNAM() const override; + +private: + QString _user; + QString _password; +}; + +class EndToEndTestHelper : public QObject +{ + Q_OBJECT + +public: + EndToEndTestHelper() = default; + ~EndToEndTestHelper() override; + + [[nodiscard]] OCC::AccountPtr account() const { return _account; } + [[nodiscard]] OCC::AccountStatePtr accountState() const { return _accountState; } + + OCC::Folder *configureSyncFolder(const QString &targetPath = QStringLiteral("")); + +signals: + void accountReady(const OCC::AccountPtr &account); + +public slots: + void startAccountConfig(); + void removeConfiguredAccount(); + void removeConfiguredSyncFolder(); + +private slots: + void slotConnectToNCUrl(const QString &url); + void setupFolderMan(); + +private: + OCC::AccountPtr _account; + OCC::AccountStatePtr _accountState; + QScopedPointer _folderMan; + QTemporaryDir _tempDir; + + OCC::Folder* _syncFolder = nullptr; +}; diff --git a/test/nextcloud_add_test.cmake b/test/nextcloud_add_test.cmake index 98f3ef767..6bbcdf30f 100644 --- a/test/nextcloud_add_test.cmake +++ b/test/nextcloud_add_test.cmake @@ -1,5 +1,42 @@ find_package(Qt5 COMPONENTS Core Test Xml Network Qml Quick REQUIRED) +macro(nextcloud_build_test test_class) + set(CMAKE_AUTOMOC TRUE) + set(OWNCLOUD_TEST_CLASS ${test_class}) + string(TOLOWER "${OWNCLOUD_TEST_CLASS}" OWNCLOUD_TEST_CLASS_LOWERCASE) + + add_executable(${OWNCLOUD_TEST_CLASS}Test test${OWNCLOUD_TEST_CLASS_LOWERCASE}.cpp) + set_target_properties(${OWNCLOUD_TEST_CLASS}Test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY}) + + target_link_libraries(${OWNCLOUD_TEST_CLASS}Test PRIVATE + Nextcloud::sync + testutils + nextcloudCore + cmdCore + Qt5::Test + Qt5::Quick + ) + + if (WIN32) + target_link_libraries(${OWNCLOUD_TEST_CLASS}Test PRIVATE nextcloudsync_vfs_cfapi) + elseif (LINUX) + target_link_libraries(${OWNCLOUD_TEST_CLASS}Test PRIVATE nextcloudsync_vfs_xattr) + endif() + + IF(BUILD_UPDATER) + target_link_libraries(${OWNCLOUD_TEST_CLASS}Test PRIVATE updater) + endif() + + add_definitions(-DOWNCLOUD_TEST) + add_definitions(-DOWNCLOUD_BIN_PATH="${CMAKE_BINARY_DIR}/bin") + + target_include_directories(${OWNCLOUD_TEST_CLASS}Test PRIVATE + "${CMAKE_SOURCE_DIR}/test/" + ${CMAKE_SOURCE_DIR}/src/3rdparty/qtokenizer + ) + set_target_properties(${OWNCLOUD_TEST_CLASS}Test PROPERTIES FOLDER Tests) +endmacro() + macro(nextcloud_add_test test_class) set(CMAKE_AUTOMOC TRUE) set(OWNCLOUD_TEST_CLASS ${test_class}) diff --git a/test/pushnotificationstestutils.h b/test/pushnotificationstestutils.h index 57e56831e..25c1d9345 100644 --- a/test/pushnotificationstestutils.h +++ b/test/pushnotificationstestutils.h @@ -36,13 +36,13 @@ public: void close(); - bool waitForTextMessages() const; + [[nodiscard]] bool waitForTextMessages() const; - uint32_t textMessagesCount() const; + [[nodiscard]] uint32_t textMessagesCount() const; - QString textMessage(int messageNumber) const; + [[nodiscard]] QString textMessage(int messageNumber) const; - QWebSocket *socketForTextMessage(int messageNumber) const; + [[nodiscard]] QWebSocket *socketForTextMessage(int messageNumber) const; void clearTextMessages(); @@ -70,11 +70,11 @@ class CredentialsStub : public OCC::AbstractCredentials public: CredentialsStub(const QString &user, const QString &password); - QString authType() const override; - QString user() const override; - QString password() const override; - QNetworkAccessManager *createQNAM() const override; - bool ready() const override; + [[nodiscard]] QString authType() const override; + [[nodiscard]] QString user() const override; + [[nodiscard]] QString password() const override; + [[nodiscard]] QNetworkAccessManager *createQNAM() const override; + [[nodiscard]] bool ready() const override; void fetchFromKeychain() override; void askFromUser() override; diff --git a/test/sharetestutils.cpp b/test/sharetestutils.cpp new file mode 100644 index 000000000..249d7b1df --- /dev/null +++ b/test/sharetestutils.cpp @@ -0,0 +1,444 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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 "sharetestutils.h" + +#include "testhelper.h" + +using namespace OCC; + +FakeShareDefinition::FakeShareDefinition(ShareTestHelper *helper, + const Share::ShareType type, + const QString &shareWith, + const QString &displayString, + const QString &password, + const QString ¬e, + const QString &expiration) +{ + ++helper->latestShareId; + const auto idString = QString::number(helper->latestShareId); + + + fileDefinition = helper->fakeFileDefinition; + shareId = idString; + shareCanDelete = true; + shareCanEdit = true; + shareUidOwner = helper->account->davUser();; + shareDisplayNameOwner = helper->account->davDisplayName(); + sharePassword = password; + sharePermissions = static_cast(SharePermissions(SharePermissionRead | + SharePermissionUpdate | + SharePermissionCreate | + SharePermissionDelete | + SharePermissionShare)); + shareNote = note; + shareHideDownload = 0; + shareExpiration = expiration; + shareSendPasswordByTalk = false; + shareType = type; + + const auto token = QString(QStringLiteral("GQ4aLrZEdJJkopW-") + idString); + // Weird, but it's what the server does + const auto finalShareWith = type == Share::TypeLink ? password : shareWith; + const auto shareWithDisplayName = type == Share::TypeLink ? QStringLiteral("(Shared Link)") : displayString; + const auto linkLabel = type == Share::TypeLink ? displayString : QString(); + const auto linkName = linkShareLabel; + const auto linkUrl = type == Share::TypeLink ? QString(helper->account->davUrl().toString() + QStringLiteral("/s/") + token) : QString(); + + shareShareWith = finalShareWith; + shareShareWithDisplayName = shareWithDisplayName; + shareToken = token; + linkShareName = linkName; + linkShareLabel = linkLabel; + linkShareUrl = linkUrl; +} + +QJsonObject FakeShareDefinition::toShareJsonObject() const +{ + QJsonObject newShareJson; + newShareJson.insert("uid_file_owner", fileDefinition.fileOwnerUid); + newShareJson.insert("displayname_file_owner", fileDefinition.fileOwnerDisplayName); + newShareJson.insert("file_target", fileDefinition.fileTarget); + newShareJson.insert("has_preview", fileDefinition.fileHasPreview); + newShareJson.insert("file_parent", fileDefinition.fileFileParent); + newShareJson.insert("file_source", fileDefinition.fileSource); + newShareJson.insert("item_source", fileDefinition.fileItemSource); + newShareJson.insert("item_type", fileDefinition.fileItemType); + newShareJson.insert("mail_send", fileDefinition.fileMailSend); + newShareJson.insert("mimetype", fileDefinition.fileMimeType); + newShareJson.insert("parent", fileDefinition.fileParent); + newShareJson.insert("path", fileDefinition.filePath); + newShareJson.insert("storage", fileDefinition.fileStorage); + newShareJson.insert("storage_id", fileDefinition.fileStorageId); + newShareJson.insert("id", shareId); + newShareJson.insert("can_delete", shareCanDelete); + newShareJson.insert("can_edit", shareCanEdit); + newShareJson.insert("uid_owner", shareUidOwner); + newShareJson.insert("displayname_owner", shareDisplayNameOwner); + newShareJson.insert("password", sharePassword); + newShareJson.insert("permissions", sharePermissions); + newShareJson.insert("note", shareNote); + newShareJson.insert("hide_download", shareHideDownload); + newShareJson.insert("expiration", shareExpiration); + newShareJson.insert("send_password_by_talk", shareSendPasswordByTalk); + newShareJson.insert("share_type", shareType); + newShareJson.insert("share_with", shareShareWith); + newShareJson.insert("share_with_displayname", shareShareWithDisplayName); + newShareJson.insert("token", shareToken); + newShareJson.insert("name", linkShareName); + newShareJson.insert("label", linkShareLabel); + newShareJson.insert("url", linkShareUrl); + + return newShareJson; +} + +QByteArray FakeShareDefinition::toRequestReply() const +{ + const auto shareJson = toShareJsonObject(); + return jsonValueToOccReply(shareJson); +} + +// Below is ShareTestHelper +ShareTestHelper::ShareTestHelper(QObject *parent) + : QObject(parent) +{ +} + +ShareTestHelper::~ShareTestHelper() +{ + const auto folder = FolderMan::instance()->folder(fakeFolder.localPath()); + if (folder) { + FolderMan::instance()->removeFolder(folder); + } + AccountManager::instance()->deleteAccount(accountState.data()); +} + +void ShareTestHelper::setup() +{ + _fakeQnam.reset(new FakeQNAM({})); + _fakeQnam->setOverride([this](const QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) { + return qnamOverride(op, req, device); + }); + + account = Account::create(); + account->setCredentials(new FakeCredentials{_fakeQnam.data()}); + account->setUrl(QUrl(("owncloud://somehost/owncloud"))); + account->setCapabilities(_fakeCapabilities); + accountState = new AccountState(account); + AccountManager::instance()->addAccount(account); + + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + fakeFolder.localModifier().insert(testFileName); + + const auto folderMan = FolderMan::instance(); + QCOMPARE(folderMan, &fm); + auto folderDef = folderDefinition(fakeFolder.localPath()); + folderDef.targetPath = QString(); + QVERIFY(folderMan->addFolder(accountState.data(), folderDef)); + const auto folder = FolderMan::instance()->folder(fakeFolder.localPath()); + QVERIFY(folder); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + const auto fakeFileInfo = fakeFolder.remoteModifier().find(testFileName); + QVERIFY(fakeFileInfo); + fakeFileInfo->permissions.setPermission(RemotePermissions::CanReshare); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + QVERIFY(fakeFileInfo->permissions.CanReshare); + + _fakeCapabilities = QVariantMap { + {QStringLiteral("files_sharing"), QVariantMap { + {QStringLiteral("api_enabled"), true}, + {QStringLiteral("default_permissions"), 19}, + {QStringLiteral("public"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("expire_date"), QVariantMap { + {QStringLiteral("days"), 30}, + {QStringLiteral("enforced"), false}, + }}, + {QStringLiteral("expire_date_internal"), QVariantMap { + {QStringLiteral("days"), 30}, + {QStringLiteral("enforced"), false}, + }}, + {QStringLiteral("expire_date_remote"), QVariantMap { + {QStringLiteral("days"), 30}, + {QStringLiteral("enforced"), false}, + }}, + {QStringLiteral("password"), QVariantMap { + {QStringLiteral("enforced"), false}, + }}, + }}, + {QStringLiteral("sharebymail"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("password"), QVariantMap { + {QStringLiteral("enforced"), false}, + }}, + }}, + }}, + }; + + // Generate test data + // Properties that apply to the file generally + const auto fileOwnerUid = account->davUser(); + const auto fileOwnerDisplayName = account->davDisplayName(); + const auto fileTarget = QString(QStringLiteral("/") + fakeFileInfo->name); + const auto fileHasPreview = true; + const auto fileFileParent = QString(fakeFolder.remoteModifier().fileId); + const auto fileSource = QString(fakeFileInfo->fileId); + const auto fileItemSource = fileSource; + const auto fileItemType = QStringLiteral("file"); + const auto fileMailSend = 0; + const auto fileMimeType = QStringLiteral("text/markdown"); + const auto fileParent = QString(); + const auto filePath = fakeFileInfo->path(); + const auto fileStorage = 3; + const auto fileStorageId = QString(QStringLiteral("home::") + account->davUser()); + + fakeFileDefinition = FakeFileReplyDefinition { + fileOwnerUid, + fileOwnerDisplayName, + fileTarget, + fileHasPreview, + fileFileParent, + fileSource, + fileItemSource, + fileItemType, + fileMailSend, + fileMimeType, + fileParent, + filePath, + fileStorage, + fileStorageId, + }; + + emit setupSucceeded(); +} + +QNetworkReply *ShareTestHelper::qnamOverride(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) +{ + QNetworkReply *reply = nullptr; + + const auto reqUrl = req.url(); + const auto reqRawPath = reqUrl.path(); + const auto reqPath = reqRawPath.startsWith("/owncloud/") ? reqRawPath.mid(10) : reqRawPath; + qDebug() << req.url() << reqPath << op; + + // Properly formatted PROPFIND URL goes something like: + // https://cloud.nextcloud.com/remote.php/dav/files/claudio/Readme.md + if(reqPath.endsWith(testFileName) && req.attribute(QNetworkRequest::CustomVerbAttribute) == "PROPFIND") { + + reply = new FakePropfindReply(fakeFolder.remoteModifier(), op, req, this); + + } else if (req.url().toString().startsWith(accountState->account()->url().toString()) && + reqPath.startsWith(QStringLiteral("ocs/v2.php/apps/files_sharing/api/v1/shares"))) { + + if (op == QNetworkAccessManager::PostOperation) { + reply = handleSharePostOperation(op, req, device); + + } else if(req.attribute(QNetworkRequest::CustomVerbAttribute) == "DELETE") { + reply = handleShareDeleteOperation(op, req, reqPath); + + } else if(op == QNetworkAccessManager::PutOperation) { + reply = handleSharePutOperation(op, req, reqPath, device); + + } else if(req.attribute(QNetworkRequest::CustomVerbAttribute) == "GET") { + reply = handleShareGetOperation(op, req, reqPath); + } + } else { + reply = new FakeErrorReply(op, req, this, 404, _fake404Response); + } + + return reply; +} + +QNetworkReply *ShareTestHelper::handleSharePostOperation(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) +{ + QNetworkReply *reply = nullptr; + + // POST https://somehost/owncloud/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json + // Header: { Ocs-APIREQUEST: true, Content-Type: application/x-www-form-urlencoded, X-Request-ID: 1527752d-e147-4da7-89b8-fb06315a5fad, } + // Data: [path=file.md&shareType=3]" + const QUrlQuery urlQuery(req.url()); + const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format")); + + if (formatParam == QStringLiteral("json")) { + device->open(QIODevice::ReadOnly); + const auto requestBody = device->readAll(); + device->close(); + + const auto requestData = requestBody.split('&'); + // We don't care about path since we know the file we are testing with + auto requestShareType = -10; // Just in case + QString requestShareWith; + QString requestName; + QString requestPassword; + + for(const auto &data : requestData) { + const auto requestDataUrl = QUrl::fromPercentEncoding(data); + const QString requestDataUrlString(requestDataUrl); + + if (data.contains("shareType=")) { + const auto shareTypeString = requestDataUrlString.mid(10); + requestShareType = Share::ShareType(shareTypeString.toInt()); + } else if (data.contains("shareWith=")) { + requestShareWith = data.mid(10); + } else if (data.contains("name=")) { + requestName = data.mid(5); + } else if (data.contains("password=")) { + requestPassword = data.mid(9); + } + } + + if (requestPassword.isEmpty() && + ((requestShareType == Share::TypeEmail && account->capabilities().shareEmailPasswordEnforced()) || + (requestShareType == Share::TypeLink && account->capabilities().sharePublicLinkEnforcePassword()))) { + + reply = new FakePayloadReply(op, req, _fake403Response, searchResultsReplyDelay, _fakeQnam.data()); + + } else if (requestShareType >= 0) { + const auto shareType = Share::ShareType(requestShareType); + reply = new FakePayloadReply(op, req, createNewShare(shareType, requestShareWith, requestPassword), searchResultsReplyDelay, _fakeQnam.data()); + } + } + + return reply; +} + +QNetworkReply *ShareTestHelper::handleSharePutOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, const QString &reqPath, QIODevice *device) +{ + QNetworkReply *reply = nullptr; + + const auto splitUrlPath = reqPath.split('/'); + const auto shareId = splitUrlPath.last(); + + const QUrlQuery urlQuery(req.url()); + const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format")); + + if (formatParam == QStringLiteral("json")) { + device->open(QIODevice::ReadOnly); + const auto requestBody = device->readAll(); + device->close(); + + const auto requestData = requestBody.split('&'); + + const auto existingShareIterator = std::find_if(_sharesReplyData.cbegin(), _sharesReplyData.cend(), [&shareId](const QJsonValue &value) { + return value.toObject().value("id").toString() == shareId; + }); + + if (existingShareIterator == _sharesReplyData.cend()) { + reply = new FakeErrorReply(op, req, this, 404, _fake404Response); + } else { + const auto existingShareValue = *existingShareIterator; + auto shareObject = existingShareValue.toObject(); + + for (const auto &requestDataItem : requestData) { + const auto requestSplit = requestDataItem.split('='); + auto requestKey = requestSplit.first(); + auto requestValue = requestSplit.last(); + + // We send expireDate without time but the server returns with time at 00:00:00 + if (requestKey == "expireDate") { + requestKey = "expiration"; + requestValue.append(" 00:00:00"); + } + + shareObject.insert(QString(requestKey), QString(requestValue)); + } + + _sharesReplyData.replace(existingShareIterator - _sharesReplyData.cbegin(), shareObject); + reply = new FakePayloadReply(op, req, jsonValueToOccReply(shareObject), searchResultsReplyDelay, _fakeQnam.data()); + } + } + + return reply; +} + + +QNetworkReply *ShareTestHelper::handleShareDeleteOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, const QString &reqPath) +{ + QNetworkReply *reply = nullptr; + + const auto splitUrlPath = reqPath.split('/'); + const auto shareId = splitUrlPath.last(); + + const auto existingShareIterator = std::find_if(_sharesReplyData.cbegin(), _sharesReplyData.cend(), [&shareId](const QJsonValue &value) { + return value.toObject().value("id").toString() == shareId; + }); + + if (existingShareIterator == _sharesReplyData.cend()) { + reply = new FakeErrorReply(op, req, this, 404, _fake404Response); + } else { + _sharesReplyData.removeAt(existingShareIterator - _sharesReplyData.cbegin()); + reply = new FakePayloadReply(op, req, _fake200JsonResponse, searchResultsReplyDelay, _fakeQnam.data()); + } + + return reply; +} + +QNetworkReply *ShareTestHelper::handleShareGetOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, const QString &reqPath) +{ + QNetworkReply *reply = nullptr; + + // Properly formatted request to fetch shares goes something like: + // GET https://somehost/owncloud/ocs/v2.php/apps/files_sharing/api/v1/shares?path=file.md&reshares=true&format=json + // Header: { Ocs-APIREQUEST: true, Content-Type: application/x-www-form-urlencoded, X-Request-ID: 8ba8960d-ca0d-45ba-abf4-03ab95ba6064, } + // Data: [] + const auto urlQuery = QUrlQuery(req.url()); + const auto pathParam = urlQuery.queryItemValue(QStringLiteral("path")); + const auto resharesParam = urlQuery.queryItemValue(QStringLiteral("reshares")); + const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format")); + + if (formatParam != QStringLiteral("json") || (!pathParam.isEmpty() && !pathParam.endsWith(QString(testFileName)))) { + reply = new FakeErrorReply(op, req, this, 400, _fake400Response); + } else if (reqPath.contains(QStringLiteral("ocs/v2.php/apps/files_sharing/api/v1/shares"))) { + reply = new FakePayloadReply(op, req, jsonValueToOccReply(_sharesReplyData), searchResultsReplyDelay, _fakeQnam.data()); + } + + return reply; +} + +const QByteArray ShareTestHelper::createNewShare(const Share::ShareType shareType, const QString &shareWith, const QString &password) +{ + const auto displayString = shareType == Share::TypeLink ? QString() : shareWith; + const FakeShareDefinition newShareDefinition(this, + shareType, + shareWith, + displayString, + password); + + _sharesReplyData.append(newShareDefinition.toShareJsonObject()); + return newShareDefinition.toRequestReply(); +} + +int ShareTestHelper::shareCount() const +{ + return _sharesReplyData.count(); +} + +void ShareTestHelper::appendShareReplyData(const FakeShareDefinition &definition) +{ + _sharesReplyData.append(definition.toShareJsonObject()); +} + +void ShareTestHelper::resetTestShares() +{ + _sharesReplyData = QJsonArray(); +} + +void ShareTestHelper::resetTestData() +{ + resetTestShares(); + account->setCapabilities(_fakeCapabilities); +} diff --git a/test/sharetestutils.h b/test/sharetestutils.h new file mode 100644 index 000000000..c539547fe --- /dev/null +++ b/test/sharetestutils.h @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "gui/accountmanager.h" +#include "gui/folderman.h" +#include "gui/sharemanager.h" + +#include "syncenginetestutils.h" + +using namespace OCC; + +struct FakeFileReplyDefinition +{ + QString fileOwnerUid; + QString fileOwnerDisplayName; + QString fileTarget; + bool fileHasPreview; + QString fileFileParent; + QString fileSource; + QString fileItemSource; + QString fileItemType; + int fileMailSend; + QString fileMimeType; + QString fileParent; + QString filePath; + int fileStorage; + QString fileStorageId; +}; + +struct FakeShareDefinition +{ + FakeShareDefinition() = default; + FakeShareDefinition(ShareTestHelper *helper, + const Share::ShareType type, + const QString &shareWith, + const QString &displayString, + const QString &password = QString(), + const QString ¬e = QString(), + const QString &expiration = QString()); + + FakeFileReplyDefinition fileDefinition; + QString shareId; + bool shareCanDelete; + bool shareCanEdit; + QString shareUidOwner; + QString shareDisplayNameOwner; + QString sharePassword; + int sharePermissions; + QString shareNote; + int shareHideDownload; + QString shareExpiration; + bool shareSendPasswordByTalk; + int shareType; + QString shareShareWith; + QString shareShareWithDisplayName; + QString shareToken; + QString linkShareName; + QString linkShareLabel; + QString linkShareUrl; + + [[nodiscard]] QJsonObject toShareJsonObject() const; + [[nodiscard]] QByteArray toRequestReply() const; +}; + +class ShareTestHelper : public QObject +{ + Q_OBJECT + +public: + ShareTestHelper(QObject *parent = nullptr); + ~ShareTestHelper() override; + + FolderMan fm; + FakeFolder fakeFolder{FileInfo{}}; + FakeFileReplyDefinition fakeFileDefinition; + + AccountPtr account; + AccountStatePtr accountState; + + int latestShareId = 0; + + static constexpr auto testFileName = "file.md"; + static constexpr auto searchResultsReplyDelay = 100; + static constexpr auto expectedDtFormat = "yyyy-MM-dd 00:00:00"; + + const QByteArray createNewShare(const Share::ShareType shareType, const QString &shareWith, const QString &password); + [[nodiscard]] int shareCount() const; + +signals: + void setupSucceeded(); + +public slots: + void setup(); + void appendShareReplyData(const FakeShareDefinition &definition); + void resetTestShares(); + void resetTestData(); + +private slots: + [[nodiscard]] QNetworkReply *qnamOverride(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device); + [[nodiscard]] QNetworkReply *handleSharePostOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device); + [[nodiscard]] QNetworkReply *handleSharePutOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, const QString &reqPath, QIODevice *device); + [[nodiscard]] QNetworkReply *handleShareDeleteOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, const QString &reqPath); + [[nodiscard]] QNetworkReply *handleShareGetOperation(const QNetworkAccessManager::Operation op, const QNetworkRequest &req, const QString &reqPath); + +private: + QScopedPointer _fakeQnam; + + QByteArray _fake404Response = R"({"ocs":{"meta":{"status":"failure","statuscode":404,"message":"Invalid query, please check the syntax. API specifications are here: http:\/\/www.freedesktop.org\/wiki\/Specifications\/open-collaboration-services.\n"},"data":[]}})"; + QByteArray _fake403Response = R"({"ocs":{"meta":{"status":"failure","statuscode":403,"message":"Operation not allowed."},"data":[]}})"; + QByteArray _fake400Response = R"({"ocs":{"meta":{"status":"failure","statuscode":400,"message":"Parameter is incorrect.\n"},"data":[]}})"; + QByteArray _fake200JsonResponse = R"({"ocs":{"data":[],"meta":{"message":"OK","status":"ok","statuscode":200}}})"; + + QJsonArray _sharesReplyData; + QVariantMap _fakeCapabilities; + QSet _liveShareIds; +}; diff --git a/test/syncenginetestutils.cpp b/test/syncenginetestutils.cpp index f3af23d43..2bf6430a5 100644 --- a/test/syncenginetestutils.cpp +++ b/test/syncenginetestutils.cpp @@ -8,6 +8,7 @@ #include "syncenginetestutils.h" #include "httplogger.h" #include "accessmanager.h" +#include "gui/sharepermissions.h" #include #include @@ -103,6 +104,14 @@ void DiskFileModifier::setModTime(const QString &relativePath, const QDateTime & OCC::FileSystem::setModTime(_rootDir.filePath(relativePath), OCC::Utility::qDateTimeToTime_t(modTime)); } +void DiskFileModifier::modifyLockState([[maybe_unused]] const QString &relativePath, [[maybe_unused]] LockState lockState, [[maybe_unused]] int lockType, [[maybe_unused]] const QString &lockOwner, [[maybe_unused]] const QString &lockOwnerId, [[maybe_unused]] const QString &lockEditorId, [[maybe_unused]] quint64 lockTime, [[maybe_unused]] quint64 lockTimeout) +{ +} + +void DiskFileModifier::setE2EE([[maybe_unused]] const QString &relativePath, [[maybe_unused]] const bool enable) +{ +} + FileInfo FileInfo::A12_B12_C12_S12() { FileInfo fi { QString {}, { @@ -195,6 +204,26 @@ void FileInfo::setModTimeKeepEtag(const QString &relativePath, const QDateTime & file->lastModified = modTime; } +void FileInfo::modifyLockState(const QString &relativePath, LockState lockState, int lockType, const QString &lockOwner, const QString &lockOwnerId, const QString &lockEditorId, quint64 lockTime, quint64 lockTimeout) +{ + FileInfo *file = findInvalidatingEtags(relativePath); + Q_ASSERT(file); + file->lockState = lockState; + file->lockType = lockType; + file->lockOwner = lockOwner; + file->lockOwnerId = lockOwnerId; + file->lockEditorId = lockEditorId; + file->lockTime = lockTime; + file->lockTimeout = lockTimeout; +} + +void FileInfo::setE2EE(const QString &relativePath, const bool enable) +{ + FileInfo *file = findInvalidatingEtags(relativePath); + Q_ASSERT(file); + file->isEncrypted = enable; +} + FileInfo *FileInfo::find(PathComponents pathComponents, const bool invalidateEtags) { if (pathComponents.isEmpty()) { @@ -332,8 +361,23 @@ FakePropfindReply::FakePropfindReply(FileInfo &remoteRootFileInfo, QNetworkAcces xml.writeTextElement(davUri, QStringLiteral("getcontentlength"), QString::number(fileInfo.size)); xml.writeTextElement(davUri, QStringLiteral("getetag"), QStringLiteral("\"%1\"").arg(QString::fromLatin1(fileInfo.etag))); xml.writeTextElement(ocUri, QStringLiteral("permissions"), !fileInfo.permissions.isNull() ? QString(fileInfo.permissions.toString()) : fileInfo.isShared ? QStringLiteral("SRDNVCKW") : QStringLiteral("RDNVCKW")); + xml.writeTextElement(ocUri, QStringLiteral("share-permissions"), QString::number(static_cast(OCC::SharePermissions(OCC::SharePermissionRead | + OCC::SharePermissionUpdate | + OCC::SharePermissionCreate | + OCC::SharePermissionDelete | + OCC::SharePermissionShare)))); xml.writeTextElement(ocUri, QStringLiteral("id"), QString::fromUtf8(fileInfo.fileId)); + xml.writeTextElement(ocUri, QStringLiteral("fileid"), QString::fromUtf8(fileInfo.fileId)); xml.writeTextElement(ocUri, QStringLiteral("checksums"), QString::fromUtf8(fileInfo.checksums)); + xml.writeTextElement(ocUri, QStringLiteral("privatelink"), href); + xml.writeTextElement(ncUri, QStringLiteral("lock-owner"), fileInfo.lockOwnerId); + xml.writeTextElement(ncUri, QStringLiteral("lock"), fileInfo.lockState == FileInfo::LockState::FileLocked ? QStringLiteral("1") : QStringLiteral("0")); + xml.writeTextElement(ncUri, QStringLiteral("lock-owner-type"), fileInfo.lockOwnerId); + xml.writeTextElement(ncUri, QStringLiteral("lock-owner-displayname"), fileInfo.lockOwnerId); + xml.writeTextElement(ncUri, QStringLiteral("lock-owner-editor"), fileInfo.lockOwnerId); + xml.writeTextElement(ncUri, QStringLiteral("lock-time"), QString::number(fileInfo.lockTime)); + xml.writeTextElement(ncUri, QStringLiteral("lock-timeout"), QString::number(fileInfo.lockTimeout)); + xml.writeTextElement(ncUri, QStringLiteral("is-encrypted"), fileInfo.isEncrypted ? QString::number(1) : QString::number(0)); buffer.write(fileInfo.extraDavProperties); xml.writeEndElement(); // prop xml.writeTextElement(davUri, QStringLiteral("status"), QStringLiteral("HTTP/1.1 200 OK")); @@ -611,7 +655,8 @@ FakeGetReply::FakeGetReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager:: Q_ASSERT(!fileName.isEmpty()); fileInfo = remoteRootFileInfo.find(fileName); if (!fileInfo) { - qDebug() << "meh;"; + qDebug() << "url: " << request.url() << " fileName: " << fileName + << " meh;"; } Q_ASSERT_X(fileInfo, Q_FUNC_INFO, "Could not find file on the remote"); QMetaObject::invokeMethod(this, &FakeGetReply::respond, Qt::QueuedConnection); @@ -625,6 +670,12 @@ void FakeGetReply::respond() emit finished(); return; } + if (!fileInfo) { + setError(ContentNotFoundError, QStringLiteral("File Not Found")); + emit metaDataChanged(); + emit finished(); + return; + } payload = fileInfo->contentChar; size = fileInfo->size; setHeader(QNetworkRequest::ContentLengthHeader, size); @@ -759,7 +810,8 @@ FileInfo *FakeChunkMoveReply::perform(FileInfo &uploadsFileInfo, FileInfo &remot Q_ASSERT(!fileName.isEmpty()); // Compute the size and content from the chunks if possible - for (auto chunkName : sourceFolder->children.keys()) { + const auto childrenKeys = sourceFolder->children.keys(); + for (auto chunkName : childrenKeys) { auto &x = sourceFolder->children[chunkName]; Q_ASSERT(!x.isDir); Q_ASSERT(x.size > 0); // There should not be empty chunks @@ -967,11 +1019,13 @@ QNetworkReply *FakeQNAM::createRequest(QNetworkAccessManager::Operation op, cons newRequest.setRawHeader("X-Request-ID", OCC::AccessManager::generateRequestId()); auto contentType = request.header(QNetworkRequest::ContentTypeHeader).toString(); if (_override) { + qDebug() << "Using override!"; if (auto _reply = _override(op, newRequest, outgoingData)) { reply = _reply; } } if (!reply) { + qDebug() << newRequest.url(); reply = overrideReplyWithError(getFilePathFromUrl(newRequest.url()), op, newRequest); } if (!reply) { @@ -1120,13 +1174,13 @@ void FakeFolder::scheduleSync() void FakeFolder::execUntilBeforePropagation() { - QSignalSpy spy(_syncEngine.get(), SIGNAL(aboutToPropagate(SyncFileItemVector &))); + QSignalSpy spy(_syncEngine.get(), &OCC::SyncEngine::aboutToPropagate); QVERIFY(spy.wait()); } void FakeFolder::execUntilItemCompleted(const QString &relativePath) { - QSignalSpy spy(_syncEngine.get(), SIGNAL(itemCompleted(const SyncFileItemPtr &))); + QSignalSpy spy(_syncEngine.get(), &OCC::SyncEngine::itemCompleted); QElapsedTimer t; t.start(); while (t.elapsed() < 5000) { @@ -1143,7 +1197,7 @@ void FakeFolder::execUntilItemCompleted(const QString &relativePath) void FakeFolder::toDisk(QDir &dir, const FileInfo &templateFi) { - foreach (const FileInfo &child, templateFi.children) { + for(const auto &child : templateFi.children) { if (child.isDir) { QDir subDir(dir); dir.mkdir(child.name); @@ -1161,7 +1215,7 @@ void FakeFolder::toDisk(QDir &dir, const FileInfo &templateFi) void FakeFolder::fromDisk(QDir &dir, FileInfo &templateFi) { - foreach (const QFileInfo &diskChild, dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)) { + for(const auto &diskChild : dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)) { if (diskChild.isDir()) { QDir subDir = dir; subDir.cd(diskChild.fileName()); @@ -1176,7 +1230,7 @@ void FakeFolder::fromDisk(QDir &dir, FileInfo &templateFi) continue; } char contentChar = content.at(0); - templateFi.children.insert(diskChild.fileName(), FileInfo { diskChild.fileName(), diskChild.size(), contentChar }); + templateFi.children.insert(diskChild.fileName(), FileInfo{diskChild.fileName(), diskChild.size(), contentChar, diskChild.lastModified()}); } } } @@ -1198,7 +1252,7 @@ static FileInfo &findOrCreateDirs(FileInfo &base, PathComponents components) FileInfo FakeFolder::dbState() const { FileInfo result; - _journalDb->getFilesBelowPath("", [&](const OCC::SyncJournalFileRecord &record) { + [[maybe_unused]] const auto journalDbResult =_journalDb->getFilesBelowPath("", [&](const OCC::SyncJournalFileRecord &record) { auto components = PathComponents(record.path()); auto &parentDir = findOrCreateDirs(result, components.parentDirComponents()); auto name = components.fileName(); diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h index e44d5d9cb..7f1c3e2f6 100644 --- a/test/syncenginetestutils.h +++ b/test/syncenginetestutils.h @@ -66,16 +66,21 @@ public: PathComponents(const QString &path); PathComponents(const QStringList &pathComponents); - PathComponents parentDirComponents() const; - PathComponents subComponents() const &; + [[nodiscard]] PathComponents parentDirComponents() const; + [[nodiscard]] PathComponents subComponents() const &; PathComponents subComponents() && { removeFirst(); return std::move(*this); } - QString pathRoot() const { return first(); } - QString fileName() const { return last(); } + [[nodiscard]] QString pathRoot() const { return first(); } + [[nodiscard]] QString fileName() const { return last(); } }; class FileModifier { public: + enum class LockState { + FileLocked, + FileUnlocked, + }; + virtual ~FileModifier() = default; virtual void remove(const QString &relativePath) = 0; virtual void insert(const QString &relativePath, qint64 size = 64, char contentChar = 'W') = 0; @@ -84,6 +89,8 @@ public: virtual void mkdir(const QString &relativePath) = 0; virtual void rename(const QString &relativePath, const QString &relativeDestinationDirectory) = 0; virtual void setModTime(const QString &relativePath, const QDateTime &modTime) = 0; + virtual void modifyLockState(const QString &relativePath, LockState lockState, int lockType, const QString &lockOwner, const QString &lockOwnerId, const QString &lockEditorId, quint64 lockTime, quint64 lockTimeout) = 0; + virtual void setE2EE(const QString &relativepath, const bool enabled) = 0; }; class DiskFileModifier : public FileModifier @@ -99,6 +106,8 @@ public: void mkdir(const QString &relativePath) override; void rename(const QString &from, const QString &to) override; void setModTime(const QString &relativePath, const QDateTime &modTime) override; + void modifyLockState(const QString &relativePath, LockState lockState, int lockType, const QString &lockOwner, const QString &lockOwnerId, const QString &lockEditorId, quint64 lockTime, quint64 lockTimeout) override; + void setE2EE(const QString &relativepath, const bool enabled) override; }; class FileInfo : public FileModifier @@ -110,6 +119,7 @@ public: FileInfo(const QString &name) : name{name} { } FileInfo(const QString &name, qint64 size) : name{name}, isDir{false}, size{size} { } FileInfo(const QString &name, qint64 size, char contentChar) : name{name}, isDir{false}, size{size}, contentChar{contentChar} { } + FileInfo(const QString &name, qint64 size, char contentChar, QDateTime mtime) : name{name}, isDir{false}, lastModified(mtime), size{size}, contentChar{contentChar} { } FileInfo(const QString &name, const std::initializer_list &children); void addChild(const FileInfo &info); @@ -130,6 +140,10 @@ public: void setModTimeKeepEtag(const QString &relativePath, const QDateTime &modTime); + void modifyLockState(const QString &relativePath, LockState lockState, int lockType, const QString &lockOwner, const QString &lockOwnerId, const QString &lockEditorId, quint64 lockTime, quint64 lockTimeout) override; + + void setE2EE(const QString &relativepath, const bool enabled) override; + FileInfo *find(PathComponents pathComponents, const bool invalidateEtags = false); FileInfo *createDir(const QString &relativePath); @@ -146,8 +160,8 @@ public: return !operator==(other); } - QString path() const; - QString absolutePath() const; + [[nodiscard]] QString path() const; + [[nodiscard]] QString absolutePath() const; void fixupParentPathRecursively(); @@ -163,6 +177,14 @@ public: QByteArray extraDavProperties; qint64 size = 0; char contentChar = 'W'; + LockState lockState = LockState::FileUnlocked; + int lockType = 0; + QString lockOwner; + QString lockOwnerId; + QString lockEditorId; + quint64 lockTime = 0; + quint64 lockTimeout = 0; + bool isEncrypted = false; // Sorted by name to be able to compare trees QMap children; @@ -200,7 +222,7 @@ public: void abort() override { } - qint64 bytesAvailable() const override; + [[nodiscard]] qint64 bytesAvailable() const override; qint64 readData(char *data, qint64 maxlen) override; }; @@ -231,7 +253,7 @@ public: void abort() override; - qint64 bytesAvailable() const override; + [[nodiscard]] qint64 bytesAvailable() const override; qint64 readData(char *data, qint64 maxlen) override; private: @@ -291,7 +313,7 @@ public: Q_INVOKABLE void respond(); void abort() override; - qint64 bytesAvailable() const override; + [[nodiscard]] qint64 bytesAvailable() const override; qint64 readData(char *data, qint64 maxlen) override; }; @@ -310,7 +332,7 @@ public: Q_INVOKABLE void respond(); void abort() override; - qint64 bytesAvailable() const override; + [[nodiscard]] qint64 bytesAvailable() const override; qint64 readData(char *data, qint64 maxlen) override; }; @@ -349,7 +371,7 @@ public: void abort() override {} qint64 readData(char *buf, qint64 max) override; - qint64 bytesAvailable() const override; + [[nodiscard]] qint64 bytesAvailable() const override; QByteArray _body; QMap _additionalHeaders; @@ -377,7 +399,7 @@ public slots: public: void abort() override { } qint64 readData(char *buf, qint64 max) override; - qint64 bytesAvailable() const override; + [[nodiscard]] qint64 bytesAvailable() const override; QByteArray _body; }; @@ -474,11 +496,11 @@ class FakeCredentials : public OCC::AbstractCredentials QNetworkAccessManager *_qnam; public: FakeCredentials(QNetworkAccessManager *qnam) : _qnam{qnam} { } - QString authType() const override { return "test"; } - QString user() const override { return "admin"; } - QString password() const override { return "password"; } - QNetworkAccessManager *createQNAM() const override { return _qnam; } - bool ready() const override { return true; } + [[nodiscard]] QString authType() const override { return "test"; } + [[nodiscard]] QString user() const override { return "admin"; } + [[nodiscard]] QString password() const override { return "password"; } + [[nodiscard]] QNetworkAccessManager *createQNAM() const override { return _qnam; } + [[nodiscard]] bool ready() const override { return true; } void fetchFromKeychain() override { } void askFromUser() override { } bool stillValid(QNetworkReply *) override { return true; } @@ -502,9 +524,9 @@ public: void switchToVfs(QSharedPointer vfs); - OCC::AccountPtr account() const { return _account; } - OCC::SyncEngine &syncEngine() const { return *_syncEngine; } - OCC::SyncJournalDb &syncJournal() const { return *_journalDb; } + [[nodiscard]] OCC::AccountPtr account() const { return _account; } + [[nodiscard]] OCC::SyncEngine &syncEngine() const { return *_syncEngine; } + [[nodiscard]] OCC::SyncJournalDb &syncJournal() const { return *_journalDb; } FileModifier &localModifier() { return _localModifier; } FileInfo &remoteModifier() { return _fakeQnam->currentRemoteState(); } @@ -512,7 +534,7 @@ public: FileInfo currentRemoteState() { return _fakeQnam->currentRemoteState(); } FileInfo &uploadState() { return _fakeQnam->uploadState(); } - FileInfo dbState() const; + [[nodiscard]] FileInfo dbState() const; struct ErrorList { FakeQNAM *_qnam; @@ -528,7 +550,7 @@ public: return _fakeQnam->forEachReplyPart(outgoingData, contentType, replyFunction); } - QString localPath() const; + [[nodiscard]] QString localPath() const; void scheduleSync(); @@ -575,9 +597,9 @@ struct ItemCompletedSpy : QSignalSpy { : QSignalSpy(&folder.syncEngine(), &OCC::SyncEngine::itemCompleted) {} - OCC::SyncFileItemPtr findItem(const QString &path) const; + [[nodiscard]] OCC::SyncFileItemPtr findItem(const QString &path) const; - OCC::SyncFileItemPtr findItemWithExpectedRank(const QString &path, int rank) const; + [[nodiscard]] OCC::SyncFileItemPtr findItemWithExpectedRank(const QString &path, int rank) const; }; // QTest::toString overloads diff --git a/test/testaccount.cpp b/test/testaccount.cpp index 8b1e55812..e5122b7f3 100644 --- a/test/testaccount.cpp +++ b/test/testaccount.cpp @@ -26,7 +26,7 @@ private slots: void testAccountDavPath_unitialized_noCrash() { AccountPtr account = Account::create(); - account->davPath(); + [[maybe_unused]] const auto davPath = account->davPath(); } }; diff --git a/test/testactivitydata.cpp b/test/testactivitydata.cpp index 28def5329..a4760c803 100644 --- a/test/testactivitydata.cpp +++ b/test/testactivitydata.cpp @@ -23,6 +23,17 @@ #include "testhelper.h" #include +#include + +namespace { + constexpr auto events = 3; + constexpr auto eventC = "event"; + constexpr auto calendarC = "calendar"; + constexpr auto nameC = "name"; + constexpr auto linkC = "link"; + constexpr auto typeC = "type"; + constexpr auto idC = "id"; +}; class TestActivityData : public QObject { @@ -31,7 +42,7 @@ class TestActivityData : public QObject public: TestActivityData() = default; - void createJsonSpecificFormatData(QString fileFormat, QString mimeType) + void createFilesActivityJsonData(QString fileFormat, QString mimeType) { const auto objectType = QStringLiteral("files"); const auto subject = QStringLiteral("You created path/test.").append(fileFormat); @@ -46,10 +57,10 @@ public: const auto icon = account->url().toString().append(QStringLiteral("/apps/files/img/add-color.svg")); const QJsonObject richStringData({ - {QStringLiteral("type"), activityType}, - {QStringLiteral("id"), activityId}, - {QStringLiteral("link"), link}, - {QStringLiteral("name"), fileName}, + {typeC, activityType}, + {idC, activityId}, + {linkC, link}, + {nameC, fileName}, {QStringLiteral("path"), objectName} }); @@ -61,7 +72,7 @@ public: // Text file previews should be replaced by mimetype icon const QJsonObject previewData({ - {QStringLiteral("link"), link}, + {linkC, link}, {QStringLiteral("mimeType"), mimeType}, {QStringLiteral("fileId"), activityId}, {QStringLiteral("filename"), fileName}, @@ -73,11 +84,11 @@ public: QJsonObject testData({ {QStringLiteral("object_type"), objectType}, {QStringLiteral("activity_id"), activityId}, - {QStringLiteral("type"), activityType}, + {typeC, activityType}, {QStringLiteral("subject"), subject}, {QStringLiteral("message"), message}, {QStringLiteral("object_name"), objectName}, - {QStringLiteral("link"), link}, + {linkC, link}, {QStringLiteral("datetime"), datetime}, {QStringLiteral("icon"), icon}, {QStringLiteral("subject_rich"), subjectRichData}, @@ -87,6 +98,107 @@ public: QTest::addRow("data") << testData << fileFormat << mimeType << objectType << subject << path << fileName << activityType << activityId << message << objectName << link << datetime << icon << subjectRichString << subjectRichData << previewUrl; } + void createCalendarActivityJsonData(QString name, QString event, QString calendar) + { + const auto objectType = calendarC; + const auto subject = QStringLiteral("%1 updated event %2 in calendar %3").arg(name, event, calendar); + const auto activityType = QStringLiteral("calendar_event"); + const auto activityId = 10000; + const auto datetime = QDateTime::currentDateTime().toString(Qt::ISODate); + const auto icon = account->url().toString().append(QStringLiteral("/core/img/places/calendar.svg")); + const auto eventLink = QStringLiteral("/apps/calendar/dayGridMonth/now/edit/sidebar/A12bcD12AbcDEFgH456/next"); + + const auto subjectRichString = QStringLiteral("{actor} updated event {event} in calendar {calendar}"); + const QJsonArray subjectRichData({ + subjectRichString, + {{ + {objectType, {{ + {typeC, objectType}, + {idC, QStringLiteral()}, + {linkC, QStringLiteral()}, + {nameC, calendar}, + }}}, + {eventC, {{ + {typeC, QStringLiteral("calendar-event")}, + {idC, QStringLiteral("12AA3456-A1B2-A1B2-A1B2-AB12C34567D8")}, + {linkC, account->url().toString().append(eventLink)}, + {nameC, event}, + }}}, + {QStringLiteral("actor"), {{ + {typeC, QStringLiteral("user")}, + {idC, QStringLiteral("username")}, + {linkC, QStringLiteral()}, + {nameC, name}, + }}}, + }}, + }); + + QJsonObject testData({ + {QStringLiteral("object_type"), objectType}, + {QStringLiteral("subject"), subject}, + {typeC, activityType}, + {QStringLiteral("activity_id"), activityId}, + {QStringLiteral("object_name"), QStringLiteral()}, + {QStringLiteral("datetime"), datetime}, + {QStringLiteral("icon"), icon}, + {QStringLiteral("subject_rich"), subjectRichData}, + }); + + QTest::addRow("data") << testData << QStringLiteral() << QStringLiteral() << objectType << subject << QStringLiteral() << QStringLiteral() << activityType << activityId << QStringLiteral() << QStringLiteral() << QStringLiteral() << datetime << icon << subjectRichString << subjectRichData << QStringLiteral(); + } + + // We always "use" event. What you are observing comes from the event merging, e.g. if a user creates two events, + // there will be only 1 activity entry saying "X created event A and B", but the mechanism is incremental and + // when you only modified the same entry twice, you get "X updated event A" with A being event1 instead of event. + void createCalendarEventMergedActivityJsonData(QString name, QString event, QString calendar, int mergedEvent) + { + const auto objectType = calendarC; + const auto subject = QStringLiteral("%1 updated event %2 in calendar %3").arg(name, event, calendar); + const auto activityType = QStringLiteral("calendar_event"); + const auto activityId = 10000; + const auto datetime = QDateTime::currentDateTime().toString(Qt::ISODate); + const auto icon = account->url().toString().append(QStringLiteral("/core/img/places/calendar.svg")); + const auto eventLink = QStringLiteral("/apps/calendar/dayGridMonth/now/edit/sidebar/A12bcD12AbcDEFgH456/next"); + + const auto subjectRichString = QStringLiteral("{actor} updated event {event%1} in calendar {calendar}").arg(mergedEvent); + const QJsonArray subjectRichData({ + subjectRichString, + {{ + {objectType, {{ + {typeC, objectType}, + {idC, QStringLiteral()}, + {linkC, QStringLiteral()}, + {nameC, calendar}, + }}}, + {QStringLiteral("event%1").arg(mergedEvent), {{ + {typeC, QStringLiteral("calendar-event")}, + {idC, QStringLiteral("12AA3456-A1B2-A1B2-A1B2-AB12C34567D8")}, + {linkC, account->url().toString().append(eventLink)}, + {nameC, event}, + }}}, + {QStringLiteral("actor"), {{ + {typeC, QStringLiteral("user")}, + {idC, QStringLiteral("username")}, + {linkC, QStringLiteral()}, + {nameC, name}, + }}}, + }}, + }); + + QJsonObject testData({ + {QStringLiteral("object_type"), objectType}, + {QStringLiteral("subject"), subject}, + {typeC, activityType}, + {QStringLiteral("activity_id"), activityId}, + {QStringLiteral("object_name"), QStringLiteral()}, + {QStringLiteral("datetime"), datetime}, + {QStringLiteral("icon"), icon}, + {QStringLiteral("subject_rich"), subjectRichData}, + }); + + QTest::addRow("data") << testData << QStringLiteral() << QStringLiteral() << objectType << subject << QStringLiteral() << QStringLiteral() << activityType << activityId << QStringLiteral() << QStringLiteral() << QStringLiteral() << datetime << icon << subjectRichString << subjectRichData << QStringLiteral(); + } + QScopedPointer fakeQnam; OCC::AccountPtr account; @@ -120,9 +232,15 @@ private slots: QTest::addColumn("subjectRichDataExpected"); QTest::addColumn("previewUrlExpected"); - createJsonSpecificFormatData(QStringLiteral("jpg"), QStringLiteral("image/jpg")); - createJsonSpecificFormatData(QStringLiteral("txt"), QStringLiteral("text/plain")); - createJsonSpecificFormatData(QStringLiteral("pdf"), QStringLiteral("application/pdf")); + createFilesActivityJsonData(QStringLiteral("jpg"), QStringLiteral("image/jpg")); + createFilesActivityJsonData(QStringLiteral("txt"), QStringLiteral("text/plain")); + createFilesActivityJsonData(QStringLiteral("pdf"), QStringLiteral("application/pdf")); + createCalendarActivityJsonData(account->displayName(), QStringLiteral("Event 1"), QStringLiteral("Calendar 1")); + createCalendarActivityJsonData(account->displayName(), QStringLiteral("Event 2"), QStringLiteral("Calendar 2")); + + for (int i = 1; i <= events; i++) { + createCalendarEventMergedActivityJsonData(account->displayName(), QStringLiteral("Event"), QStringLiteral("Calendar"), i); + } } void testFromJson() @@ -154,29 +272,58 @@ private slots: QCOMPARE(activity._subject, subjectExpected); QCOMPARE(activity._message, messageExpected); QCOMPARE(activity._file, objectNameExpected); - QCOMPARE(activity._link, linkExpected); QCOMPARE(activity._dateTime, QDateTime::fromString(datetimeExpected, Qt::ISODate)); + QCOMPARE(activity._objectName, objectNameExpected); + + const auto richParams = activity._subjectRichParameters; + + if (objectTypeExpected != calendarC) { + QCOMPARE(activity._link, linkExpected); + + QCOMPARE(richParams.count(), 1); + QCOMPARE(activity._subjectDisplay, QStringLiteral("You created ").append(fileNameExpected)); - QCOMPARE(activity._subjectRichParameters.count(), 1); - QCOMPARE(activity._subjectDisplay, QStringLiteral("You created ").append(fileNameExpected)); + const auto previews = activity._previews; - QCOMPARE(activity._previews.count(), 1); - // We want the different icon when we have a preview - //QCOMPARE(activity._icon, iconExpected); + QCOMPARE(previews.count(), 1); - if(fileFormat == "txt") { - QCOMPARE(activity._previews[0]._source, account->url().toString().append(QStringLiteral("/index.php/apps/theming/img/core/filetypes/text.svg"))); - QCOMPARE(activity._previews[0]._isMimeTypeIcon, true); - QCOMPARE(activity._previews[0]._mimeType, mimeTypeExpected); - } else if(fileFormat == "pdf") { - QCOMPARE(activity._previews[0]._source, account->url().toString().append(QStringLiteral("/index.php/apps/theming/img/core/filetypes/application-pdf.svg"))); - QCOMPARE(activity._previews[0]._isMimeTypeIcon, true); + auto icon = account->url().toString().append("/index.php/apps/theming/img/core/filetypes/%1.svg"); + const auto isMimeTypeIcon = true; + + if(fileFormat == "txt") { + QCOMPARE(previews[0]._source, icon.arg("text")); + QCOMPARE(previews[0]._isMimeTypeIcon, isMimeTypeIcon); + } else if(fileFormat == "pdf") { + QCOMPARE(previews[0]._source, icon.arg("application-pdf")); + QCOMPARE(previews[0]._isMimeTypeIcon, isMimeTypeIcon); + } else { + QCOMPARE(previews[0]._source, previewUrlExpected); + QCOMPARE(previews[0]._isMimeTypeIcon, !isMimeTypeIcon); + } + + QCOMPARE(previews[0]._mimeType, mimeTypeExpected); } else { - QCOMPARE(activity._previews[0]._source, previewUrlExpected); - QCOMPARE(activity._previews[0]._isMimeTypeIcon, false); - } + QCOMPARE(richParams.count(), 3); + QCOMPARE(subjectRichDataExpected.count(), 2); - QCOMPARE(activity._previews[0]._mimeType, mimeTypeExpected); + QString eventName; + QUrl eventLink; + auto expectedParams = subjectRichDataExpected[1].toObject(); + for (auto i = expectedParams.begin(); i != expectedParams.end(); ++i) { + if (i.key().startsWith(eventC)) { + const auto expectedJsonObject = i.value().toObject(); + eventName = expectedJsonObject.value(nameC).toString(); + eventLink = expectedJsonObject.value(linkC).toString(); + break; + } + } + + QCOMPARE(activity._link, eventLink); + QCOMPARE(activity._subjectDisplay, QStringLiteral("%1 updated event %2 in calendar %3").arg(account->displayName(), + eventName, + richParams[calendarC].name)); + QCOMPARE(activity._icon, iconExpected); + } } }; diff --git a/test/testactivitylistmodel.cpp b/test/testactivitylistmodel.cpp index 9f5d366f1..fb72bce00 100644 --- a/test/testactivitylistmodel.cpp +++ b/test/testactivitylistmodel.cpp @@ -315,7 +315,7 @@ public: return {}; } - int startingIdLast() const { return _startingId; } + [[nodiscard]] int startingIdLast() const { return _startingId; } private: static FakeRemoteActivityStorage *_instance; @@ -346,6 +346,7 @@ public: params.addQueryItem(QLatin1String("limit"), QString::number(50)); job->addQueryParams(params); + setAndRefreshCurrentlyFetching(true); job->start(); } @@ -376,6 +377,7 @@ public slots: setFinalList(finalListCopy); } _numRowsPrev = rowCount(); + setAndRefreshCurrentlyFetching(false); emit activitiesProcessed(); } signals: @@ -391,7 +393,8 @@ class TestActivityListModel : public QObject public: TestActivityListModel() = default; - ~TestActivityListModel() override { + ~TestActivityListModel() override + { OCC::AccountManager::instance()->deleteAccount(accountState.data()); } @@ -400,9 +403,31 @@ public: QScopedPointer accountState; OCC::Activity testNotificationActivity; + OCC::Activity testSyncResultErrorActivity; + OCC::Activity testSyncFileItemActivity; + OCC::Activity testFileIgnoredActivity; static constexpr int searchResultsReplyDelay = 100; + QSharedPointer testingALM() { + QSharedPointer model(new TestingALM); + model->setAccountState(accountState.data()); + QAbstractItemModelTester modelTester(model.data()); + + return model; + } + + void testActivityAdd(void(OCC::ActivityListModel::*addingMethod)(const OCC::Activity&), OCC::Activity &activity) { + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); + + (model.data()->*addingMethod)(activity); + QCOMPARE(model->rowCount(), 1); + + const auto index = model->index(0, 0); + QVERIFY(index.isValid()); + } + private slots: void initTestCase() { @@ -449,170 +474,137 @@ private slots: testNotificationActivity._id = 1; testNotificationActivity._type = OCC::Activity::NotificationType; testNotificationActivity._dateTime = QDateTime::currentDateTime(); + testNotificationActivity._subject = QStringLiteral("Sample notification text"); + + testSyncResultErrorActivity._id = 2; + testSyncResultErrorActivity._type = OCC::Activity::SyncResultType; + testSyncResultErrorActivity._syncResultStatus = OCC::SyncResult::Error; + testSyncResultErrorActivity._dateTime = QDateTime::currentDateTime(); + testSyncResultErrorActivity._subject = QStringLiteral("Sample failed sync text"); + testSyncResultErrorActivity._message = QStringLiteral("/path/to/thingy"); + testSyncResultErrorActivity._link = QStringLiteral("/path/to/thingy"); + testSyncResultErrorActivity._accName = accountState->account()->displayName(); + + testSyncFileItemActivity._id = 3; + testSyncFileItemActivity._type = OCC::Activity::SyncFileItemType; //client activity + testSyncFileItemActivity._syncFileItemStatus = OCC::SyncFileItem::Success; + testSyncFileItemActivity._dateTime = QDateTime::currentDateTime(); + testSyncFileItemActivity._message = QStringLiteral("Sample file successfully synced text"); + testSyncFileItemActivity._link = accountState->account()->url(); + testSyncFileItemActivity._accName = accountState->account()->displayName(); + testSyncFileItemActivity._file = QStringLiteral("xyz.pdf"); + + testFileIgnoredActivity._id = 4; + testFileIgnoredActivity._type = OCC::Activity::SyncFileItemType; + testFileIgnoredActivity._syncFileItemStatus = OCC::SyncFileItem::FileIgnored; + testFileIgnoredActivity._dateTime = QDateTime::currentDateTime(); + testFileIgnoredActivity._subject = QStringLiteral("Sample ignored file sync text"); + testFileIgnoredActivity._link = accountState->account()->url(); + testFileIgnoredActivity._accName = accountState->account()->displayName(); + testFileIgnoredActivity._folder = QStringLiteral("thingy"); + testFileIgnoredActivity._file = QStringLiteral("test.txt"); }; // Test receiving activity from server void testFetchingRemoteActivity() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); - QCOMPARE(model.rowCount(), 0); - - model.setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); - model.startFetchJob(); - QSignalSpy activitiesJob(&model, &TestingALM::activitiesProcessed); + model->setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); + model->startFetchJob(); + QSignalSpy activitiesJob(model.data(), &TestingALM::activitiesProcessed); QVERIFY(activitiesJob.wait(3000)); - QCOMPARE(model.rowCount(), 50); + QCOMPARE(model->rowCount(), 50); }; // Test receiving activity from local user action void testLocalSyncFileAction() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); - - QCOMPARE(model.rowCount(), 0); - - OCC::Activity activity; - - model.addSyncFileItemToActivityList(activity); - QCOMPARE(model.rowCount(), 1); - - const auto index = model.index(0, 0); - QVERIFY(index.isValid()); + testActivityAdd(&TestingALM::addSyncFileItemToActivityList, testSyncFileItemActivity); }; void testAddNotification() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); - - QCOMPARE(model.rowCount(), 0); - - model.addNotificationToActivityList(testNotificationActivity); - QCOMPARE(model.rowCount(), 1); - - const auto index = model.index(0, 0); - QVERIFY(index.isValid()); + testActivityAdd(&TestingALM::addNotificationToActivityList, testNotificationActivity); }; void testAddError() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); - - QCOMPARE(model.rowCount(), 0); - - OCC::Activity activity; - - model.addErrorToActivityList(activity); - QCOMPARE(model.rowCount(), 1); - - const auto index = model.index(0, 0); - QVERIFY(index.isValid()); + testActivityAdd(&TestingALM::addErrorToActivityList, testSyncResultErrorActivity); }; void testAddIgnoredFile() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); - - QCOMPARE(model.rowCount(), 0); - - OCC::Activity activity; - activity._folder = QStringLiteral("thingy"); - activity._file = QStringLiteral("test.txt"); - - model.addIgnoredFileToList(activity); - // We need to add another activity to the model for the combineActivityLists method to be called - model.addNotificationToActivityList(testNotificationActivity); - QCOMPARE(model.rowCount(), 2); - - const auto index = model.index(0, 0); - QVERIFY(index.isValid()); + testActivityAdd(&TestingALM::addIgnoredFileToList, testFileIgnoredActivity); }; // Test removing activity from list void testRemoveActivityWithRow() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); - - QCOMPARE(model.rowCount(), 0); + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); - model.addNotificationToActivityList(testNotificationActivity); - QCOMPARE(model.rowCount(), 1); + model->addNotificationToActivityList(testNotificationActivity); + QCOMPARE(model->rowCount(), 1); - model.removeActivityFromActivityList(0); - QCOMPARE(model.rowCount(), 0); + model->removeActivityFromActivityList(0); + QCOMPARE(model->rowCount(), 0); } void testRemoveActivityWithActivity() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); - QCOMPARE(model.rowCount(), 0); + model->addNotificationToActivityList(testNotificationActivity); + QCOMPARE(model->rowCount(), 1); + + model->removeActivityFromActivityList(testNotificationActivity); + QCOMPARE(model->rowCount(), 0); + } - model.addNotificationToActivityList(testNotificationActivity); - QCOMPARE(model.rowCount(), 1); + void testDummyFetchingActivitiesActivity() { + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); - model.removeActivityFromActivityList(testNotificationActivity); - QCOMPARE(model.rowCount(), 0); + model->setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); + model->startFetchJob(); + + // Check for the dummy before activities have arrived + QCOMPARE(model->rowCount(), 1); + + QSignalSpy activitiesJob(model.data(), &TestingALM::activitiesProcessed); + QVERIFY(activitiesJob.wait(3000)); + // Test the dummy was removed + QCOMPARE(model->rowCount(), 50); } // Test getting the data from the model void testData() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); - QCOMPARE(model.rowCount(), 0); - - model.setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); - model.startFetchJob(); - QSignalSpy activitiesJob(&model, &TestingALM::activitiesProcessed); + model->setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); + model->startFetchJob(); + QSignalSpy activitiesJob(model.data(), &TestingALM::activitiesProcessed); QVERIFY(activitiesJob.wait(3000)); - QCOMPARE(model.rowCount(), 50); - - model.addNotificationToActivityList(testNotificationActivity); - QCOMPARE(model.rowCount(), 51); - - OCC::Activity syncResultActivity; - syncResultActivity._id = 2; - syncResultActivity._type = OCC::Activity::SyncResultType; - syncResultActivity._status = OCC::SyncResult::Error; - syncResultActivity._dateTime = QDateTime::currentDateTime(); - syncResultActivity._subject = QStringLiteral("Sample failed sync text"); - syncResultActivity._message = QStringLiteral("/path/to/thingy"); - syncResultActivity._link = QStringLiteral("/path/to/thingy"); - syncResultActivity._accName = accountState->account()->displayName(); - model.addSyncFileItemToActivityList(syncResultActivity); - QCOMPARE(model.rowCount(), 52); - - OCC::Activity syncFileItemActivity; - syncFileItemActivity._id = 3; - syncFileItemActivity._type = OCC::Activity::SyncFileItemType; //client activity - syncFileItemActivity._status = OCC::SyncFileItem::Success; - syncFileItemActivity._dateTime = QDateTime::currentDateTime(); - syncFileItemActivity._message = QStringLiteral("You created xyz.pdf"); - syncFileItemActivity._link = accountState->account()->url(); - syncFileItemActivity._accName = accountState->account()->displayName(); - syncFileItemActivity._file = QStringLiteral("xyz.pdf"); - syncFileItemActivity._fileAction = ""; - model.addSyncFileItemToActivityList(syncFileItemActivity); - QCOMPARE(model.rowCount(), 53); + QCOMPARE(model->rowCount(), 50); + + model->addSyncFileItemToActivityList(testSyncFileItemActivity); + QCOMPARE(model->rowCount(), 51); + + model->addErrorToActivityList(testSyncResultErrorActivity); + QCOMPARE(model->rowCount(), 52); + + model->addIgnoredFileToList(testFileIgnoredActivity); + QCOMPARE(model->rowCount(), 53); + + model->addNotificationToActivityList(testNotificationActivity); + QCOMPARE(model->rowCount(), 54); // Test all rows for things in common - for (int i = 0; i < model.rowCount(); i++) { - const auto index = model.index(i, 0); + for (int i = 0; i < model->rowCount(); i++) { + const auto index = model->index(i, 0); auto text = index.data(OCC::ActivityListModel::ActionTextRole).toString(); QVERIFY(index.data(OCC::ActivityListModel::ActionRole).canConvert()); const auto type = index.data(OCC::ActivityListModel::ActionRole).toInt(); - QVERIFY(type >= OCC::Activity::ActivityType); + QVERIFY(type >= OCC::Activity::DummyFetchingActivityType); QVERIFY(!index.data(OCC::ActivityListModel::AccountRole).toString().isEmpty()); QVERIFY(!index.data(OCC::ActivityListModel::ActionTextColorRole).toString().isEmpty()); @@ -634,31 +626,30 @@ private slots: QVERIFY(index.data(OCC::ActivityListModel::TalkNotificationMessageIdRole).canConvert()); QVERIFY(index.data(OCC::ActivityListModel::TalkNotificationMessageSentRole).canConvert()); + QVERIFY(index.data(OCC::ActivityListModel::ActivityRole).canConvert()); + // Unfortunately, trying to check anything relating to filepaths causes a crash // when the folder manager is invoked by the model to look for the relevant file } }; - void tesActivityActionstData() + void testActivityActionsData() { - TestingALM model; - model.setAccountState(accountState.data()); - QAbstractItemModelTester modelTester(&model); - - QCOMPARE(model.rowCount(), 0); - model.setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); + const auto model = testingALM(); + QCOMPARE(model->rowCount(), 0); + model->setCurrentItem(FakeRemoteActivityStorage::instance()->startingIdLast()); - int prevModelRowCount = model.rowCount(); + int prevModelRowCount = model->rowCount(); do { - prevModelRowCount = model.rowCount(); - model.startFetchJob(); - QSignalSpy activitiesJob(&model, &TestingALM::activitiesProcessed); + prevModelRowCount = model->rowCount(); + model->startFetchJob(); + QSignalSpy activitiesJob(model.data(), &TestingALM::activitiesProcessed); QVERIFY(activitiesJob.wait(3000)); - for (int i = prevModelRowCount; i < model.rowCount(); i++) { - const auto index = model.index(i, 0); + for (int i = prevModelRowCount; i < model->rowCount(); i++) { + const auto index = model->index(i, 0); const auto actionsLinks = index.data(OCC::ActivityListModel::ActionsLinksRole).toList(); if (!actionsLinks.isEmpty()) { @@ -724,7 +715,7 @@ private slots: } } - } while (prevModelRowCount < model.rowCount()); + } while (prevModelRowCount < model->rowCount()); }; }; diff --git a/test/testallfilesdeleted.cpp b/test/testallfilesdeleted.cpp index c881b6914..e3e3de50c 100644 --- a/test/testallfilesdeleted.cpp +++ b/test/testallfilesdeleted.cpp @@ -70,8 +70,10 @@ private slots: }); auto &modifier = deleteOnRemote ? fakeFolder.remoteModifier() : fakeFolder.localModifier(); - for (const auto &s : fakeFolder.currentRemoteState().children.keys()) - modifier.remove(s); + const auto childrenKeys = fakeFolder.currentRemoteState().children.keys(); + for (const auto &key : childrenKeys) { + modifier.remove(key); + } QVERIFY(!fakeFolder.syncOnce()); // Should fail because we cancel the sync QCOMPARE(aboutToRemoveAllFilesCalled, 1); @@ -110,8 +112,10 @@ private slots: }); auto &modifier = deleteOnRemote ? fakeFolder.remoteModifier() : fakeFolder.localModifier(); - for (const auto &s : fakeFolder.currentRemoteState().children.keys()) - modifier.remove(s); + const auto childrenKeys = fakeFolder.currentRemoteState().children.keys(); + for (const auto &key : childrenKeys) { + modifier.remove(key); + } QVERIFY(fakeFolder.syncOnce()); // Should succeed, and all files must then be deleted @@ -139,8 +143,10 @@ private slots: [&] { QVERIFY(false); }); QVERIFY(fakeFolder.syncOnce()); - for (const auto &s : fakeFolder.currentRemoteState().children.keys()) + const auto childrenKeys = fakeFolder.currentRemoteState().children.keys(); + for (const auto &s : childrenKeys) { fakeFolder.syncJournal().avoidRenamesOnNextSync(s); // clears all the fileid and inodes. + } fakeFolder.localModifier().remove("A/a1"); auto expectedState = fakeFolder.currentLocalState(); QVERIFY(fakeFolder.syncOnce()); diff --git a/test/testasyncop.cpp b/test/testasyncop.cpp index 22b5c57f9..2f05bd193 100644 --- a/test/testasyncop.cpp +++ b/test/testasyncop.cpp @@ -177,7 +177,7 @@ private slots: return waitAndChain(waitForeverCallback)(tc, request); }))); - fakeFolder.syncJournal().wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncJournal().wipeErrorBlacklist() != -1); // This second sync will redo the files that had errors // But the waiting folder will not complete before it is aborted. diff --git a/test/testblacklist.cpp b/test/testblacklist.cpp index d71326560..f236947ec 100644 --- a/test/testblacklist.cpp +++ b/test/testblacklist.cpp @@ -14,7 +14,7 @@ using namespace OCC; SyncJournalFileRecord journalRecord(FakeFolder &folder, const QByteArray &path) { SyncJournalFileRecord rec; - folder.syncJournal().getFileRecord(path, &rec); + [[maybe_unused]] const auto result = folder.syncJournal().getFileRecord(path, &rec); return rec; } diff --git a/test/testcfapishellextensionsipc.cpp b/test/testcfapishellextensionsipc.cpp index 6f1e5ba68..f33a41327 100644 --- a/test/testcfapishellextensionsipc.cpp +++ b/test/testcfapishellextensionsipc.cpp @@ -5,22 +5,34 @@ * */ -#include -#include -#include -#include "syncenginetestutils.h" +#include "configfile.h" +#include "account.h" +#include "accountstate.h" +#include "accountmanager.h" #include "common/vfs.h" #include "common/shellextensionutils.h" #include "config.h" -#include - #include "folderman.h" -#include "account.h" -#include "accountstate.h" -#include "accountmanager.h" +#include "libsync/vfs/cfapi/shellext/configvfscfapishellext.h" +#include "ocssharejob.h" +#include "shellextensionsserver.h" +#include "syncengine.h" +#include "syncenginetestutils.h" #include "testhelper.h" +#include "vfs/cfapi/shellext/customstateprovideripc.h" #include "vfs/cfapi/shellext/thumbnailprovideripc.h" -#include "shellextensionsserver.h" + +#include +#include +#include +#include + +namespace { +static constexpr auto roootFolderName = "A"; +static constexpr auto imagesFolderName = "photos"; +static constexpr auto filesFolderName = "files"; +static constexpr auto shellExtensionServerOverrideIntervalMs = 1000LL * 2LL; +} using namespace OCC; @@ -38,21 +50,45 @@ class TestCfApiShellExtensionsIPC : public QObject QScopedPointer _shellExtensionsServer; - QStringList dummmyImageNames = { - "A/photos/imageJpg.jpg", - "A/photos/imagePng.png", - "A/photos/imagePng.bmp", + const QStringList dummmyImageNames = { + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(imagesFolderName) + QLatin1Char('/') + QStringLiteral("imageJpg.jpg")) }, + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(imagesFolderName) + QLatin1Char('/') + QStringLiteral("imagePng.png")) }, + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(imagesFolderName) + QLatin1Char('/') + QStringLiteral("imagePng.bmp")) } }; QMap dummyImages; QString currentImage; + struct FileStates + { + bool _isShared = false; + bool _isLocked = false; + }; + + const QMap dummyFileStates = { + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(filesFolderName) + QLatin1Char('/') + QStringLiteral("test_locked_file.txt")), { false, true } }, + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(filesFolderName) + QLatin1Char('/') + QStringLiteral("test_shared_file.txt")), { true, false } }, + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(filesFolderName) + QLatin1Char('/') + QStringLiteral("test_shared_and_locked_file.txt")), { true, true }}, + { QString(QString(roootFolderName) + QLatin1Char('/') + QString(filesFolderName) + QLatin1Char('/') + QStringLiteral("test_non_shared_and_non_locked_file.txt")), { false, false }} + }; + +public: + static bool replyWithNoShares; + +signals: + void propfindRequested(); + private slots: void initTestCase() { + QTemporaryDir dir; + ConfigFile::setConfDir(dir.path()); + VfsShellExtensions::ThumbnailProviderIpc::overrideServerName = VfsShellExtensions::serverNameForApplicationNameDefault(); + VfsShellExtensions::CustomStateProviderIpc::overrideServerName = VfsShellExtensions::serverNameForApplicationNameDefault(); _shellExtensionsServer.reset(new ShellExtensionsServer); + _shellExtensionsServer->setIsSharedInvalidationInterval(shellExtensionServerOverrideIntervalMs); for (const auto &dummyImageName : dummmyImageNames) { const auto extension = dummyImageName.split(".").last(); @@ -68,6 +104,16 @@ private slots: dummyImages.insert(dummyImageName, byteArray); } + fakeFolder.remoteModifier().mkdir(roootFolderName); + + fakeFolder.remoteModifier().mkdir(QString(roootFolderName) + QLatin1Char('/') + QString(filesFolderName)); + + fakeFolder.remoteModifier().mkdir(QString(roootFolderName) + QLatin1Char('/') + QString(imagesFolderName)); + + for (const auto &fileStateKey : dummyFileStates.keys()) { + fakeFolder.remoteModifier().insert(fileStateKey, 256); + } + fakeQnam.reset(new FakeQNAM({})); account = OCC::Account::create(); account->setCredentials(new FakeCredentials{fakeQnam.data()}); @@ -86,31 +132,40 @@ private slots: Q_UNUSED(device); QNetworkReply *reply = nullptr; - const auto urlQuery = QUrlQuery(req.url()); - const auto fileId = urlQuery.queryItemValue(QStringLiteral("fileId")); - const auto x = urlQuery.queryItemValue(QStringLiteral("x")).toInt(); - const auto y = urlQuery.queryItemValue(QStringLiteral("y")).toInt(); const auto path = req.url().path(); - if (fileId.isEmpty() || x <= 0 || y <= 0) { - reply = new FakePayloadReply(op, req, {}, nullptr); - } else { - const auto foundImageIt = dummyImages.find(currentImage); + const auto customOperation = req.attribute(QNetworkRequest::CustomVerbAttribute); - QByteArray byteArray; - if (foundImageIt != dummyImages.end()) { - byteArray = foundImageIt.value(); + if (customOperation == QStringLiteral("PROPFIND")) { + emit propfindRequested(); + reply = new FakePayloadReply(op, req, {}, nullptr); + } else if (path.endsWith(ShellExtensionsServer::getFetchThumbnailPath())) { + const auto urlQuery = QUrlQuery(req.url()); + const auto fileId = urlQuery.queryItemValue(QStringLiteral("fileId")); + const auto x = urlQuery.queryItemValue(QStringLiteral("x")).toInt(); + const auto y = urlQuery.queryItemValue(QStringLiteral("y")).toInt(); + if (fileId.isEmpty() || x <= 0 || y <= 0) { + reply = new FakePayloadReply(op, req, {}, nullptr); + } else { + const auto foundImageIt = dummyImages.find(currentImage); + + QByteArray byteArray; + if (foundImageIt != dummyImages.end()) { + byteArray = foundImageIt.value(); + } + + currentImage.clear(); + + auto fakePayloadReply = new FakePayloadReply(op, req, byteArray, nullptr); + + QMap additionalHeaders = { + {QNetworkRequest::KnownHeaders::ContentTypeHeader, "image/jpeg"}}; + fakePayloadReply->_additionalHeaders = additionalHeaders; + + reply = fakePayloadReply; } - - currentImage.clear(); - - auto fakePayloadReply = new FakePayloadReply(op, req, byteArray, nullptr); - - QMap additionalHeaders = { - {QNetworkRequest::KnownHeaders::ContentTypeHeader, "image/jpeg"}}; - fakePayloadReply->_additionalHeaders = additionalHeaders; - - reply = fakePayloadReply; + } else { + reply = new FakePayloadReply(op, req, {}, nullptr); } return reply; @@ -119,6 +174,9 @@ private slots: void testRequestThumbnails() { + QTemporaryDir dir; + ConfigFile::setConfDir(dir.path()); + FolderMan *folderman = FolderMan::instance(); QVERIFY(folderman); auto folder = FolderMan::instance()->folderForPath(fakeFolder.localPath()); @@ -126,6 +184,7 @@ private slots: folder->setVirtualFilesEnabled(true); + QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); ItemCompletedSpy completeSpy(fakeFolder); @@ -135,8 +194,6 @@ private slots: cleanup(); // Create a virtual file for remote files - fakeFolder.remoteModifier().mkdir("A"); - fakeFolder.remoteModifier().mkdir("A/photos"); for (const auto &dummyImageName : dummmyImageNames) { fakeFolder.remoteModifier().insert(dummyImageName, 256); } @@ -150,7 +207,7 @@ private slots: QVERIFY(realFolder); for (const auto &dummyImageName : dummmyImageNames) { if (fakeFolder.syncJournal().getFileRecord(dummyImageName, &record)) { - realFolder->journalDb()->setFileRecord(record); + QVERIFY(realFolder->journalDb()->setFileRecord(record)); } } @@ -198,8 +255,138 @@ private slots: QVERIFY(thumbnailReplyData.isEmpty()); } + void testRequestCustomStates() + { + QTemporaryDir dir; + ConfigFile::setConfDir(dir.path()); + + FolderMan *folderman = FolderMan::instance(); + QVERIFY(folderman); + auto folder = FolderMan::instance()->folderForPath(fakeFolder.localPath()); + QVERIFY(folder); + + folder->setVirtualFilesEnabled(true); + + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + // just add records from fake folder's journal to real one's to make test work + SyncJournalFileRecord record; + auto realFolder = FolderMan::instance()->folderForPath(fakeFolder.localPath()); + QVERIFY(realFolder); + for (auto it = std::begin(dummyFileStates); it != std::end(dummyFileStates); ++it) { + if (fakeFolder.syncJournal().getFileRecord(it.key(), &record)) { + record._isShared = it.value()._isShared; + if (record._isShared) { + record._remotePerm.setPermission(OCC::RemotePermissions::Permissions::IsShared); + } + record._lockstate._locked = it.value()._isLocked; + if (record._lockstate._locked) { + record._lockstate._lockOwnerId = "admin@example.cloud.com"; + record._lockstate._lockOwnerDisplayName = "Admin"; + record._lockstate._lockOwnerType = static_cast(SyncFileItem::LockOwnerType::UserLock); + record._lockstate._lockTime = QDateTime::currentMSecsSinceEpoch(); + record._lockstate._lockTimeout = 1000 * 60 * 60; + } + QVERIFY(fakeFolder.syncJournal().setFileRecord(record)); + QVERIFY(realFolder->journalDb()->setFileRecord(record)); + } + } + + QSignalSpy propfindRequestedSpy(this, &TestCfApiShellExtensionsIPC::propfindRequested); + + // #1 Test every file's states fetching. Everything must succeed. + for (auto it = std::cbegin(dummyFileStates); it != std::cend(dummyFileStates); ++it) { + QEventLoop loop; + QVariantList customStates; + std::thread t([&] { + VfsShellExtensions::CustomStateProviderIpc customStateProviderIpc; + customStates = customStateProviderIpc.fetchCustomStatesForFile(fakeFolder.localPath() + it.key()); + QMetaObject::invokeMethod(&loop, &QEventLoop::quit, Qt::QueuedConnection); + }); + loop.exec(); + t.detach(); + + if (!customStates.isEmpty()) { + const auto lockedIndex = QString(CUSTOM_STATE_ICON_LOCKED_INDEX).toInt() - QString(CUSTOM_STATE_ICON_INDEX_OFFSET).toInt(); + const auto sharedIndex = QString(CUSTOM_STATE_ICON_SHARED_INDEX).toInt() - QString(CUSTOM_STATE_ICON_INDEX_OFFSET).toInt(); + + if (customStates.contains(lockedIndex) && customStates.contains(sharedIndex)) { + QVERIFY(it.value()._isLocked && it.value()._isShared); + } + if (customStates.contains(lockedIndex)) { + QVERIFY(it.value()._isLocked); + } + if (customStates.contains(sharedIndex)) { + QVERIFY(it.value()._isShared); + } + } + + QVERIFY(!customStates.isEmpty() || (!it.value()._isLocked && !it.value()._isShared)); + } + QVERIFY(propfindRequestedSpy.isEmpty()); + + // #2 Test wrong file's states fetching. It must fail. + QEventLoop loop; + QVariantList customStates; + std::thread t1([&] { + VfsShellExtensions::CustomStateProviderIpc customStateProviderIpc; + customStates = customStateProviderIpc.fetchCustomStatesForFile(fakeFolder.localPath() + QStringLiteral("A/files/wrong.jpg")); + QMetaObject::invokeMethod(&loop, &QEventLoop::quit, Qt::QueuedConnection); + }); + loop.exec(); + t1.detach(); + QVERIFY(customStates.isEmpty()); + QVERIFY(propfindRequestedSpy.isEmpty()); + + // #3 Test wrong file states fetching. It must fail. + customStates.clear(); + std::thread t2([&] { + VfsShellExtensions::CustomStateProviderIpc customStateProviderIpc; + customStates = customStateProviderIpc.fetchCustomStatesForFile(fakeFolder.localPath() + QStringLiteral("A/files/test_non_shared_and_non_locked_file.txt")); + QMetaObject::invokeMethod(&loop, &QEventLoop::quit, Qt::QueuedConnection); + }); + loop.exec(); + t2.detach(); + QVERIFY(customStates.isEmpty()); + QVERIFY(propfindRequestedSpy.isEmpty()); + + // reset all share states to make sure we'll get new states when fetching + for (auto it = std::begin(dummyFileStates); it != std::end(dummyFileStates); ++it) { + if (fakeFolder.syncJournal().getFileRecord(it.key(), &record)) { + record._remotePerm.unsetPermission(OCC::RemotePermissions::Permissions::IsShared); + record._isShared = false; + QVERIFY(fakeFolder.syncJournal().setFileRecord(record)); + QVERIFY(realFolder->journalDb()->setFileRecord(record)); + } + } + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + // + + // wait enough time to make shares' state invalid + QTest::qWait(shellExtensionServerOverrideIntervalMs + 1000); + + // #4 Test every file's states fetching. Everything must succeed. + for (auto it = std::cbegin(dummyFileStates); it != std::cend(dummyFileStates); ++it) { + QEventLoop loop; + QVariantList customStates; + std::thread t([&] { + VfsShellExtensions::CustomStateProviderIpc customStateProviderIpc; + customStates = customStateProviderIpc.fetchCustomStatesForFile(fakeFolder.localPath() + it.key()); + QMetaObject::invokeMethod(&loop, &QEventLoop::quit, Qt::QueuedConnection); + }); + loop.exec(); + t.detach(); + } + QVERIFY(propfindRequestedSpy.count() == dummyFileStates.size()); + } + void cleanupTestCase() { + QTemporaryDir dir; + ConfigFile::setConfDir(dir.path()); + VfsShellExtensions::ThumbnailProviderIpc::overrideServerName.clear(); if (auto folder = FolderMan::instance()->folderForPath(fakeFolder.localPath())) { @@ -212,5 +399,7 @@ private slots: } }; +bool TestCfApiShellExtensionsIPC::replyWithNoShares = false; + QTEST_GUILESS_MAIN(TestCfApiShellExtensionsIPC) #include "testcfapishellextensionsipc.moc" diff --git a/test/testchunkingng.cpp b/test/testchunkingng.cpp index 66f5a2d43..0c5175bf0 100644 --- a/test/testchunkingng.cpp +++ b/test/testchunkingng.cpp @@ -130,7 +130,8 @@ private slots: // 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)) { + const auto chunksList = chunkMap.keys().mid(2); + for (const auto& name : chunksList) { chunksToDelete.append(name); } fakeFolder.uploadState().children.first().remove(secondChunk.name); diff --git a/test/testdownload.cpp b/test/testdownload.cpp index 80d85e4bd..9c0431cf8 100644 --- a/test/testdownload.cpp +++ b/test/testdownload.cpp @@ -22,7 +22,7 @@ public: using FakeGetReply::FakeGetReply; int fakeSize = stopAfter; - qint64 bytesAvailable() const override + [[nodiscard]] qint64 bytesAvailable() const override { if (aborted) return 0; @@ -220,7 +220,7 @@ private slots: if (op == QNetworkAccessManager::GetOperation && request.url().path().endsWith("A/resendme") && resendActual < resendExpected) { auto errorReply = new FakeErrorReply(op, request, this, 400, "ignore this body"); errorReply->setError(QNetworkReply::ContentReSendError, serverMessage); - errorReply->setAttribute(QNetworkRequest::HTTP2WasUsedAttribute, true); + errorReply->setAttribute(QNetworkRequest::Http2WasUsedAttribute, true); errorReply->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, QVariant()); resendActual += 1; return errorReply; diff --git a/test/teste2efiletransfer.cpp b/test/teste2efiletransfer.cpp new file mode 100644 index 000000000..1722b026c --- /dev/null +++ b/test/teste2efiletransfer.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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 +#include +#include + +#include "gui/accountstate.h" +#include "gui/folderman.h" +#include "common/utility.h" + +#include "endtoendtestutils.h" + +class E2eFileTransferTest : public QObject +{ + Q_OBJECT + +public: + E2eFileTransferTest() = default; + +private: + +private slots: + void initTestCase() + { + qRegisterMetaType("OCC::SyncResult"); + } + + void testSyncFolder() + { + { + EndToEndTestHelper _helper; + OCC::Folder *_testFolder; + + QSignalSpy accountReady(&_helper, &EndToEndTestHelper::accountReady); + _helper.startAccountConfig(); + QVERIFY(accountReady.wait(3000)); + + const auto accountState = _helper.accountState(); + QSignalSpy accountConnected(accountState.data(), &OCC::AccountState::isConnectedChanged); + QVERIFY(accountConnected.wait(30000)); + + _testFolder = _helper.configureSyncFolder(); + QVERIFY(_testFolder); + + // Try the down-sync first + QSignalSpy folderSyncFinished(_testFolder, &OCC::Folder::syncFinished); + OCC::FolderMan::instance()->forceSyncForFolder(_testFolder); + QVERIFY(folderSyncFinished.wait(3000)); + + const auto testFolderPath = _testFolder->path(); + const QString expectedFilePath(testFolderPath + QStringLiteral("welcome.txt")); + const QFile expectedFile(expectedFilePath); + qDebug() << "Checking if expected file exists at:" << expectedFilePath; + QVERIFY(expectedFile.exists()); + + // Now write a file to test the upload + const auto fileName = QStringLiteral("test_file.txt"); + const QString localFilePath(_testFolder->path() + fileName); + QVERIFY(OCC::Utility::writeRandomFile(localFilePath)); + + OCC::FolderMan::instance()->forceSyncForFolder(_testFolder); + QVERIFY(folderSyncFinished.wait(3000)); + qDebug() << "First folder sync complete"; + + const auto waitForServerToProcessTime = QTime::currentTime().addSecs(3); + while (QTime::currentTime() < waitForServerToProcessTime) { + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } + + // Do a propfind to check for this file + const QString remoteFilePath(_testFolder->remotePathTrailingSlash() + fileName); + auto checkFileExistsJob = new OCC::PropfindJob(_helper.account(), remoteFilePath, this); + QSignalSpy result(checkFileExistsJob, &OCC::PropfindJob::result); + + checkFileExistsJob->setProperties(QList() << "getlastmodified"); + checkFileExistsJob->start(); + QVERIFY(result.wait(10000)); + + // Now try to delete the file and check change is reflected + QFile createdFile(localFilePath); + QVERIFY(createdFile.exists()); + createdFile.remove(); + + OCC::FolderMan::instance()->forceSyncForFolder(_testFolder); + QVERIFY(folderSyncFinished.wait(3000)); + + while (QTime::currentTime() < waitForServerToProcessTime) { + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } + + auto checkFileDeletedJob = new OCC::PropfindJob(_helper.account(), remoteFilePath, this); + QSignalSpy error(checkFileDeletedJob, &OCC::PropfindJob::finishedWithError); + + checkFileDeletedJob->setProperties(QList() << "getlastmodified"); + checkFileDeletedJob->start(); + + QVERIFY(error.wait(10000)); + } + + QTest::qWait(10000); + } +}; + +QTEST_MAIN(E2eFileTransferTest) +#include "teste2efiletransfer.moc" diff --git a/test/teste2eserversetup.cpp b/test/teste2eserversetup.cpp new file mode 100644 index 000000000..64ad6da34 --- /dev/null +++ b/test/teste2eserversetup.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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 +#include +#include + +#include "gui/accountstate.h" + +#include "endtoendtestutils.h" + +class E2eServerSetupTest : public QObject +{ + Q_OBJECT + +public: + E2eServerSetupTest() = default; + +private: + EndToEndTestHelper _helper; + +private slots: + void initTestCase() + { + QSignalSpy accountReady(&_helper, &EndToEndTestHelper::accountReady); + _helper.startAccountConfig(); + QVERIFY(accountReady.wait(3000)); + + const auto accountState = _helper.accountState(); + QSignalSpy accountConnected(accountState.data(), &OCC::AccountState::isConnectedChanged); + QVERIFY(accountConnected.wait(30000)); + } + + void testBasicPropfind() + { + const auto account = _helper.account(); + auto job = new OCC::PropfindJob(account, "/", this); + QSignalSpy result(job, &OCC::PropfindJob::result); + + job->setProperties(QList() << "getlastmodified"); + job->start(); + + QVERIFY(result.wait(10000)); + } +}; + +QTEST_MAIN(E2eServerSetupTest) +#include "teste2eserversetup.moc" diff --git a/test/testfolderman.cpp b/test/testfolderman.cpp index e66049f57..75101045c 100644 --- a/test/testfolderman.cpp +++ b/test/testfolderman.cpp @@ -9,22 +9,239 @@ #include #include +#include "QtTest/qtestcase.h" #include "common/utility.h" #include "folderman.h" #include "account.h" #include "accountstate.h" +#include #include "configfile.h" +#include "syncenginetestutils.h" #include "testhelper.h" using namespace OCC; +static QByteArray fake400Response = R"( +{"ocs":{"meta":{"status":"failure","statuscode":400,"message":"Parameter is incorrect.\n"},"data":[]}} +)"; + +bool itemDidCompleteSuccessfully(const ItemCompletedSpy &spy, const QString &path) +{ + if (auto item = spy.findItem(path)) { + return item->_status == SyncFileItem::Success; + } + return false; +} + class TestFolderMan: public QObject { Q_OBJECT FolderMan _fm; +signals: + void incomingShareDeleted(); + private slots: + void testDeleteEncryptedFiles() + { + FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; + QCOMPARE(fakeFolder.currentLocalState().children.count(), 4); + + ItemCompletedSpy completeSpy(fakeFolder); + fakeFolder.localModifier().mkdir("encrypted"); + fakeFolder.localModifier().setE2EE("encrypted", true); + fakeFolder.remoteModifier().mkdir("encrypted"); + fakeFolder.remoteModifier().setE2EE("encrypted", true); + + const auto fakeFileInfo = fakeFolder.remoteModifier().find("encrypted"); + QVERIFY(fakeFileInfo); + QVERIFY(fakeFileInfo->isEncrypted); + QCOMPARE(fakeFolder.currentLocalState().children.count(), 5); + + const auto fakeFileId = fakeFileInfo->fileId; + const auto fakeQnam = new FakeQNAM({}); + // Let's avoid the null filename assert in the default FakeQNAM request creation + const auto fakeQnamOverride = [this, fakeFileId](const QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) { + Q_UNUSED(device) + QNetworkReply *reply = nullptr; + + const auto reqUrl = req.url(); + const auto reqRawPath = reqUrl.path(); + const auto reqPath = reqRawPath.startsWith("/owncloud/") ? reqRawPath.mid(10) : reqRawPath; + + if (reqPath.startsWith(QStringLiteral("ocs/v2.php/apps/end_to_end_encryption/api/v1/meta-data/"))) { + const auto splitUrlPath = reqPath.split('/'); + const auto fileId = splitUrlPath.last(); + + const QUrlQuery urlQuery(req.url()); + const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format")); + + if(fileId == fakeFileId && formatParam == QStringLiteral("json")) { + reply = new FakePayloadReply(op, req, QJsonDocument().toJson(), this); + } else { + reply = new FakeErrorReply(op, req, this, 400, fake400Response); + } + } + + return reply; + }; + fakeFolder.setServerOverride(fakeQnamOverride); + fakeQnam->setOverride(fakeQnamOverride); + + const auto account = Account::create(); + const auto capabilities = QVariantMap { + {QStringLiteral("end-to-end-encryption"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("api-version"), QString::number(2.0)}, + }}, + }; + account->setCapabilities(capabilities); + account->setCredentials(new FakeCredentials{fakeQnam}); + account->setUrl(QUrl(("owncloud://somehost/owncloud"))); + const auto accountState = new FakeAccountState(account); + QVERIFY(accountState->isConnected()); + + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + auto folderDef = folderDefinition(fakeFolder.localPath()); + folderDef.targetPath = ""; + const auto folder = FolderMan::instance()->addFolder(accountState, folderDef); + QVERIFY(folder); + + qRegisterMetaType("SyncResult"); + QSignalSpy folderSyncDone(folder, &Folder::syncFinished); + + QDir dir(folder->path() + QStringLiteral("encrypted")); + QVERIFY(dir.exists()); + QVERIFY(fakeFolder.remoteModifier().find("encrypted")); + QVERIFY(fakeFolder.currentLocalState().find("encrypted")); + QCOMPARE(fakeFolder.currentLocalState().children.count(), 5); + + // Rather than go through the pain of trying to replicate the E2EE response from + // the server, let's just manually set the encryption bool in the folder journal + SyncJournalFileRecord rec; + QVERIFY(folder->journalDb()->getFileRecord(QStringLiteral("encrypted"), &rec)); + rec._isE2eEncrypted = true; + rec._path = QStringLiteral("encrypted").toUtf8(); + rec._type = CSyncEnums::ItemTypeDirectory; + QVERIFY(folder->journalDb()->setFileRecord(rec)); + + SyncJournalFileRecord updatedRec; + QVERIFY(folder->journalDb()->getFileRecord(QStringLiteral("encrypted"), &updatedRec)); + QVERIFY(updatedRec._isE2eEncrypted); + QVERIFY(updatedRec.isDirectory()); + + FolderMan::instance()->removeE2eFiles(account); + + if (folderSyncDone.isEmpty()) { + QVERIFY(folderSyncDone.wait()); + } + + QVERIFY(fakeFolder.currentRemoteState().find("encrypted")); + QVERIFY(!fakeFolder.currentLocalState().find("encrypted")); + QCOMPARE(fakeFolder.currentLocalState().children.count(), 4); + } + + void testLeaveShare() + { + QTemporaryDir dir; + ConfigFile::setConfDir(dir.path()); // we don't want to pollute the user's config file + + constexpr auto firstSharePath = "A/sharedwithme_A.txt"; + constexpr auto secondSharePath = "A/B/sharedwithme_B.data"; + + QScopedPointer fakeQnam(new FakeQNAM({})); + OCC::AccountPtr account = OCC::Account::create(); + account->setCredentials(new FakeCredentials{fakeQnam.data()}); + account->setUrl(QUrl(("http://example.de"))); + OCC::AccountManager::instance()->addAccount(account); + + FakeFolder fakeFolder{FileInfo{}}; + fakeFolder.remoteModifier().mkdir("A"); + + fakeFolder.remoteModifier().insert(firstSharePath, 100); + const auto firstShare = fakeFolder.remoteModifier().find(firstSharePath); + QVERIFY(firstShare); + firstShare->permissions.setPermission(OCC::RemotePermissions::IsShared); + + fakeFolder.remoteModifier().mkdir("A/B"); + + fakeFolder.remoteModifier().insert(secondSharePath, 100); + const auto secondShare = fakeFolder.remoteModifier().find(secondSharePath); + QVERIFY(secondShare); + secondShare->permissions.setPermission(OCC::RemotePermissions::IsShared); + + FolderMan *folderman = FolderMan::instance(); + QCOMPARE(folderman, &_fm); + OCC::AccountState *accountState = OCC::AccountManager::instance()->accounts().first().data(); + const auto folder = folderman->addFolder(accountState, folderDefinition(fakeFolder.localPath())); + QVERIFY(folder); + + auto realFolder = FolderMan::instance()->folderForPath(fakeFolder.localPath()); + QVERIFY(realFolder); + + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + fakeQnam->setOverride([this, accountState, &fakeFolder](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) { + Q_UNUSED(device); + QNetworkReply *reply = nullptr; + + if (op != QNetworkAccessManager::DeleteOperation) { + reply = new FakeErrorReply(op, req, this, 405); + return reply; + } + + if (req.url().path().isEmpty()) { + reply = new FakeErrorReply(op, req, this, 404); + return reply; + } + + const auto filePathRelative = req.url().path().remove(accountState->account()->davPath()); + + const auto foundFileInRemoteFolder = fakeFolder.remoteModifier().find(filePathRelative); + + if (filePathRelative.isEmpty() || !foundFileInRemoteFolder) { + reply = new FakeErrorReply(op, req, this, 404); + return reply; + } + + fakeFolder.remoteModifier().remove(filePathRelative); + reply = new FakePayloadReply(op, req, {}, nullptr); + + emit incomingShareDeleted(); + + return reply; + }); + + QSignalSpy incomingShareDeletedSignal(this, &TestFolderMan::incomingShareDeleted); + + // verify first share gets deleted + folderman->leaveShare(fakeFolder.localPath() + firstSharePath); + QCOMPARE(incomingShareDeletedSignal.count(), 1); + QVERIFY(!fakeFolder.remoteModifier().find(firstSharePath)); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + // verify no share gets deleted + folderman->leaveShare(fakeFolder.localPath() + "A/B/notsharedwithme_B.data"); + QCOMPARE(incomingShareDeletedSignal.count(), 1); + QVERIFY(fakeFolder.remoteModifier().find("A/B/sharedwithme_B.data")); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + // verify second share gets deleted + folderman->leaveShare(fakeFolder.localPath() + secondSharePath); + QCOMPARE(incomingShareDeletedSignal.count(), 2); + QVERIFY(!fakeFolder.remoteModifier().find(secondSharePath)); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + OCC::AccountManager::instance()->deleteAccount(accountState); + } + void testCheckPathValidityForNewFolder() { #ifdef Q_OS_WIN @@ -210,5 +427,5 @@ private slots: } }; -QTEST_APPLESS_MAIN(TestFolderMan) +QTEST_GUILESS_MAIN(TestFolderMan) #include "testfolderman.moc" diff --git a/test/testfolderwatcher.cpp b/test/testfolderwatcher.cpp index c8ac44d40..35828796a 100644 --- a/test/testfolderwatcher.cpp +++ b/test/testfolderwatcher.cpp @@ -127,8 +127,10 @@ public: int countFolders(const QString &path) { int n = 0; - for (const auto &sub : QDir(path).entryList(QDir::Dirs | QDir::NoDotAndDotDot)) + const auto entryList = QDir(path).entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const auto &sub : entryList) { n += 1 + countFolders(path + '/' + sub); + } return n; } diff --git a/test/testhelper.cpp b/test/testhelper.cpp index 8ba0f151b..2a540965f 100644 --- a/test/testhelper.cpp +++ b/test/testhelper.cpp @@ -1,4 +1,6 @@ #include "testhelper.h" +#include +#include OCC::FolderDefinition folderDefinition(const QString &path) { @@ -8,3 +10,19 @@ OCC::FolderDefinition folderDefinition(const QString &path) d.alias = path; return d; } + + +const QByteArray jsonValueToOccReply(const QJsonValue &jsonValue) +{ + QJsonObject root; + QJsonObject ocs; + QJsonObject meta; + + meta.insert("statuscode", 200); + + ocs.insert(QStringLiteral("data"), jsonValue); + ocs.insert(QStringLiteral("meta"), meta); + root.insert(QStringLiteral("ocs"), ocs); + + return QJsonDocument(root).toJson(); +} diff --git a/test/testhelper.h b/test/testhelper.h index 40379577c..24a89c298 100644 --- a/test/testhelper.h +++ b/test/testhelper.h @@ -1,6 +1,7 @@ #ifndef TESTHELPER_H #define TESTHELPER_H +#include "gui/accountstate.h" #include "gui/folder.h" #include "creds/httpcredentials.h" @@ -18,4 +19,26 @@ public: OCC::FolderDefinition folderDefinition(const QString &path); +class FakeAccountState : public OCC::AccountState +{ + Q_OBJECT + +public: + explicit FakeAccountState(OCC::AccountPtr account) + : OCC::AccountState() + { + _account = account; + _state = Connected; + } + +public slots: + void checkConnectivity() override {}; + +private slots: + void setState(OCC::AccountState::State state) override { Q_UNUSED(state) }; +}; + + +const QByteArray jsonValueToOccReply(const QJsonValue &jsonValue); + #endif // TESTHELPER_H diff --git a/test/testlocaldiscovery.cpp b/test/testlocaldiscovery.cpp index 5cffb73eb..9ed191c8e 100644 --- a/test/testlocaldiscovery.cpp +++ b/test/testlocaldiscovery.cpp @@ -153,7 +153,7 @@ private slots: QVERIFY(!trackerContains("A/spurious")); // removed due to full discovery fakeFolder.serverErrorPaths().clear(); - fakeFolder.syncJournal().wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncJournal().wipeErrorBlacklist() != -1); tracker.addTouchedPath("A/newspurious"); // will be removed due to successful sync fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, tracker.localDiscoveryPaths()); @@ -620,14 +620,8 @@ private slots: const QString barFileAaaSubFolder("aaa/subfolder/bar"); fakeFolder.remoteModifier().insert(fooFileRootFolder); - fakeFolder.remoteModifier().insert(barFileRootFolder); - fakeFolder.remoteModifier().find("bar")->extraDavProperties = "1" - "0" - "user1" - "user1" - "user1" - "1648046707"; + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("bar"), FileInfo::LockState::FileLocked, 0, QStringLiteral("user1"), {}, QStringLiteral("user1"), 1648046707, 0); fakeFolder.remoteModifier().mkdir(QStringLiteral("subfolder")); fakeFolder.remoteModifier().insert(fooFileSubFolder); @@ -637,12 +631,25 @@ private slots: fakeFolder.remoteModifier().insert(fooFileAaaSubFolder); fakeFolder.remoteModifier().insert(barFileAaaSubFolder); + ItemCompletedSpy completeSpy(fakeFolder); + + completeSpy.clear(); QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(completeSpy.findItem("bar")->_locked, OCC::SyncFileItem::LockStatus::LockedItem); + SyncJournalFileRecord fileRecordBefore; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("bar"), &fileRecordBefore)); + QVERIFY(fileRecordBefore._lockstate._locked); - fakeFolder.remoteModifier().find("bar")->extraDavProperties = "0"; + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("bar"), FileInfo::LockState::FileUnlocked, {}, {}, {}, {}, {}, {}); fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem); + + completeSpy.clear(); QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(completeSpy.findItem("bar")->_locked, OCC::SyncFileItem::LockStatus::UnlockedItem); + SyncJournalFileRecord fileRecordAfter; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("bar"), &fileRecordAfter)); + QVERIFY(!fileRecordAfter._lockstate._locked); } }; diff --git a/test/testlockfile.cpp b/test/testlockfile.cpp index 97538295e..d0dcc2ae5 100644 --- a/test/testlockfile.cpp +++ b/test/testlockfile.cpp @@ -5,6 +5,7 @@ #include "common/syncjournaldb.h" #include "common/syncjournalfilerecord.h" #include "syncenginetestutils.h" +#include "localdiscoverytracker.h" #include #include @@ -482,6 +483,154 @@ private slots: QVERIFY(jobFailure.wait()); QCOMPARE(jobSuccess.count(), 0); } + + void testSyncLockedFilesAlmostExpired() + { + FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() }; + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + QSignalSpy spySyncCompleted(&fakeFolder.syncEngine(), &OCC::SyncEngine::finished); + + ItemCompletedSpy completeSpy(fakeFolder); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(completeSpy.findItem(QStringLiteral("A/a1"))->_locked, OCC::SyncFileItem::LockStatus::UnlockedItem); + OCC::SyncJournalFileRecord fileRecordBefore; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordBefore)); + QVERIFY(!fileRecordBefore._lockstate._locked); + + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("A/a1"), FileModifier::LockState::FileLocked, 1, QStringLiteral("Nextcloud Office"), {}, QStringLiteral("richdocuments"), QDateTime::currentDateTime().toSecsSinceEpoch() - 1220, 1226); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(completeSpy.findItem(QStringLiteral("A/a1"))->_locked, OCC::SyncFileItem::LockStatus::LockedItem); + OCC::SyncJournalFileRecord fileRecordLocked; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordLocked)); + QVERIFY(fileRecordLocked._lockstate._locked); + + spySyncCompleted.clear(); + + QTest::qWait(5000); + + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("A/a1"), FileModifier::LockState::FileUnlocked, {}, {}, {}, {}, {}, {}); + + QCOMPARE(spySyncCompleted.count(), 0); + QVERIFY(spySyncCompleted.wait(3000)); + QCOMPARE(spySyncCompleted.count(), 1); + + OCC::SyncJournalFileRecord fileRecordUnlocked; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordUnlocked)); + QVERIFY(!fileRecordUnlocked._lockstate._locked); + } + + void testSyncLockedFilesNoExpiredLockedFiles() + { + FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() }; + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + QSignalSpy spySyncCompleted(&fakeFolder.syncEngine(), &OCC::SyncEngine::finished); + + ItemCompletedSpy completeSpy(fakeFolder); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(completeSpy.findItem(QStringLiteral("A/a1"))->_locked, OCC::SyncFileItem::LockStatus::UnlockedItem); + OCC::SyncJournalFileRecord fileRecordBefore; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordBefore)); + QVERIFY(!fileRecordBefore._lockstate._locked); + + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("A/a1"), FileModifier::LockState::FileLocked, 1, QStringLiteral("Nextcloud Office"), {}, QStringLiteral("richdocuments"), QDateTime::currentDateTime().toSecsSinceEpoch() - 1220, 1226); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(completeSpy.findItem(QStringLiteral("A/a1"))->_locked, OCC::SyncFileItem::LockStatus::LockedItem); + OCC::SyncJournalFileRecord fileRecordLocked; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordLocked)); + QVERIFY(fileRecordLocked._lockstate._locked); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + spySyncCompleted.clear(); + + QTest::qWait(1000); + + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("A/a1"), FileModifier::LockState::FileUnlocked, {}, {}, {}, {}, {}, {}); + + QCOMPARE(spySyncCompleted.count(), 0); + QVERIFY(!spySyncCompleted.wait(3000)); + QCOMPARE(spySyncCompleted.count(), 0); + + OCC::SyncJournalFileRecord fileRecordUnlocked; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordUnlocked)); + QVERIFY(fileRecordUnlocked._lockstate._locked); + } + + void testSyncLockedFiles() + { + FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() }; + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + int nGET = 0, nPUT = 0; + QObject parent; + fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) -> QNetworkReply * { + Q_UNUSED(outgoingData) + Q_UNUSED(request) + + if (op == QNetworkAccessManager::PutOperation) { + ++nPUT; + } else if (op == QNetworkAccessManager::GetOperation) { + ++nGET; + } + + return nullptr; + }); + + ItemCompletedSpy completeSpy(fakeFolder); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(nGET, 0); + QCOMPARE(nPUT, 0); + + QCOMPARE(completeSpy.findItem(QStringLiteral("A/a1"))->_locked, OCC::SyncFileItem::LockStatus::UnlockedItem); + OCC::SyncJournalFileRecord fileRecordBefore; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordBefore)); + QVERIFY(!fileRecordBefore._lockstate._locked); + + fakeFolder.remoteModifier().modifyLockState(QStringLiteral("A/a1"), FileModifier::LockState::FileLocked, 1, QStringLiteral("Nextcloud Office"), {}, QStringLiteral("richdocuments"), QDateTime::currentDateTime().toSecsSinceEpoch(), 1226); + fakeFolder.remoteModifier().setModTimeKeepEtag(QStringLiteral("A/a1"), QDateTime::currentDateTime()); + fakeFolder.remoteModifier().appendByte(QStringLiteral("A/a1")); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(nGET, 1); + QCOMPARE(nPUT, 0); + + QCOMPARE(completeSpy.findItem(QStringLiteral("A/a1"))->_locked, OCC::SyncFileItem::LockStatus::LockedItem); + OCC::SyncJournalFileRecord fileRecordLocked; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordLocked)); + QVERIFY(fileRecordLocked._lockstate._locked); + + completeSpy.clear(); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(nGET, 1); + QCOMPARE(nPUT, 0); + + OCC::SyncJournalFileRecord fileRecordAfter; + QVERIFY(fakeFolder.syncJournal().getFileRecord(QStringLiteral("A/a1"), &fileRecordAfter)); + QVERIFY(fileRecordAfter._lockstate._locked); + + auto expectedState = fakeFolder.currentLocalState(); + QCOMPARE(fakeFolder.currentRemoteState(), expectedState); + } }; QTEST_GUILESS_MAIN(TestLockFile) diff --git a/test/testoauth.cpp b/test/testoauth.cpp index a366407db..d3be8dcff 100644 --- a/test/testoauth.cpp +++ b/test/testoauth.cpp @@ -84,7 +84,7 @@ public: void abort() override { aborted = true; } - qint64 bytesAvailable() const override { + [[nodiscard]] qint64 bytesAvailable() const override { if (aborted) return 0; return payload->bytesAvailable(); @@ -116,7 +116,7 @@ public: Q_ENUM(State); bool replyToBrowserOk = false; bool gotAuthOk = false; - virtual bool done() const { return replyToBrowserOk && gotAuthOk; } + [[nodiscard]] virtual bool done() const { return replyToBrowserOk && gotAuthOk; } FakeQNAM *fakeQnam = nullptr; QNetworkAccessManager realQNAM; @@ -187,7 +187,7 @@ public: return new FakePostReply(op, req, std::move(payload), fakeQnam); } - virtual QByteArray tokenReplyPayload() const { + [[nodiscard]] virtual QByteArray tokenReplyPayload() const { QJsonDocument jsondata(QJsonObject{ { "access_token", "123" }, { "refresh_token" , "456" }, diff --git a/test/testpermissions.cpp b/test/testpermissions.cpp index 373b66ade..f20409e7f 100644 --- a/test/testpermissions.cpp +++ b/test/testpermissions.cpp @@ -336,7 +336,7 @@ private slots: QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); } - static void setAllPerm(FileInfo *fi, RemotePermissions perm) + static void setAllPerm(FileInfo *fi, OCC::RemotePermissions perm) { fi->permissions = perm; for (auto &subFi : fi->children) diff --git a/test/testsetuserstatusdialog.cpp b/test/testsetuserstatusdialog.cpp index d529f1a16..035221623 100644 --- a/test/testsetuserstatusdialog.cpp +++ b/test/testsetuserstatusdialog.cpp @@ -69,7 +69,7 @@ public: } } - OCC::UserStatus userStatus() const override + [[nodiscard]] OCC::UserStatus userStatus() const override { return {}; // Not implemented } @@ -85,9 +85,9 @@ public: _predefinedStatuses = statuses; } - OCC::UserStatus userStatusSetByCallerOfSetUserStatus() const { return _userStatusSetByCallerOfSetUserStatus; } + [[nodiscard]] OCC::UserStatus userStatusSetByCallerOfSetUserStatus() const { return _userStatusSetByCallerOfSetUserStatus; } - bool messageCleared() const { return _isMessageCleared; } + [[nodiscard]] bool messageCleared() const { return _isMessageCleared; } void setErrorCouldNotFetchPredefinedUserStatuses(bool value) { @@ -137,9 +137,9 @@ class FakeDateTimeProvider : public OCC::DateTimeProvider public: void setCurrentDateTime(const QDateTime &dateTime) { _dateTime = dateTime; } - QDateTime currentDateTime() const override { return _dateTime; } + [[nodiscard]] QDateTime currentDateTime() const override { return _dateTime; } - QDate currentDate() const override { return _dateTime.date(); } + [[nodiscard]] QDate currentDate() const override { return _dateTime.date(); } private: QDateTime _dateTime; diff --git a/test/testshareemodel.cpp b/test/testshareemodel.cpp new file mode 100644 index 000000000..c9560a75f --- /dev/null +++ b/test/testshareemodel.cpp @@ -0,0 +1,442 @@ +/* + * Copyright (C) 2022 by Claudio Cambra + * + * 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 "gui/filedetails/shareemodel.h" + +#include +#include + +#include "accountmanager.h" +#include "syncenginetestutils.h" +#include "testhelper.h" + +using namespace OCC; + +static QByteArray fake400Response = R"( +{"ocs":{"meta":{"status":"failure","statuscode":400,"message":"Parameter is incorrect.\n"},"data":[]}} +)"; + +constexpr auto searchResultsReplyDelay = 100; + +class TestShareeModel : public QObject +{ + Q_OBJECT + +public: + ~TestShareeModel() override + { + AccountManager::instance()->deleteAccount(_accountState.data()); + }; + + struct FakeShareeDefinition + { + QString label; + + QString shareWith; + Sharee::Type type; + QString shareWithAdditionalInfo; + }; + + void appendShareeToReply(const FakeShareeDefinition &definition) + { + QJsonObject newShareeJson; + newShareeJson.insert("label", definition.label); + + QJsonObject newShareeValueJson; + newShareeValueJson.insert("shareWith", definition.shareWith); + newShareeValueJson.insert("shareType", definition.type); + newShareeValueJson.insert("shareWithAdditionalInfo", definition.shareWithAdditionalInfo); + + newShareeJson.insert("value", newShareeValueJson); + + QString category; + switch(definition.type) { + case Sharee::Circle: + category = QStringLiteral("circles"); + break; + case Sharee::Email: + category = QStringLiteral("emails"); + break; + case Sharee::Federated: + category = QStringLiteral("remotes"); + break; + case Sharee::Group: + category = QStringLiteral("groups"); + break; + case Sharee::Room: + category = QStringLiteral("rooms"); + break; + case Sharee::User: + category = QStringLiteral("users"); + break; + } + + auto shareesInCategory = _shareesMap.value(category).toJsonArray(); + shareesInCategory.append(newShareeJson); + _shareesMap.insert(category, shareesInCategory); + } + + void standardReplyPopulate() + { + appendShareeToReply(_michaelUserDefinition); + appendShareeToReply(_liamUserDefinition); + appendShareeToReply(_iqbalUserDefinition); + appendShareeToReply(_universityGroupDefinition); + appendShareeToReply(_testEmailDefinition); + } + + QVariantMap filteredSharees(const QString &searchString) + { + if (searchString.isEmpty()) { + return _shareesMap; + } + + QVariantMap returnSharees; + QJsonArray exactMatches; + + for (auto it = _shareesMap.constKeyValueBegin(); it != _shareesMap.constKeyValueEnd(); ++it) { + const auto shareesCategory = it->first; + const auto shareesArray = it->second.toJsonArray(); + QJsonArray filteredShareesArray; + + std::copy_if(shareesArray.cbegin(), shareesArray.cend(), std::back_inserter(filteredShareesArray), [&searchString](const QJsonValue &shareeValue) { + const auto shareeObject = shareeValue.toObject().value("value").toObject(); + const auto shareeShareWith = shareeObject.value("shareWith").toString(); + return shareeShareWith.contains(searchString, Qt::CaseInsensitive); + }); + + std::copy_if(filteredShareesArray.cbegin(), filteredShareesArray.cend(), std::back_inserter(exactMatches), [&searchString](const QJsonValue &shareeValue) { + const auto shareeObject = shareeValue.toObject().value("value").toObject(); + const auto shareeShareWith = shareeObject.value("shareWith").toString(); + return shareeShareWith == searchString; + }); + + returnSharees.insert(shareesCategory, filteredShareesArray); + } + + returnSharees.insert(QStringLiteral("exact"), exactMatches); + + return returnSharees; + } + + QByteArray testShareesReply(const QString &searchString) + { + QJsonObject root; + QJsonObject ocs; + QJsonObject meta; + + meta.insert("statuscode", 200); + + const auto resultSharees = filteredSharees(searchString); + const auto shareesJsonObject = QJsonObject::fromVariantMap(resultSharees); + + ocs.insert(QStringLiteral("data"), shareesJsonObject); + ocs.insert(QStringLiteral("meta"), meta); + root.insert(QStringLiteral("ocs"), ocs); + + return QJsonDocument(root).toJson(); + } + + int shareesCount(const QString &searchString) + { + const auto sharees = filteredSharees(searchString); + + auto count = 0; + const auto shareesCategories = sharees.values(); + for (const auto &shareesArrayValue : shareesCategories) { + const auto shareesArray = shareesArrayValue.toJsonArray(); + count += shareesArray.count(); + } + + return count; + } + + void resetTestData() + { + _alwaysReturnErrors = false; + _shareesMap.clear(); + } + + +private: + AccountPtr _account; + AccountStatePtr _accountState; + QScopedPointer _fakeQnam; + + QVariantMap _shareesMap; + + // Some fake sharees of different categories + // ALL OF THEM CONTAIN AN 'I' !! Important for testing + FakeShareeDefinition _michaelUserDefinition { + QStringLiteral("Michael"), + QStringLiteral("michael"), + Sharee::User, + {}, + }; + FakeShareeDefinition _liamUserDefinition { + QStringLiteral("Liam"), + QStringLiteral("liam"), + Sharee::User, + {}, + }; + FakeShareeDefinition _iqbalUserDefinition { + QStringLiteral("Iqbal"), + QStringLiteral("iqbal"), + Sharee::User, + {}, + }; + + FakeShareeDefinition _universityGroupDefinition { + QStringLiteral("University"), + QStringLiteral("university"), + Sharee::Group, + {}, + }; + + FakeShareeDefinition _testEmailDefinition { + QStringLiteral("test.email@nextcloud.com"), + QStringLiteral("test.email@nextcloud.com"), + Sharee::Email, + {}, + }; + + bool _alwaysReturnErrors = false; + +private slots: + void initTestCase() + { + _fakeQnam.reset(new FakeQNAM({})); + _fakeQnam->setOverride([this](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) { + Q_UNUSED(device); + + QNetworkReply *reply = nullptr; + + if (_alwaysReturnErrors) { + reply = new FakeErrorReply(op, req, this, 400, fake400Response); + return reply; + } + + const auto reqUrl = req.url(); + const auto reqRawPath = reqUrl.path(); + const auto reqPath = reqRawPath.startsWith("/owncloud/") ? reqRawPath.mid(10) : reqRawPath; + qDebug() << req.url() << reqPath << op; + + if(req.url().toString().startsWith(_accountState->account()->url().toString()) && + reqPath == QStringLiteral("ocs/v2.php/apps/files_sharing/api/v1/sharees") && + req.attribute(QNetworkRequest::CustomVerbAttribute) == "GET") { + + const auto urlQuery = QUrlQuery(req.url()); + const auto searchParam = urlQuery.queryItemValue(QStringLiteral("search")); + const auto itemTypeParam = urlQuery.queryItemValue(QStringLiteral("itemType")); + const auto pageParam = urlQuery.queryItemValue(QStringLiteral("page")); + const auto perPageParam = urlQuery.queryItemValue(QStringLiteral("perPage")); + const auto lookupParam = urlQuery.queryItemValue(QStringLiteral("lookup")); + const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format")); + + if (formatParam != QStringLiteral("json")) { + reply = new FakeErrorReply(op, req, this, 400, fake400Response); + } else { + reply = new FakePayloadReply(op, req, testShareesReply(searchParam), searchResultsReplyDelay, _fakeQnam.data()); + } + } + + return reply; + }); + + _account = Account::create(); + _account->setCredentials(new FakeCredentials{_fakeQnam.data()}); + _account->setUrl(QUrl(("owncloud://somehost/owncloud"))); + _accountState = new AccountState(_account); + AccountManager::instance()->addAccount(_account); + + // Let's verify our test is working -- all sharees have an I in their "shareWith" + standardReplyPopulate(); + const auto searchString = QStringLiteral("i"); + QCOMPARE(shareesCount(searchString), 5); + + const auto emailSearchString = QStringLiteral("email"); + QCOMPARE(shareesCount(emailSearchString), 1); + } + + void testSetAccountAndPath() + { + resetTestData(); + + ShareeModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy accountStateChanged(&model, &ShareeModel::accountStateChanged); + QSignalSpy shareItemIsFolderChanged(&model, &ShareeModel::shareItemIsFolderChanged); + QSignalSpy searchStringChanged(&model, &ShareeModel::searchStringChanged); + QSignalSpy lookupModeChanged(&model, &ShareeModel::lookupModeChanged); + QSignalSpy shareeBlocklistChanged(&model, &ShareeModel::shareeBlocklistChanged); + + model.setAccountState(_accountState.data()); + QCOMPARE(accountStateChanged.count(), 1); + QCOMPARE(model.accountState(), _accountState.data()); + + const auto shareItemIsFolder = !model.shareItemIsFolder(); + model.setShareItemIsFolder(shareItemIsFolder); + QCOMPARE(shareItemIsFolderChanged.count(), 1); + QCOMPARE(model.shareItemIsFolder(), shareItemIsFolder); + + const auto searchString = QStringLiteral("search string"); + model.setSearchString(searchString); + QCOMPARE(searchStringChanged.count(), 1); + QCOMPARE(model.searchString(), searchString); + + const auto lookupMode = ShareeModel::LookupMode::GlobalSearch; + model.setLookupMode(lookupMode); + QCOMPARE(lookupModeChanged.count(), 1); + QCOMPARE(model.lookupMode(), lookupMode); + + const ShareePtr sharee(new Sharee(_testEmailDefinition.shareWith, _testEmailDefinition.label, _testEmailDefinition.type)); + const QVariantList shareeBlocklist {QVariant::fromValue(sharee)}; + model.setShareeBlocklist(shareeBlocklist); + QCOMPARE(shareeBlocklistChanged.count(), 1); + QCOMPARE(model.shareeBlocklist(), shareeBlocklist); + } + + void testShareesFetch() + { + resetTestData(); + standardReplyPopulate(); + + ShareeModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + model.setAccountState(_accountState.data()); + + QSignalSpy shareesReady(&model, &ShareeModel::shareesReady); + const auto searchString = QStringLiteral("i"); + model.setSearchString(searchString); + QVERIFY(shareesReady.wait(3000)); + QCOMPARE(model.rowCount(), shareesCount(searchString)); + + const auto emailSearchString = QStringLiteral("email"); + model.setSearchString(emailSearchString); + QVERIFY(shareesReady.wait(3000)); + QCOMPARE(model.rowCount(), shareesCount(emailSearchString)); + } + + void testFetchSignalling() + { + resetTestData(); + standardReplyPopulate(); + + ShareeModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + model.setAccountState(_accountState.data()); + QSignalSpy fetchOngoingChanged(&model, &ShareeModel::fetchOngoingChanged); + const auto searchString = QStringLiteral("i"); + model.setSearchString(searchString); + + QVERIFY(fetchOngoingChanged.wait(1000)); + QCOMPARE(model.fetchOngoing(), true); + QVERIFY(fetchOngoingChanged.wait(3000)); + QCOMPARE(model.fetchOngoing(), false); + } + + void testData() + { + resetTestData(); + appendShareeToReply(_testEmailDefinition); + + ShareeModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + model.setAccountState(_accountState.data()); + const auto searchString = QStringLiteral("i"); + model.setSearchString(searchString); + + QSignalSpy shareesReady(&model, &ShareeModel::shareesReady); + QVERIFY(shareesReady.wait(3000)); + QCOMPARE(model.rowCount(), shareesCount(searchString)); + + const auto shareeIndex = model.index(0, 0, {}); + + const ShareePtr expectedSharee(new Sharee(_testEmailDefinition.shareWith, _testEmailDefinition.label, _testEmailDefinition.type)); + const auto sharee = shareeIndex.data(ShareeModel::ShareeRole).value(); + QCOMPARE(sharee->format(), expectedSharee->format()); + QCOMPARE(sharee->shareWith(), expectedSharee->shareWith()); + QCOMPARE(sharee->displayName(), expectedSharee->displayName()); + QCOMPARE(sharee->type(), expectedSharee->type()); + + const auto expectedShareeDisplay = QString(_testEmailDefinition.label + QStringLiteral(" (email)")); + const auto shareeDisplay = shareeIndex.data(Qt::DisplayRole).toString(); + QCOMPARE(shareeDisplay, expectedShareeDisplay); + + const auto expectedAutoCompleterStringMatch = QString(_testEmailDefinition.label + + QStringLiteral(" (") + + _testEmailDefinition.shareWith + + QStringLiteral(")")); + const auto autoCompleterStringMatch = shareeIndex.data(ShareeModel::AutoCompleterStringMatchRole).toString(); + QCOMPARE(autoCompleterStringMatch, expectedAutoCompleterStringMatch); + } + + void testBlocklist() + { + resetTestData(); + standardReplyPopulate(); + + ShareeModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + model.setAccountState(_accountState.data()); + + const ShareePtr sharee(new Sharee(_testEmailDefinition.shareWith, _testEmailDefinition.label, _testEmailDefinition.type)); + const QVariantList shareeBlocklist {QVariant::fromValue(sharee)}; + model.setShareeBlocklist(shareeBlocklist); + + QSignalSpy shareesReady(&model, &ShareeModel::shareesReady); + const auto searchString = QStringLiteral("i"); + model.setSearchString(searchString); + QVERIFY(shareesReady.wait(3000)); + QCOMPARE(model.rowCount(), shareesCount(searchString) - 1); + + const ShareePtr shareeTwo(new Sharee(_michaelUserDefinition.shareWith, _michaelUserDefinition.label, _michaelUserDefinition.type)); + const QVariantList largerShareeBlocklist {QVariant::fromValue(sharee), QVariant::fromValue(shareeTwo)}; + model.setShareeBlocklist(largerShareeBlocklist); + QCOMPARE(model.rowCount(), shareesCount(searchString) - 2); + } + + void testServerError() + { + resetTestData(); + _alwaysReturnErrors = true; + + ShareeModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + model.setAccountState(_accountState.data()); + + QSignalSpy displayErrorMessage(&model, &ShareeModel::displayErrorMessage); + QSignalSpy fetchOngoingChanged(&model, &ShareeModel::fetchOngoingChanged); + model.setSearchString(QStringLiteral("i")); + QVERIFY(displayErrorMessage.wait(3000)); + + QCOMPARE(fetchOngoingChanged.count(), 2); + QCOMPARE(model.fetchOngoing(), false); + } +}; + +QTEST_MAIN(TestShareeModel) +#include "testshareemodel.moc" diff --git a/test/testsharemodel.cpp b/test/testsharemodel.cpp new file mode 100644 index 000000000..50dd8c3fc --- /dev/null +++ b/test/testsharemodel.cpp @@ -0,0 +1,981 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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 "gui/filedetails/sharemodel.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "sharetestutils.h" +#include "libsync/theme.h" + +using namespace OCC; + +class TestShareModel : public QObject +{ + Q_OBJECT + +private: + ShareTestHelper helper; + + FakeShareDefinition _testLinkShareDefinition; + FakeShareDefinition _testEmailShareDefinition; + FakeShareDefinition _testUserShareDefinition; + FakeShareDefinition _testRemoteShareDefinition; + +private slots: + void initTestCase() + { + QSignalSpy helperSetupSucceeded(&helper, &ShareTestHelper::setupSucceeded); + helper.setup(); + QCOMPARE(helperSetupSucceeded.count(), 1); + + const auto testSharePassword = "3|$argon2id$v=19$m=65536," + "t=4," + "p=1$M2FoLnliWkhIZkwzWjFBQg$BPraP+JUqP1sV89rkymXpCGxHBlCct6bZ39xUGaYQ5w"; + const auto testShareNote = QStringLiteral("This is a note!"); + const auto testShareExpiration = QDate::currentDate().addDays(1).toString(helper.expectedDtFormat); + + const auto linkShareLabel = QStringLiteral("Link share label"); + _testLinkShareDefinition = FakeShareDefinition(&helper, + Share::TypeLink, + {}, + linkShareLabel, + testSharePassword, + testShareNote, + testShareExpiration); + + const auto emailShareShareWith = QStringLiteral("test-email@nextcloud.com"); + const auto emailShareShareWithDisplayName = QStringLiteral("Test email"); + _testEmailShareDefinition = FakeShareDefinition(&helper, + Share::TypeEmail, + emailShareShareWith, + emailShareShareWithDisplayName, + testSharePassword, + testShareNote, + testShareExpiration); + + + const auto userShareShareWith = QStringLiteral("user"); + const auto userShareShareWithDisplayName("A Nextcloud user"); + _testUserShareDefinition = FakeShareDefinition(&helper, + Share::TypeUser, + userShareShareWith, + userShareShareWithDisplayName); + + + + const auto remoteShareShareWith = QStringLiteral("remote_share"); + const auto remoteShareShareWithDisplayName("A remote share"); + _testRemoteShareDefinition = FakeShareDefinition(&helper, + Share::TypeRemote, + remoteShareShareWith, + remoteShareShareWithDisplayName); + + qRegisterMetaType("ShareePtr"); + } + + void testSetAccountAndPath() + { + helper.resetTestData(); + // Test with a link share + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy accountStateChanged(&model, &ShareModel::accountStateChanged); + QSignalSpy localPathChanged(&model, &ShareModel::localPathChanged); + + QSignalSpy accountConnectedChanged(&model, &ShareModel::accountConnectedChanged); + QSignalSpy sharingEnabledChanged(&model, &ShareModel::sharingEnabledChanged); + QSignalSpy publicLinkSharesEnabledChanged(&model, &ShareModel::publicLinkSharesEnabledChanged); + + model.setAccountState(helper.accountState.data()); + QCOMPARE(accountStateChanged.count(), 1); + + // Check all the account-related properties of the model + QCOMPARE(model.accountConnected(), helper.accountState->isConnected()); + QCOMPARE(model.sharingEnabled(), helper.account->capabilities().shareAPI()); + QCOMPARE(model.publicLinkSharesEnabled() && Theme::instance()->linkSharing(), helper.account->capabilities().sharePublicLink()); + QCOMPARE(Theme::instance()->userGroupSharing(), model.userGroupSharingEnabled()); + + const QString localPath(helper.fakeFolder.localPath() + helper.testFileName); + model.setLocalPath(localPath); + QCOMPARE(localPathChanged.count(), 1); + QCOMPARE(model.localPath(), localPath); + } + + void testSuccessfulFetchShares() + { + helper.resetTestData(); + // Test with a link share and a user/group email share "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + helper.appendShareReplyData(_testEmailShareDefinition); + helper.appendShareReplyData(_testUserShareDefinition); + QCOMPARE(helper.shareCount(), 3); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share + } + + void testFetchSharesFailedError() + { + helper.resetTestData(); + // Test with a link share "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy serverError(&model, &ShareModel::serverError); + + // Test fetching the shares of a file that does not exist + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + "wrong-filename-oops.md"); + QVERIFY(serverError.wait(3000)); + QCOMPARE(model.hasInitialShareFetchCompleted(), true); + QCOMPARE(model.rowCount(), 0); // Make sure no placeholder nor internal link share + } + + void testCorrectFetchOngoingSignalling() + { + helper.resetTestData(); + + // Test with a link share "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy fetchOngoingChanged(&model, &ShareModel::fetchOngoingChanged); + + // Make sure we are correctly signalling the loading state of the fetch + // Model resets twice when we set account and local path, resetting all model state. + + model.setAccountState(helper.accountState.data()); + QCOMPARE(fetchOngoingChanged.count(), 1); + QCOMPARE(model.fetchOngoing(), false); + + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + // If we can grab shares it then indicates fetch ongoing... + QCOMPARE(fetchOngoingChanged.count(), 3); + QCOMPARE(model.fetchOngoing(), true); + + // Then indicates fetch finished when done. + QVERIFY(fetchOngoingChanged.wait(3000)); + QCOMPARE(model.fetchOngoing(), false); + } + + void testCorrectInitialFetchCompleteSignalling() + { + helper.resetTestData(); + + // Test with a link share "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy accountStateChanged(&model, &ShareModel::accountStateChanged); + QSignalSpy localPathChanged(&model, &ShareModel::localPathChanged); + QSignalSpy hasInitialShareFetchCompletedChanged(&model, &ShareModel::hasInitialShareFetchCompletedChanged); + + // Make sure we are correctly signalling the loading state of the fetch + // Model resets twice when we set account and local path, resetting all model state. + + model.setAccountState(helper.accountState.data()); + QCOMPARE(accountStateChanged.count(), 1); + QCOMPARE(hasInitialShareFetchCompletedChanged.count(), 1); + QCOMPARE(model.hasInitialShareFetchCompleted(), false); + + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + QCOMPARE(localPathChanged.count(), 1); + QCOMPARE(hasInitialShareFetchCompletedChanged.count(), 2); + QCOMPARE(model.hasInitialShareFetchCompleted(), false); + + // Once we have acquired shares from the server the initial share fetch is completed + QVERIFY(hasInitialShareFetchCompletedChanged.wait(3000)); + QCOMPARE(hasInitialShareFetchCompletedChanged.count(), 3); + QCOMPARE(model.hasInitialShareFetchCompleted(), true); + } + + // Link shares and user group shares have slightly different behaviour in model.data() + void testModelLinkShareData() + { + helper.resetTestData(); + // Test with a link share "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Remember internal link share! + + // Placeholder link share gets added after we are done parsing fetched shares, and the + // internal link share is added after we receive a reply from the PROPFIND, which we + // send before fetching the shares, so it will be added first. + // + // Hence we grab the remote share in between. + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QVERIFY(!shareIndex.data(Qt::DisplayRole).toString().isEmpty()); + QCOMPARE(shareIndex.data(ShareModel::ShareTypeRole).toInt(), _testLinkShareDefinition.shareType); + QCOMPARE(shareIndex.data(ShareModel::ShareIdRole).toString(), _testLinkShareDefinition.shareId); + QCOMPARE(shareIndex.data(ShareModel::LinkRole).toString(), _testLinkShareDefinition.linkShareUrl); + QCOMPARE(shareIndex.data(ShareModel::LinkShareNameRole).toString(), _testLinkShareDefinition.linkShareName); + QCOMPARE(shareIndex.data(ShareModel::LinkShareLabelRole).toString(), _testLinkShareDefinition.linkShareLabel); + QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), !_testLinkShareDefinition.shareNote.isEmpty()); + QCOMPARE(shareIndex.data(ShareModel::NoteRole).toString(), _testLinkShareDefinition.shareNote); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), !_testLinkShareDefinition.sharePassword.isEmpty()); + // We don't expose the fetched password to the user as it's useless to them + QCOMPARE(shareIndex.data(ShareModel::PasswordRole).toString(), QString()); + QCOMPARE(shareIndex.data(ShareModel::EditingAllowedRole).toBool(), SharePermissions(_testLinkShareDefinition.sharePermissions).testFlag(SharePermissionUpdate)); + + const auto expectedLinkShareExpireDate = QDate::fromString(_testLinkShareDefinition.shareExpiration, helper.expectedDtFormat); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), expectedLinkShareExpireDate.isValid()); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateRole).toLongLong(), expectedLinkShareExpireDate.startOfDay(Qt::UTC).toMSecsSinceEpoch()); + + const auto iconUrl = shareIndex.data(ShareModel::IconUrlRole).toString(); + QVERIFY(iconUrl.contains("public.svg")); + } + + void testModelEmailShareData() + { + helper.resetTestData(); + // Test with a user/group email share "from the server" + helper.appendShareReplyData(_testEmailShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), 3); // Remember about placeholder and internal link share + + // Placeholder link share gets added after we are done parsing fetched shares, and the + // internal link share is added after we receive a reply from the PROPFIND, which we + // send before fetching the shares, so it will be added first. + // + // Hence we grab the remote share in between. + const auto shareIndex = model.index(1, 0, {}); + QVERIFY(!shareIndex.data(Qt::DisplayRole).toString().isEmpty()); + QCOMPARE(shareIndex.data(ShareModel::ShareTypeRole).toInt(), _testEmailShareDefinition.shareType); + QCOMPARE(shareIndex.data(ShareModel::ShareIdRole).toString(), _testEmailShareDefinition.shareId); + QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), !_testEmailShareDefinition.shareNote.isEmpty()); + QCOMPARE(shareIndex.data(ShareModel::NoteRole).toString(), _testEmailShareDefinition.shareNote); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), !_testEmailShareDefinition.sharePassword.isEmpty()); + // We don't expose the fetched password to the user as it's useless to them + QCOMPARE(shareIndex.data(ShareModel::PasswordRole).toString(), QString()); + QCOMPARE(shareIndex.data(ShareModel::EditingAllowedRole).toBool(), SharePermissions(_testEmailShareDefinition.sharePermissions).testFlag(SharePermissionUpdate)); + + const auto expectedShareExpireDate = QDate::fromString(_testEmailShareDefinition.shareExpiration, helper.expectedDtFormat); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), expectedShareExpireDate.isValid()); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateRole).toLongLong(), expectedShareExpireDate.startOfDay(Qt::UTC).toMSecsSinceEpoch()); + + const auto iconUrl = shareIndex.data(ShareModel::IconUrlRole).toString(); + QVERIFY(iconUrl.contains("email.svg")); + } + + void testModelUserShareData() + { + helper.resetTestData(); + // Test with a user/group user share "from the server" + helper.appendShareReplyData(_testUserShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), 3); // Remember about placeholder and internal link share + + // Placeholder link share gets added after we are done parsing fetched shares, and the + // internal link share is added after we receive a reply from the PROPFIND, which we + // send before fetching the shares, so it will be added first. + // + // Hence we grab the remote share in between. + const auto shareIndex = model.index(1, 0, {}); + QVERIFY(!shareIndex.data(Qt::DisplayRole).toString().isEmpty()); + QCOMPARE(shareIndex.data(ShareModel::ShareTypeRole).toInt(), _testUserShareDefinition.shareType); + QCOMPARE(shareIndex.data(ShareModel::ShareIdRole).toString(), _testUserShareDefinition.shareId); + QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), !_testUserShareDefinition.shareNote.isEmpty()); + QCOMPARE(shareIndex.data(ShareModel::NoteRole).toString(), _testUserShareDefinition.shareNote); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), !_testUserShareDefinition.sharePassword.isEmpty()); + // We don't expose the fetched password to the user as it's useless to them + QCOMPARE(shareIndex.data(ShareModel::PasswordRole).toString(), QString()); + QCOMPARE(shareIndex.data(ShareModel::EditingAllowedRole).toBool(), SharePermissions(_testUserShareDefinition.sharePermissions).testFlag(SharePermissionUpdate)); + + const auto expectedShareExpireDate = QDate::fromString(_testUserShareDefinition.shareExpiration, helper.expectedDtFormat); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), expectedShareExpireDate.isValid()); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateRole).toLongLong(), expectedShareExpireDate.startOfDay(Qt::UTC).toMSecsSinceEpoch()); + + const auto iconUrl = shareIndex.data(ShareModel::IconUrlRole).toString(); + QVERIFY(iconUrl.contains("user.svg")); + + // Check correct user avatar + const auto avatarUrl = shareIndex.data(ShareModel::AvatarUrlRole).toString(); + const auto relativeAvatarPath = QString("remote.php/dav/avatars/%1/%2.png").arg(_testUserShareDefinition.shareShareWith, QString::number(64)); + const auto expectedAvatarPath = Utility::concatUrlPath(helper.account->url(), relativeAvatarPath).toString(); + const QString expectedUrl(QStringLiteral("image://tray-image-provider/") + expectedAvatarPath); + QCOMPARE(avatarUrl, expectedUrl); + } + + void testSuccessfulCreateShares() + { + helper.resetTestData(); + + // Test with an existing link share + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Test if it gets added + model.createNewLinkShare(); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 2); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Test if it's the type we wanted + const auto newLinkShareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(newLinkShareIndex.data(ShareModel::ShareTypeRole).toInt(), Share::TypeLink); + + // Do it again with a different type + const ShareePtr sharee(new Sharee("testsharee@nextcloud.com", "Test sharee", Sharee::Type::Email)); + model.createNewUserGroupShare(sharee); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 3); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Test if it's the type we wanted + const auto newUserGroupShareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(newUserGroupShareIndex.data(ShareModel::ShareTypeRole).toInt(), Share::TypeEmail); + + // Confirm correct addition of share with password + const auto password = QStringLiteral("a pretty bad password but good thing it doesn't matter!"); + model.createNewLinkShareWithPassword(password); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 4); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + model.createNewUserGroupShareWithPassword(sharee, password); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 5); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + helper.resetTestData(); + } + + void testEnforcePasswordShares() + { + helper.resetTestData(); + + // Enforce passwords for shares in capabilities + const QVariantMap enforcePasswordsCapabilities { + {QStringLiteral("files_sharing"), QVariantMap { + {QStringLiteral("api_enabled"), true}, + {QStringLiteral("default_permissions"), 19}, + {QStringLiteral("public"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("expire_date"), QVariantMap { + {QStringLiteral("days"), 30}, + {QStringLiteral("enforced"), false}, + }}, + {QStringLiteral("expire_date_internal"), QVariantMap { + {QStringLiteral("days"), 30}, + {QStringLiteral("enforced"), false}, + }}, + {QStringLiteral("expire_date_remote"), QVariantMap { + {QStringLiteral("days"), 30}, + {QStringLiteral("enforced"), false}, + }}, + {QStringLiteral("password"), QVariantMap { + {QStringLiteral("enforced"), true}, + }}, + }}, + {QStringLiteral("sharebymail"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("password"), QVariantMap { + {QStringLiteral("enforced"), true}, + }}, + }}, + }}, + }; + + helper.account->setCapabilities(enforcePasswordsCapabilities); + QVERIFY(helper.account->capabilities().sharePublicLinkEnforcePassword()); + QVERIFY(helper.account->capabilities().shareEmailPasswordEnforced()); + + // Test with a link share "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Confirm that the model requests a password + QSignalSpy requestPasswordForLinkShare(&model, &ShareModel::requestPasswordForLinkShare); + model.createNewLinkShare(); + QVERIFY(requestPasswordForLinkShare.wait(3000)); + + QSignalSpy requestPasswordForEmailShare(&model, &ShareModel::requestPasswordForEmailSharee); + const ShareePtr sharee(new Sharee("testsharee@nextcloud.com", "Test sharee", Sharee::Type::Email)); + model.createNewUserGroupShare(sharee); + QCOMPARE(requestPasswordForEmailShare.count(), 1); + + // Test that the model data is correctly reporting that passwords are enforced + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(shareIndex.data(ShareModel::PasswordEnforcedRole).toBool(), true); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), true); + } + + void testEnforceExpireDate() + { + helper.resetTestData(); + + const auto internalExpireDays = 45; + const auto publicExpireDays = 30; + const auto remoteExpireDays = 25; + + // Enforce expire dates for shares in capabilities + const QVariantMap enforcePasswordsCapabilities { + {QStringLiteral("files_sharing"), QVariantMap { + {QStringLiteral("api_enabled"), true}, + {QStringLiteral("default_permissions"), 19}, + {QStringLiteral("public"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("expire_date"), QVariantMap { + {QStringLiteral("days"), publicExpireDays}, + {QStringLiteral("enforced"), true}, + }}, + {QStringLiteral("expire_date_internal"), QVariantMap { + {QStringLiteral("days"), internalExpireDays}, + {QStringLiteral("enforced"), true}, + }}, + {QStringLiteral("expire_date_remote"), QVariantMap { + {QStringLiteral("days"), remoteExpireDays}, + {QStringLiteral("enforced"), true}, + }}, + {QStringLiteral("password"), QVariantMap { + {QStringLiteral("enforced"), false}, + }}, + }}, + {QStringLiteral("sharebymail"), QVariantMap { + {QStringLiteral("enabled"), true}, + {QStringLiteral("password"), QVariantMap { + {QStringLiteral("enforced"), true}, + }}, + }}, + }}, + }; + + helper.account->setCapabilities(enforcePasswordsCapabilities); + QVERIFY(helper.account->capabilities().sharePublicLinkEnforceExpireDate()); + QVERIFY(helper.account->capabilities().shareInternalEnforceExpireDate()); + QVERIFY(helper.account->capabilities().shareRemoteEnforceExpireDate()); + + // Test with shares "from the server" + helper.appendShareReplyData(_testLinkShareDefinition); + helper.appendShareReplyData(_testEmailShareDefinition); + helper.appendShareReplyData(_testRemoteShareDefinition); + QCOMPARE(helper.shareCount(), 3); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Test that the model data is correctly reporting that expire dates are enforced for all share types + for(auto i = 0; i < model.rowCount(); ++i) { + const auto shareIndex = model.index(i, 0, {}); + const auto shareType = shareIndex.data(ShareModel::ShareTypeRole).toInt(); + const auto expectTrue = shareType != ShareModel::ShareTypePlaceholderLink && + shareType != ShareModel::ShareTypeInternalLink; + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnforcedRole).toBool(), expectTrue); + + QDateTime expectedExpireDateTime; + switch(shareType) { + case Share::TypeInternalLink: + case Share::TypePlaceholderLink: + return; + case Share::TypeUser: + case Share::TypeGroup: + case Share::TypeCircle: + case Share::TypeRoom: + expectedExpireDateTime = QDate::currentDate().addDays(internalExpireDays).startOfDay(QTimeZone::utc()); + break; + case Share::TypeLink: + case Share::TypeEmail: + expectedExpireDateTime = QDate::currentDate().addDays(publicExpireDays).startOfDay(QTimeZone::utc()); + break; + case Share::TypeRemote: + expectedExpireDateTime = QDate::currentDate().addDays(remoteExpireDays).startOfDay(QTimeZone::utc()); + break; + } + + QCOMPARE(shareIndex.data(ShareModel::EnforcedMaximumExpireDateRole).toLongLong(), expectedExpireDateTime.toMSecsSinceEpoch()); + } + } + + void testSuccessfulDeleteShares() + { + helper.resetTestData(); + + // Test with an existing link share + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Create share + model.createNewLinkShare(); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 2); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Test if it gets deleted properly + const auto latestLinkShare = model.index(model.rowCount() - 1, 0, {}).data(ShareModel::ShareRole).value(); + QSignalSpy shareDeleted(latestLinkShare.data(), &LinkShare::shareDeleted); + model.deleteShare(latestLinkShare); + QVERIFY(shareDeleted.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + helper.resetTestData(); + } + + void testPlaceholderLinkShare() + { + helper.resetTestData(); + + // Start with no shares; should show the placeholder link share + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); // There should be no placeholder yet + + QSignalSpy hasInitialShareFetchCompletedChanged(&model, &ShareModel::hasInitialShareFetchCompletedChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + QVERIFY(hasInitialShareFetchCompletedChanged.wait(5000)); + QVERIFY(model.hasInitialShareFetchCompleted()); + QCOMPARE(model.rowCount(), 2); // There should be a placeholder and internal link share now + + const QPersistentModelIndex placeholderLinkShareIndex(model.index(model.rowCount() - 1, 0, {})); + QCOMPARE(placeholderLinkShareIndex.data(ShareModel::ShareTypeRole).toInt(), Share::TypePlaceholderLink); + + // Test adding a user group share -- we should still be showing a placeholder link share + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + const ShareePtr sharee(new Sharee("testsharee@nextcloud.com", "Test sharee", Sharee::Type::Email)); + model.createNewUserGroupShare(sharee); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 2); // Internal link share too! + + QVERIFY(placeholderLinkShareIndex.isValid()); + QCOMPARE(placeholderLinkShareIndex.data(ShareModel::ShareTypeRole).toInt(), Share::TypePlaceholderLink); + + // Now try adding a link share, which should remove the placeholder + model.createNewLinkShare(); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 2); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + QVERIFY(!placeholderLinkShareIndex.isValid()); + + // Now delete the only link share, which should bring back the placeholder link share + const auto latestLinkShare = model.index(model.rowCount() - 1, 0, {}).data(ShareModel::ShareRole).value(); + QSignalSpy shareDeleted(latestLinkShare.data(), &LinkShare::shareDeleted); + model.deleteShare(latestLinkShare); + QVERIFY(shareDeleted.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 2); // Internal link share too! + + const auto newPlaceholderLinkShareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(newPlaceholderLinkShareIndex.data(ShareModel::ShareTypeRole).toInt(), Share::TypePlaceholderLink); + + helper.resetTestData(); + } + + void testSuccessfulToggleAllowEditing() + { + helper.resetTestData(); + + // Test with an existing link share + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(shareIndex.data(ShareModel::EditingAllowedRole).toBool(), SharePermissions(_testLinkShareDefinition.sharePermissions).testFlag(SharePermissionUpdate)); + + const auto share = shareIndex.data(ShareModel::ShareRole).value(); + QSignalSpy permissionsSet(share.data(), &Share::permissionsSet); + + model.toggleShareAllowEditing(share, false); + QVERIFY(permissionsSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::EditingAllowedRole).toBool(), false); + } + + void testSuccessfulPasswordSet() + { + helper.resetTestData(); + + // Test with an existing link share. + // This one has a pre-existing password + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), true); + + const auto share = shareIndex.data(ShareModel::ShareRole).value(); + QSignalSpy passwordSet(share.data(), &Share::passwordSet); + + model.toggleSharePasswordProtect(share, false); + QVERIFY(passwordSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), false); + + const auto password = QStringLiteral("a pretty bad password but good thing it doesn't matter!"); + model.setSharePassword(share, password); + QVERIFY(passwordSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::PasswordProtectEnabledRole).toBool(), true); + // The model stores the recently set password. + // We want to present the user with it in the UI while the model is alive + QCOMPARE(shareIndex.data(ShareModel::PasswordRole).toString(), password); + } + + void testSuccessfulExpireDateSet() + { + helper.resetTestData(); + + // Test with an existing link share. + // This one has a pre-existing expire date + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Check what we know + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), true); + + // Disable expire date + const auto sharePtr = shareIndex.data(ShareModel::ShareRole).value(); + const auto linkSharePtr = sharePtr.dynamicCast(); // Need to connect to signal + QSignalSpy expireDateSet(linkSharePtr.data(), &LinkShare::expireDateSet); + model.toggleShareExpirationDate(sharePtr, false); + + QVERIFY(expireDateSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), false); + + // Set a new expire date + const auto expireDateMsecs = QDate::currentDate().addDays(10).startOfDay(Qt::UTC).toMSecsSinceEpoch(); + model.setShareExpireDate(linkSharePtr, expireDateMsecs); + QVERIFY(expireDateSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateRole).toLongLong(), expireDateMsecs); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), true); + + // Test the QML-specific slot + const QVariant newExpireDateMsecs = QDate::currentDate().addDays(20).startOfDay(Qt::UTC).toMSecsSinceEpoch(); + model.setShareExpireDateFromQml(QVariant::fromValue(sharePtr), newExpireDateMsecs); + QVERIFY(expireDateSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateRole).toLongLong(), newExpireDateMsecs); + QCOMPARE(shareIndex.data(ShareModel::ExpireDateEnabledRole).toBool(), true); + } + + void testSuccessfulNoteSet() + { + helper.resetTestData(); + + // Test with an existing link share. + // This one has a pre-existing password + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), true); + + const auto sharePtr = shareIndex.data(ShareModel::ShareRole).value(); + const auto linkSharePtr = sharePtr.dynamicCast(); // Need to connect to signal + QSignalSpy noteSet(linkSharePtr.data(), &LinkShare::noteSet); + + model.toggleShareNoteToRecipient(sharePtr, false); + QVERIFY(noteSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), false); + + const auto note = QStringLiteral("Don't forget to test everything!"); + model.setShareNote(sharePtr, note); + QVERIFY(noteSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::NoteEnabledRole).toBool(), true); + // The model stores the recently set password. + // We want to present the user with it in the UI while the model is alive + QCOMPARE(shareIndex.data(ShareModel::NoteRole).toString(), note); + } + + void testSuccessfulLinkShareLabelSet() + { + helper.resetTestData(); + + // Test with an existing link share. + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + QCOMPARE(shareIndex.data(ShareModel::LinkShareLabelRole).toBool(), true); + + const auto sharePtr = shareIndex.data(ShareModel::ShareRole).value(); + const auto linkSharePtr = sharePtr.dynamicCast(); // Need to connect to signal + QSignalSpy labelSet(linkSharePtr.data(), &LinkShare::labelSet); + const auto label = QStringLiteral("New link share label!"); + model.setLinkShareLabel(linkSharePtr, label); + QVERIFY(labelSet.wait(3000)); + QCOMPARE(shareIndex.data(ShareModel::LinkShareLabelRole).toString(), label); + } + + void testSharees() + { + helper.resetTestData(); + + helper.appendShareReplyData(_testLinkShareDefinition); + helper.appendShareReplyData(_testEmailShareDefinition); + helper.appendShareReplyData(_testUserShareDefinition); + QCOMPARE(helper.shareCount(), 3); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + QCOMPARE(model.sharees().count(), 2); // Link shares don't have sharees + + // Test adding a user group share -- we should still be showing a placeholder link share + const ShareePtr sharee(new Sharee("testsharee@nextcloud.com", "Test sharee", Sharee::Type::Email)); + model.createNewUserGroupShare(sharee); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 4); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + const auto sharees = model.sharees(); + QCOMPARE(sharees.count(), 3); // Link shares don't have sharees + const auto lastSharee = sharees.last().value(); + QVERIFY(lastSharee); + + // Remove the user group share we just added + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + const auto sharePtr = shareIndex.data(ShareModel::ShareRole).value(); + model.deleteShare(sharePtr); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Now check the sharee is gone + QCOMPARE(model.sharees().count(), 2); + } + + void testSharePropertySetError() + { + helper.resetTestData(); + + // Serve a broken share definition from the server to force an error + auto brokenLinkShareDefinition = _testLinkShareDefinition; + brokenLinkShareDefinition.shareId = QString(); + + helper.appendShareReplyData(brokenLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + ShareModel model; + QAbstractItemModelTester modelTester(&model); + QCOMPARE(model.rowCount(), 0); + + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(helper.shareCount(), 1); // Check our test is working! + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Internal link share! + + // Reset the fake server to pretend like nothing is wrong there + helper.resetTestShares(); + helper.appendShareReplyData(_testLinkShareDefinition); + QCOMPARE(helper.shareCount(), 1); + + // Now try changing a property of the share + const auto shareIndex = model.index(model.rowCount() - 1, 0, {}); + const auto share = shareIndex.data(ShareModel::ShareRole).value(); + QSignalSpy serverError(&model, &ShareModel::serverError); + + model.toggleShareAllowEditing(share, false); + QVERIFY(serverError.wait(3000)); + + // Specific signal for password set error + QSignalSpy passwordSetError(&model, &ShareModel::passwordSetError); + const auto password = QStringLiteral("a pretty bad password but good thing it doesn't matter!"); + model.setSharePassword(share, password); + QVERIFY(passwordSetError.wait(3000)); + } + +}; + +QTEST_MAIN(TestShareModel) +#include "testsharemodel.moc" diff --git a/test/testsortedsharemodel.cpp b/test/testsortedsharemodel.cpp new file mode 100644 index 000000000..0f3a0dfe1 --- /dev/null +++ b/test/testsortedsharemodel.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (C) by Claudio Cambra + * + * 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 "gui/filedetails/sortedsharemodel.h" + +#include +#include +#include + +#include "sharetestutils.h" + +using namespace OCC; + +class TestSortedShareModel : public QObject +{ + Q_OBJECT + +public slots: + void addAllTestShares() + { + // Let's insert them in the opposite order we want from the model + for (auto it = _expectedOrder.crbegin(); it != _expectedOrder.crend(); ++it) { + const auto shareDef = *it; + if(it->shareType == Share::TypeInternalLink || it->shareType == Share::TypePlaceholderLink) { + continue; // Don't add the shares that are only internal in the client + } + + helper.appendShareReplyData(*it); + } + } + +private: + ShareTestHelper helper; + + FakeShareDefinition _userADefinition; + FakeShareDefinition _userBDefinition; + FakeShareDefinition _groupADefinition; + FakeShareDefinition _groupBDefinition; + FakeShareDefinition _linkADefinition; + FakeShareDefinition _linkBDefinition; + FakeShareDefinition _emailADefinition; + FakeShareDefinition _emailBDefinition; + FakeShareDefinition _remoteADefinition; + FakeShareDefinition _remoteBDefinition; + FakeShareDefinition _roomADefinition; + FakeShareDefinition _roomBDefinition; + FakeShareDefinition _internalLinkDefinition; + + QVector _expectedOrder; + + static constexpr auto _expectedRemoteShareCount = 12; + +private slots: + void initTestCase() + { + QSignalSpy helperSetupSucceeded(&helper, &ShareTestHelper::setupSucceeded); + helper.setup(); + QCOMPARE(helperSetupSucceeded.count(), 1); + + const auto userAShareWith = QStringLiteral("user_a"); + const auto userAShareWithDisplayName = QStringLiteral("User A"); + _userADefinition = FakeShareDefinition(&helper, Share::TypeUser, userAShareWith, userAShareWithDisplayName); + + const auto userBShareWith = QStringLiteral("user_b"); + const auto userBShareWithDisplayName = QStringLiteral("User B"); + _userBDefinition = FakeShareDefinition(&helper, Share::TypeUser, userBShareWith, userBShareWithDisplayName); + + const auto groupAShareWith = QStringLiteral("group_a"); + const auto groupAShareWithDisplayName = QStringLiteral("Group A"); + _groupADefinition = FakeShareDefinition(&helper, Share::TypeGroup, groupAShareWith, groupAShareWithDisplayName); + + const auto groupBShareWith = QStringLiteral("group_b"); + const auto groupBShareWithDisplayName = QStringLiteral("Group B"); + _groupBDefinition = FakeShareDefinition(&helper, Share::TypeGroup, groupBShareWith, groupBShareWithDisplayName); + + const auto linkALabel = QStringLiteral("Link share label A"); + _linkADefinition = FakeShareDefinition(&helper, Share::TypeLink, {}, linkALabel); + + const auto linkBLabel = QStringLiteral("Link share label B"); + _linkBDefinition = FakeShareDefinition(&helper, Share::TypeLink, {}, linkBLabel); + + const auto emailAShareWith = QStringLiteral("email_a@nextcloud.com"); + const auto emailAShareWithDisplayName = QStringLiteral("email_a@nextcloud.com"); + _emailADefinition = FakeShareDefinition(&helper, Share::TypeEmail, emailAShareWith, emailAShareWithDisplayName); + + const auto emailBShareWith = QStringLiteral("email_b@nextcloud.com"); + const auto emailBShareWithDisplayName = QStringLiteral("email_b@nextcloud.com"); + _emailBDefinition = FakeShareDefinition(&helper, Share::TypeEmail, emailBShareWith, emailBShareWithDisplayName); + + const auto remoteAShareWith = QStringLiteral("remote_a"); + const auto remoteAShareWithDisplayName = QStringLiteral("Remote share A"); + _remoteADefinition = FakeShareDefinition(&helper, Share::TypeRemote, remoteAShareWith, remoteAShareWithDisplayName); + + const auto remoteBShareWith = QStringLiteral("remote_b"); + const auto remoteBShareWithDisplayName = QStringLiteral("Remote share B"); + _remoteBDefinition = FakeShareDefinition(&helper, Share::TypeRemote, remoteBShareWith, remoteBShareWithDisplayName); + + const auto roomAShareWith = QStringLiteral("room_a"); + const auto roomAShareWithDisplayName = QStringLiteral("Room A"); + _roomADefinition = FakeShareDefinition(&helper, Share::TypeRoom, roomAShareWith, roomAShareWithDisplayName); + + const auto roomBShareWith = QStringLiteral("room_b"); + const auto roomBShareWithDisplayName = QStringLiteral("Room B"); + _roomBDefinition = FakeShareDefinition(&helper, Share::TypeRoom, roomBShareWith, roomBShareWithDisplayName); + + // Dummy internal link share, just use it to check position + _internalLinkDefinition.shareId = QStringLiteral("__internalLinkShareId__"); + _internalLinkDefinition.shareType = Share::TypeInternalLink; + + _expectedOrder = {// Placeholder link shares always go first, followed by normal link shares. + _linkADefinition, + _linkBDefinition, + // For all other share types, we follow the Share::ShareType enum. + _userADefinition, + _userBDefinition, + _groupADefinition, + _groupBDefinition, + _emailADefinition, + _emailBDefinition, + _remoteADefinition, + _remoteBDefinition, + _roomADefinition, + _roomBDefinition, + _internalLinkDefinition}; + } + + void testSetModel() + { + helper.resetTestData(); + addAllTestShares(); + QCOMPARE(helper.shareCount(), _expectedRemoteShareCount); + + ShareModel model; + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Remember the internal link share! + + SortedShareModel sortedModel; + QAbstractItemModelTester sortedModelTester(&sortedModel); + QSignalSpy sortedModelReset(&sortedModel, &SortedShareModel::modelReset); + QSignalSpy shareModelChanged(&sortedModel, &SortedShareModel::shareModelChanged); + + sortedModel.setShareModel(&model); + QCOMPARE(shareModelChanged.count(), 1); + QCOMPARE(sortedModelReset.count(), 1); + QCOMPARE(sortedModel.rowCount(), model.rowCount()); + QCOMPARE(sortedModel.shareModel(), &model); + } + + void testCorrectSort() + { + helper.resetTestData(); + addAllTestShares(); + QCOMPARE(helper.shareCount(), _expectedRemoteShareCount); + + ShareModel model; + QSignalSpy sharesChanged(&model, &ShareModel::sharesChanged); + model.setAccountState(helper.accountState.data()); + model.setLocalPath(helper.fakeFolder.localPath() + helper.testFileName); + QVERIFY(sharesChanged.wait(5000)); + QCOMPARE(model.rowCount(), helper.shareCount() + 1); // Remember the internal link share! + + SortedShareModel sortedModel; + QAbstractItemModelTester sortedModelTester(&sortedModel); + QSignalSpy sortedModelReset(&sortedModel, &SortedShareModel::modelReset); + + sortedModel.setShareModel(&model); + QCOMPARE(sortedModelReset.count(), 1); + QCOMPARE(sortedModel.rowCount(), model.rowCount()); + + for(auto i = 0; i < sortedModel.rowCount(); ++i) { + const auto shareIndex = sortedModel.index(i, 0); + const auto expectedShareDefinition = _expectedOrder.at(i); + + QCOMPARE(shareIndex.data(ShareModel::ShareTypeRole).toInt(), expectedShareDefinition.shareType); + QCOMPARE(shareIndex.data(ShareModel::ShareIdRole).toString(), expectedShareDefinition.shareId); + } + } + +}; + +QTEST_MAIN(TestSortedShareModel) +#include "testsortedsharemodel.moc" diff --git a/test/testsynccfapi.cpp b/test/testsynccfapi.cpp index 8d41fa029..db32a5d85 100644 --- a/test/testsynccfapi.cpp +++ b/test/testsynccfapi.cpp @@ -67,7 +67,7 @@ bool itemInstruction(const ItemCompletedSpy &spy, const QString &path, const Syn SyncJournalFileRecord dbRecord(FakeFolder &folder, const QString &path) { SyncJournalFileRecord record; - folder.syncJournal().getFileRecord(path, &record); + [[maybe_unused]] const auto result = folder.syncJournal().getFileRecord(path, &record); return record; } @@ -75,11 +75,11 @@ void triggerDownload(FakeFolder &folder, const QByteArray &path) { auto &journal = folder.syncJournal(); SyncJournalFileRecord record; - journal.getFileRecord(path, &record); - if (!record.isValid()) + if (!journal.getFileRecord(path, &record) || !record.isValid()) { return; + } record._type = ItemTypeVirtualFileDownload; - journal.setFileRecord(record); + QVERIFY(journal.setFileRecord(record)); journal.schedulePathForRemoteDiscovery(record._path); } @@ -87,11 +87,11 @@ void markForDehydration(FakeFolder &folder, const QByteArray &path) { auto &journal = folder.syncJournal(); SyncJournalFileRecord record; - journal.getFileRecord(path, &record); - if (!record.isValid()) + if (!journal.getFileRecord(path, &record) || !record.isValid()) { return; + } record._type = ItemTypeVirtualFileDehydration; - journal.setFileRecord(record); + QVERIFY(journal.setFileRecord(record)); journal.schedulePathForRemoteDiscovery(record._path); } @@ -237,8 +237,8 @@ private slots: QCOMPARE(QFileInfo(fakeFolder.localPath() + "A/a3").size(), 33); cleanup(); - fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2"); - fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3"); + QVERIFY(fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2")); + QVERIFY(fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3")); fakeFolder.remoteModifier().remove("A/a3"); fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly); QVERIFY(fakeFolder.syncOnce()); @@ -456,7 +456,7 @@ private slots: auto cleanup = [&]() { completeSpy.clear(); - fakeFolder.syncJournal().wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncJournal().wipeErrorBlacklist() != -1); }; cleanup(); @@ -735,8 +735,7 @@ private slots: }; auto hasDehydratedDbEntries = [&](const QString &path) { SyncJournalFileRecord rec; - fakeFolder.syncJournal().getFileRecord(path, &rec); - return rec.isValid() && rec._type == ItemTypeVirtualFile; + return fakeFolder.syncJournal().getFileRecord(path, &rec) && rec.isValid() && rec._type == ItemTypeVirtualFile; }; QVERIFY(isDehydrated("A/a1")); @@ -992,7 +991,7 @@ private slots: QCOMPARE(*vfs->availability("online"), VfsItemAvailability::OnlineOnly); QCOMPARE(*vfs->availability("local"), VfsItemAvailability::AlwaysLocal); - auto r = vfs->availability("nonexistant"); + auto r = vfs->availability("nonexistent"); QVERIFY(!r); QCOMPARE(r.error(), Vfs::AvailabilityError::NoSuchItem); } diff --git a/test/testsyncconflict.cpp b/test/testsyncconflict.cpp index 7017b976d..8a00d76fe 100644 --- a/test/testsyncconflict.cpp +++ b/test/testsyncconflict.cpp @@ -45,7 +45,7 @@ bool expectAndWipeConflict(FileModifier &local, FileInfo state, const QString pa auto base = state.find(pathComponents.parentDirComponents()); if (!base) return false; - for (const auto &item : base->children) { + for (const auto &item : qAsConst(base->children)) { if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("(conflicted copy")) { local.remove(item.path()); return true; @@ -57,7 +57,7 @@ bool expectAndWipeConflict(FileModifier &local, FileInfo state, const QString pa SyncJournalFileRecord dbRecord(FakeFolder &folder, const QString &path) { SyncJournalFileRecord record; - folder.syncJournal().getFileRecord(path, &record); + [[maybe_unused]] const auto result = folder.syncJournal().getFileRecord(path, &record); return record; } @@ -79,8 +79,9 @@ private slots: 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())); + const auto conflicts = findConflicts(fakeFolder.currentLocalState().children["A"]); + for (const auto &conflict : conflicts) { + QVERIFY(!conflict.contains(fakeFolder.syncEngine().account()->davDisplayName())); } QVERIFY(expectAndWipeConflict(fakeFolder.localModifier(), fakeFolder.currentLocalState(), "A/a1")); @@ -598,6 +599,42 @@ private slots: QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); } + void testEtagChangeFileNotChangedGeneratesNoConflicts() + { + FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; + ItemCompletedSpy completeSpy(fakeFolder); + + fakeFolder.remoteModifier().insert("A/fake_conflict", 'W'); + QVERIFY(fakeFolder.syncOnce()); + QVERIFY(!itemConflict(completeSpy, "A/fake_conflict")); + + completeSpy.clear(); + + fakeFolder.remoteModifier().setContents("A/fake_conflict", 'W'); + fakeFolder.localModifier().setContents("A/fake_conflict", 'W'); + + QVERIFY(fakeFolder.syncOnce()); + QVERIFY(!itemConflict(completeSpy, "A/fake_conflict")); + } + + void testEtagChangeFileChangedGeneratesConflicts() + { + FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; + ItemCompletedSpy completeSpy(fakeFolder); + + fakeFolder.remoteModifier().insert("A/real_conflict", 'W'); + QVERIFY(fakeFolder.syncOnce()); + QVERIFY(!itemConflict(completeSpy, "A/real_conflict")); + + completeSpy.clear(); + + fakeFolder.remoteModifier().setContents("A/real_conflict", 'W'); + fakeFolder.localModifier().setContents("A/real_conflict", 'L'); + + QVERIFY(fakeFolder.syncOnce()); + QVERIFY(itemConflict(completeSpy, "A/real_conflict")); + } + // Test what happens if we remove entries both on the server, and locally void testRemoveRemove() { diff --git a/test/testsyncengine.cpp b/test/testsyncengine.cpp index 5131bbbc2..9509c7573 100644 --- a/test/testsyncengine.cpp +++ b/test/testsyncengine.cpp @@ -5,25 +5,49 @@ * */ -#include #include "syncenginetestutils.h" -#include -#include + +#include "syncengine.h" +#include "propagatorjobs.h" +#include "caseclashconflictsolver.h" + +#include using namespace OCC; -bool itemDidComplete(const ItemCompletedSpy &spy, const QString &path) +namespace { + +QStringList findCaseClashConflicts(const FileInfo &dir) { - if (auto item = spy.findItem(path)) { - return item->_instruction != CSYNC_INSTRUCTION_NONE && item->_instruction != CSYNC_INSTRUCTION_UPDATE_METADATA; + QStringList conflicts; + for (const auto &item : dir.children) { + if (item.name.contains("(case clash from")) { + conflicts.append(item.path()); + } + } + return conflicts; +} + +bool expectConflict(FileInfo state, const QString path) +{ + PathComponents pathComponents(path); + auto base = state.find(pathComponents.parentDirComponents()); + if (!base) + return false; + for (const auto &item : qAsConst(base->children)) { + if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("(case clash from")) { + return true; + } } return false; } -bool itemInstruction(const ItemCompletedSpy &spy, const QString &path, const SyncInstructions instr) +bool itemDidComplete(const ItemCompletedSpy &spy, const QString &path) { - auto item = spy.findItem(path); - return item->_instruction == instr; + if (auto item = spy.findItem(path)) { + return item->_instruction != CSYNC_INSTRUCTION_NONE && item->_instruction != CSYNC_INSTRUCTION_UPDATE_METADATA; + } + return false; } bool itemDidCompleteSuccessfully(const ItemCompletedSpy &spy, const QString &path) @@ -54,6 +78,8 @@ int itemSuccessfullyCompletedGetRank(const ItemCompletedSpy &spy, const QString return -1; } +} + class TestSyncEngine : public QObject { Q_OBJECT @@ -211,7 +237,7 @@ private slots: auto getDbChecksum = [&](QString path) { SyncJournalFileRecord record; - fakeFolder.syncJournal().getFileRecord(path, &record); + [[maybe_unused]] const auto result = fakeFolder.syncJournal().getFileRecord(path, &record); return record._checksumHeader; }; @@ -275,7 +301,7 @@ private slots: fakeFolder.syncEngine().journal()->schedulePathForRemoteDiscovery(QByteArrayLiteral("parentFolder/subFolderA/")); auto getEtag = [&](const QByteArray &file) { SyncJournalFileRecord rec; - fakeFolder.syncJournal().getFileRecord(file, &rec); + [[maybe_unused]] const auto result = fakeFolder.syncJournal().getFileRecord(file, &rec); return rec._etag; }; QVERIFY(getEtag("parentFolder") == "_invalid_"); @@ -336,8 +362,7 @@ private slots: QVERIFY(!fakeFolder.syncOnce()); SyncJournalFileRecord rec; - fakeFolder.syncJournal().getFileRecord(QByteArrayLiteral("NewFolder"), &rec); - QVERIFY(rec.isValid()); + QVERIFY(fakeFolder.syncJournal().getFileRecord(QByteArrayLiteral("NewFolder"), &rec) && rec.isValid()); QCOMPARE(rec._etag, QByteArrayLiteral("_invalid_")); QVERIFY(!rec._fileId.isEmpty()); } @@ -454,7 +479,7 @@ private slots: // check that mtime in journal and filesystem agree QString a1path = fakeFolder.localPath() + "A/a1"; SyncJournalFileRecord a1record; - fakeFolder.syncJournal().getFileRecord(QByteArray("A/a1"), &a1record); + QVERIFY(fakeFolder.syncJournal().getFileRecord(QByteArray("A/a1"), &a1record)); QCOMPARE(a1record._modtime, (qint64)FileSystem::getModTime(a1path)); // Extra sync reads from db, no difference @@ -1244,6 +1269,334 @@ private slots: auto expectedState = fakeFolder.currentLocalState(); QCOMPARE(fakeFolder.currentRemoteState(), expectedState); } + + void testServerUpdatingMTimeShouldNotCreateConflicts() + { + constexpr auto testFile = "test.txt"; + constexpr auto CURRENT_MTIME = 1646057277; + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().insert(testFile); + fakeFolder.remoteModifier().setModTimeKeepEtag(testFile, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME - 2)); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + auto localState = fakeFolder.currentLocalState(); + QCOMPARE(localState, fakeFolder.currentRemoteState()); + QCOMPARE(printDbData(fakeFolder.dbState()), printDbData(fakeFolder.currentRemoteState())); + const auto fileFirstSync = localState.find(testFile); + + QVERIFY(fileFirstSync); + QCOMPARE(fileFirstSync->lastModified.toSecsSinceEpoch(), CURRENT_MTIME - 2); + + fakeFolder.remoteModifier().setModTimeKeepEtag(testFile, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME - 1)); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::FilesystemOnly); + QVERIFY(fakeFolder.syncOnce()); + localState = fakeFolder.currentLocalState(); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + QCOMPARE(printDbData(fakeFolder.dbState()), printDbData(fakeFolder.currentRemoteState())); + const auto fileSecondSync = localState.find(testFile); + QVERIFY(fileSecondSync); + QCOMPARE(fileSecondSync->lastModified.toSecsSinceEpoch(), CURRENT_MTIME - 1); + + fakeFolder.remoteModifier().setModTime(testFile, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME)); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::FilesystemOnly); + QVERIFY(fakeFolder.syncOnce()); + localState = fakeFolder.currentLocalState(); + QCOMPARE(localState, fakeFolder.currentRemoteState()); + QCOMPARE(printDbData(fakeFolder.dbState()), printDbData(fakeFolder.currentRemoteState())); + const auto fileThirdSync = localState.find(testFile); + QVERIFY(fileThirdSync); + QCOMPARE(fileThirdSync->lastModified.toSecsSinceEpoch(), CURRENT_MTIME); + } + + void testFolderRemovalWithCaseClash() + { + FakeFolder fakeFolder{ FileInfo{} }; + fakeFolder.remoteModifier().mkdir("A"); + fakeFolder.remoteModifier().mkdir("toDelete"); + fakeFolder.remoteModifier().insert("A/file"); + + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + fakeFolder.remoteModifier().insert("A/FILE"); + QVERIFY(fakeFolder.syncOnce()); + + fakeFolder.remoteModifier().mkdir("a"); + fakeFolder.remoteModifier().remove("toDelete"); + + QVERIFY(fakeFolder.syncOnce()); + auto folderA = fakeFolder.currentLocalState().find("toDelete"); + QCOMPARE(folderA, nullptr); + } + + void testServer_caseClash_createConflict() + { + constexpr auto testLowerCaseFile = "test"; + constexpr auto testUpperCaseFile = "TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().insert("otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_subFolderCaseClash_createConflict() + { + constexpr auto testLowerCaseFile = "a/b/test"; + constexpr auto testUpperCaseFile = "a/b/TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().mkdir("a"); + fakeFolder.remoteModifier().mkdir("a/b"); + fakeFolder.remoteModifier().insert("a/b/otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_caseClash_createConflictOnMove() + { + constexpr auto testLowerCaseFile = "test"; + constexpr auto testUpperCaseFile = "TEST2"; + constexpr auto testUpperCaseFileAfterMove = "TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().insert("otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, false); + + fakeFolder.remoteModifier().rename(testUpperCaseFile, testUpperCaseFileAfterMove); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflictAfterMove = expectConflict(fakeFolder.currentLocalState(), testUpperCaseFileAfterMove); + QCOMPARE(hasConflictAfterMove, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_subFolderCaseClash_createConflictOnMove() + { + constexpr auto testLowerCaseFile = "a/b/test"; + constexpr auto testUpperCaseFile = "a/b/TEST2"; + constexpr auto testUpperCaseFileAfterMove = "a/b/TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().mkdir("a"); + fakeFolder.remoteModifier().mkdir("a/b"); + fakeFolder.remoteModifier().insert("a/b/otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, false); + + fakeFolder.remoteModifier().rename(testUpperCaseFile, testUpperCaseFileAfterMove); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflictAfterMove = expectConflict(fakeFolder.currentLocalState(), testUpperCaseFileAfterMove); + QCOMPARE(hasConflictAfterMove, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_caseClash_createConflictAndSolveIt() + { + constexpr auto testLowerCaseFile = "test"; + constexpr auto testUpperCaseFile = "TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().insert("otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + + if (shouldHaveCaseClashConflict) { + const auto conflictFileName = QString{conflicts.constFirst()}; + qDebug() << conflictFileName; + CaseClashConflictSolver conflictSolver(fakeFolder.localPath() + testLowerCaseFile, + fakeFolder.localPath() + conflictFileName, + QStringLiteral("/"), + fakeFolder.localPath(), + fakeFolder.account(), + &fakeFolder.syncJournal()); + + QSignalSpy conflictSolverDone(&conflictSolver, &CaseClashConflictSolver::done); + QSignalSpy conflictSolverFailed(&conflictSolver, &CaseClashConflictSolver::failed); + + conflictSolver.solveConflict("test2"); + + QVERIFY(conflictSolverDone.wait()); + + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), 0); + } + } + + void testServer_subFolderCaseClash_createConflictAndSolveIt() + { + constexpr auto testLowerCaseFile = "a/b/test"; + constexpr auto testUpperCaseFile = "a/b/TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + + fakeFolder.remoteModifier().mkdir("a"); + fakeFolder.remoteModifier().mkdir("a/b"); + fakeFolder.remoteModifier().insert("a/b/otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + + if (shouldHaveCaseClashConflict) { + CaseClashConflictSolver conflictSolver(fakeFolder.localPath() + testLowerCaseFile, + fakeFolder.localPath() + conflicts.constFirst(), + QStringLiteral("/"), + fakeFolder.localPath(), + fakeFolder.account(), + &fakeFolder.syncJournal()); + + QSignalSpy conflictSolverDone(&conflictSolver, &CaseClashConflictSolver::done); + QSignalSpy conflictSolverFailed(&conflictSolver, &CaseClashConflictSolver::failed); + + conflictSolver.solveConflict("a/b/test2"); + + QVERIFY(conflictSolverDone.wait()); + + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), 0); + } + } }; QTEST_GUILESS_MAIN(TestSyncEngine) diff --git a/test/testsyncfileitem.cpp b/test/testsyncfileitem.cpp index 8b4732f70..ad2465729 100644 --- a/test/testsyncfileitem.cpp +++ b/test/testsyncfileitem.cpp @@ -21,7 +21,7 @@ private slots: void cleanupTestCase() { } - SyncFileItem createItem( const QString& file ) { + OCC::SyncFileItem createItem( const QString& file ) { SyncFileItem i; i._file = file; return i; diff --git a/test/testsyncfilestatustracker.cpp b/test/testsyncfilestatustracker.cpp index e87bb6575..8abaea6b4 100644 --- a/test/testsyncfilestatustracker.cpp +++ b/test/testsyncfilestatustracker.cpp @@ -20,7 +20,7 @@ public: , _syncEngine(syncEngine) { } - SyncFileStatus statusOf(const QString &relativePath) const { + [[nodiscard]] SyncFileStatus statusOf(const QString &relativePath) const { QFileInfo file(_syncEngine.localPath(), relativePath); auto locPath = _syncEngine.localPath(); // Start from the end to get the latest status @@ -31,7 +31,7 @@ public: return {}; } - bool statusEmittedBefore(const QString &firstPath, const QString &secondPath) const { + [[nodiscard]] bool statusEmittedBefore(const QString &firstPath, const QString &secondPath) const { QFileInfo firstFile(_syncEngine.localPath(), firstPath); QFileInfo secondFile(_syncEngine.localPath(), secondPath); // Start from the end to get the latest status diff --git a/test/testsyncjournaldb.cpp b/test/testsyncjournaldb.cpp index 44cd26257..405ab269d 100644 --- a/test/testsyncjournaldb.cpp +++ b/test/testsyncjournaldb.cpp @@ -46,7 +46,7 @@ private slots: void testFileRecord() { SyncJournalFileRecord record; - QVERIFY(_db.getFileRecord(QByteArrayLiteral("nonexistant"), &record)); + QVERIFY(_db.getFileRecord(QByteArrayLiteral("nonexistent"), &record)); QVERIFY(!record.isValid()); record._path = "foo"; @@ -68,7 +68,7 @@ private slots: // Update checksum record._checksumHeader = "Adler32:newchecksum"; - _db.updateFileRecordChecksum("foo", "newchecksum", "Adler32"); + QVERIFY(_db.updateFileRecordChecksum("foo", "newchecksum", "Adler32")); QVERIFY(_db.getFileRecord(QByteArrayLiteral("foo"), &storedRecord)); QVERIFY(storedRecord == record); @@ -81,7 +81,7 @@ private slots: record._fileId = "efg"; record._remotePerm = RemotePermissions::fromDbValue("NV"); record._fileSize = 289055; - _db.setFileRecord(record); + QVERIFY(_db.setFileRecord(record)); QVERIFY(_db.getFileRecord(QByteArrayLiteral("foo"), &storedRecord)); QVERIFY(storedRecord == record); @@ -129,7 +129,7 @@ private slots: void testDownloadInfo() { using Info = SyncJournalDb::DownloadInfo; - Info record = _db.getDownloadInfo("nonexistant"); + Info record = _db.getDownloadInfo("nonexistent"); QVERIFY(!record._valid); record._errorCount = 5; @@ -149,7 +149,7 @@ private slots: void testUploadInfo() { using Info = SyncJournalDb::UploadInfo; - Info record = _db.getUploadInfo("nonexistant"); + Info record = _db.getUploadInfo("nonexistent"); QVERIFY(!record._valid); record._errorCount = 5; @@ -213,11 +213,11 @@ private slots: record._type = type; record._etag = initialEtag; record._remotePerm = RemotePermissions::fromDbValue("RW"); - _db.setFileRecord(record); + QVERIFY(_db.setFileRecord(record)); }; auto getEtag = [&](const QByteArray &path) { SyncJournalFileRecord record; - _db.getFileRecord(path, &record); + [[maybe_unused]] const auto result = _db.getFileRecord(path, &record); return record._etag; }; @@ -275,7 +275,7 @@ private slots: SyncJournalFileRecord record; record._path = path; record._remotePerm = RemotePermissions::fromDbValue("RW"); - _db.setFileRecord(record); + QVERIFY(_db.setFileRecord(record)); }; QByteArrayList elements; @@ -289,15 +289,15 @@ private slots: << "foo bla bar/file" << "fo_" << "fo_/file"; - for (const auto& elem : elements) + for (const auto& elem : qAsConst(elements)) { makeEntry(elem); + } auto checkElements = [&]() { bool ok = true; - for (const auto& elem : elements) { + for (const auto& elem : qAsConst(elements)) { SyncJournalFileRecord record; - _db.getFileRecord(elem, &record); - if (!record.isValid()) { + if (!_db.getFileRecord(elem, &record) || !record.isValid()) { qWarning() << "Missing record: " << elem; ok = false; } @@ -305,17 +305,17 @@ private slots: return ok; }; - _db.deleteFileRecord("moo", true); + QVERIFY(_db.deleteFileRecord("moo", true)); elements.removeAll("moo"); elements.removeAll("moo/file"); QVERIFY(checkElements()); - _db.deleteFileRecord("fo_", true); + QVERIFY(_db.deleteFileRecord("fo_", true)); elements.removeAll("fo_"); elements.removeAll("fo_/file"); QVERIFY(checkElements()); - _db.deleteFileRecord("foo%bar", true); + QVERIFY(_db.deleteFileRecord("foo%bar", true)); elements.removeAll("foo%bar"); QVERIFY(checkElements()); } @@ -382,31 +382,31 @@ private slots: QCOMPARE(get("local"), PinState::AlwaysLocal); QCOMPARE(get("online"), PinState::OnlineOnly); QCOMPARE(get("inherit"), PinState::AlwaysLocal); - QCOMPARE(get("nonexistant"), PinState::AlwaysLocal); + QCOMPARE(get("nonexistent"), PinState::AlwaysLocal); QCOMPARE(get("online/local"), PinState::AlwaysLocal); QCOMPARE(get("local/online"), PinState::OnlineOnly); QCOMPARE(get("inherit/local"), PinState::AlwaysLocal); QCOMPARE(get("inherit/online"), PinState::OnlineOnly); QCOMPARE(get("inherit/inherit"), PinState::AlwaysLocal); - QCOMPARE(get("inherit/nonexistant"), PinState::AlwaysLocal); + QCOMPARE(get("inherit/nonexistent"), PinState::AlwaysLocal); // Inheriting checks, level 1 QCOMPARE(get("local/inherit"), PinState::AlwaysLocal); - QCOMPARE(get("local/nonexistant"), PinState::AlwaysLocal); + QCOMPARE(get("local/nonexistent"), PinState::AlwaysLocal); QCOMPARE(get("online/inherit"), PinState::OnlineOnly); - QCOMPARE(get("online/nonexistant"), PinState::OnlineOnly); + QCOMPARE(get("online/nonexistent"), PinState::OnlineOnly); // Inheriting checks, level 2 QCOMPARE(get("local/inherit/inherit"), PinState::AlwaysLocal); QCOMPARE(get("local/local/inherit"), PinState::AlwaysLocal); - QCOMPARE(get("local/local/nonexistant"), PinState::AlwaysLocal); + QCOMPARE(get("local/local/nonexistent"), PinState::AlwaysLocal); QCOMPARE(get("local/online/inherit"), PinState::OnlineOnly); - QCOMPARE(get("local/online/nonexistant"), PinState::OnlineOnly); + QCOMPARE(get("local/online/nonexistent"), PinState::OnlineOnly); QCOMPARE(get("online/inherit/inherit"), PinState::OnlineOnly); QCOMPARE(get("online/local/inherit"), PinState::AlwaysLocal); - QCOMPARE(get("online/local/nonexistant"), PinState::AlwaysLocal); + QCOMPARE(get("online/local/nonexistent"), PinState::AlwaysLocal); QCOMPARE(get("online/online/inherit"), PinState::OnlineOnly); - QCOMPARE(get("online/online/nonexistant"), PinState::OnlineOnly); + QCOMPARE(get("online/online/nonexistent"), PinState::OnlineOnly); // Spot check the recursive variant QCOMPARE(getRecursive(""), PinState::Inherited); @@ -427,12 +427,12 @@ private slots: QCOMPARE(get("local"), PinState::AlwaysLocal); QCOMPARE(get("online"), PinState::OnlineOnly); QCOMPARE(get("inherit"), PinState::OnlineOnly); - QCOMPARE(get("nonexistant"), PinState::OnlineOnly); + QCOMPARE(get("nonexistent"), PinState::OnlineOnly); make("", PinState::AlwaysLocal); QCOMPARE(get("local"), PinState::AlwaysLocal); QCOMPARE(get("online"), PinState::OnlineOnly); QCOMPARE(get("inherit"), PinState::AlwaysLocal); - QCOMPARE(get("nonexistant"), PinState::AlwaysLocal); + QCOMPARE(get("nonexistent"), PinState::AlwaysLocal); // Wiping QCOMPARE(getRaw("local/local"), PinState::AlwaysLocal); diff --git a/test/testsyncmove.cpp b/test/testsyncmove.cpp index 96f05535c..37d80f97b 100644 --- a/test/testsyncmove.cpp +++ b/test/testsyncmove.cpp @@ -70,7 +70,7 @@ bool expectAndWipeConflict(FileModifier &local, FileInfo state, const QString pa auto base = state.find(pathComponents.parentDirComponents()); if (!base) return false; - for (const auto &item : base->children) { + for (const auto &item : qAsConst(base->children)) { if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("(conflicted copy")) { local.remove(item.path()); return true; @@ -593,7 +593,7 @@ private slots: } conflicts = findConflicts(currentLocal.children["B4"]); QCOMPARE(conflicts.size(), 1); - for (const auto& c : conflicts) { + for (const auto& c : qAsConst(conflicts)) { QCOMPARE(currentLocal.find(c)->contentChar, 'L'); local.remove(c); } @@ -890,6 +890,29 @@ private slots: QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); } + void testRenameParallelismWithBlacklist() + { + constexpr auto testFileName = "blackListFile"; + FakeFolder fakeFolder{ FileInfo{} }; + fakeFolder.remoteModifier().mkdir("A"); + fakeFolder.remoteModifier().insert("A/file"); + + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + fakeFolder.remoteModifier().insert(testFileName); + fakeFolder.serverErrorPaths().append(testFileName, 500); // will be blacklisted + QVERIFY(!fakeFolder.syncOnce()); + + fakeFolder.remoteModifier().mkdir("B"); + fakeFolder.remoteModifier().rename("A/file", "B/file"); + fakeFolder.remoteModifier().remove("A"); + + QVERIFY(!fakeFolder.syncOnce()); + auto folderA = fakeFolder.currentLocalState().find("A"); + QCOMPARE(folderA, nullptr); + } + void testMovedWithError_data() { QTest::addColumn("vfsMode"); diff --git a/test/testsyncvirtualfiles.cpp b/test/testsyncvirtualfiles.cpp index 425305b65..1dd091dbd 100644 --- a/test/testsyncvirtualfiles.cpp +++ b/test/testsyncvirtualfiles.cpp @@ -13,6 +13,34 @@ using namespace OCC; +namespace { + +QStringList findCaseClashConflicts(const FileInfo &dir) +{ + QStringList conflicts; + for (const auto &item : dir.children) { + if (item.name.contains("(case clash from")) { + conflicts.append(item.path()); + } + } + return conflicts; +} + +bool expectConflict(FileInfo state, const QString path) +{ + PathComponents pathComponents(path); + auto base = state.find(pathComponents.parentDirComponents()); + if (!base) + return false; + for (const auto &item : qAsConst(base->children)) { + if (item.name.startsWith(pathComponents.fileName()) && item.name.contains("(case clash from")) { + return true; + } + } + return false; +} +} + #define DVSUFFIX APPLICATION_DOTVIRTUALFILE_SUFFIX bool itemInstruction(const ItemCompletedSpy &spy, const QString &path, const SyncInstructions instr) @@ -24,7 +52,7 @@ bool itemInstruction(const ItemCompletedSpy &spy, const QString &path, const Syn SyncJournalFileRecord dbRecord(FakeFolder &folder, const QString &path) { SyncJournalFileRecord record; - folder.syncJournal().getFileRecord(path, &record); + [[maybe_unused]] const auto result = folder.syncJournal().getFileRecord(path, &record); return record; } @@ -32,11 +60,11 @@ void triggerDownload(FakeFolder &folder, const QByteArray &path) { auto &journal = folder.syncJournal(); SyncJournalFileRecord record; - journal.getFileRecord(path + DVSUFFIX, &record); - if (!record.isValid()) + if (!journal.getFileRecord(path + DVSUFFIX, &record) || !record.isValid()) { return; + } record._type = ItemTypeVirtualFileDownload; - journal.setFileRecord(record); + QVERIFY(journal.setFileRecord(record)); journal.schedulePathForRemoteDiscovery(record._path); } @@ -44,11 +72,11 @@ void markForDehydration(FakeFolder &folder, const QByteArray &path) { auto &journal = folder.syncJournal(); SyncJournalFileRecord record; - journal.getFileRecord(path, &record); - if (!record.isValid()) + if (!journal.getFileRecord(path, &record) || !record.isValid()) { return; + } record._type = ItemTypeVirtualFileDehydration; - journal.setFileRecord(record); + QVERIFY(journal.setFileRecord(record)); journal.schedulePathForRemoteDiscovery(record._path); } @@ -186,8 +214,8 @@ private slots: QVERIFY(fakeFolder.currentLocalState().find("A/a3" DVSUFFIX)); cleanup(); - fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2" DVSUFFIX); - fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3" DVSUFFIX); + QVERIFY(fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2" DVSUFFIX)); + QVERIFY(fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3" DVSUFFIX)); fakeFolder.remoteModifier().remove("A/a3"); fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly); QVERIFY(fakeFolder.syncOnce()); @@ -431,7 +459,7 @@ private slots: auto cleanup = [&]() { completeSpy.clear(); - fakeFolder.syncJournal().wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncJournal().wipeErrorBlacklist() != -1); }; cleanup(); @@ -964,9 +992,9 @@ private slots: }; auto hasDehydratedDbEntries = [&](const QString &path) { SyncJournalFileRecord normal, suffix; - fakeFolder.syncJournal().getFileRecord(path, &normal); - fakeFolder.syncJournal().getFileRecord(path + DVSUFFIX, &suffix); - return !normal.isValid() && suffix.isValid() && suffix._type == ItemTypeVirtualFile; + return (!fakeFolder.syncJournal().getFileRecord(path, &normal) || !normal.isValid()) + && fakeFolder.syncJournal().getFileRecord(path + DVSUFFIX, &suffix) && suffix.isValid() + && suffix._type == ItemTypeVirtualFile; }; QVERIFY(isDehydrated("A/a1")); @@ -1367,7 +1395,7 @@ private slots: QCOMPARE(*vfs->availability("online"), VfsItemAvailability::OnlineOnly); QCOMPARE(*vfs->availability("local"), VfsItemAvailability::AlwaysLocal); - auto r = vfs->availability("nonexistant"); + auto r = vfs->availability("nonexistent"); QVERIFY(!r); QCOMPARE(r.error(), Vfs::AvailabilityError::NoSuchItem); } @@ -1691,6 +1719,166 @@ private slots: fakeFolder.execUntilBeforePropagation(); QCOMPARE(checkStatus(), SyncFileStatus::StatusError); + + fakeFolder.execUntilFinished(); + } + + void testServer_caseClash_createConflict() + { + constexpr auto testLowerCaseFile = "test"; + constexpr auto testUpperCaseFile = "TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{FileInfo{}}; + setupVfs(fakeFolder); + + fakeFolder.remoteModifier().insert("otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_subFolderCaseClash_createConflict() + { + constexpr auto testLowerCaseFile = "a/b/test"; + constexpr auto testUpperCaseFile = "a/b/TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + setupVfs(fakeFolder); + + fakeFolder.remoteModifier().mkdir("a"); + fakeFolder.remoteModifier().mkdir("a/b"); + fakeFolder.remoteModifier().insert("a/b/otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_caseClash_createConflictOnMove() + { + constexpr auto testLowerCaseFile = "test"; + constexpr auto testUpperCaseFile = "TEST2"; + constexpr auto testUpperCaseFileAfterMove = "TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + setupVfs(fakeFolder); + + fakeFolder.remoteModifier().insert("otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, false); + + fakeFolder.remoteModifier().rename(testUpperCaseFile, testUpperCaseFileAfterMove); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflictAfterMove = expectConflict(fakeFolder.currentLocalState(), testUpperCaseFileAfterMove); + QCOMPARE(hasConflictAfterMove, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(fakeFolder.currentLocalState()); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + } + + void testServer_subFolderCaseClash_createConflictOnMove() + { + constexpr auto testLowerCaseFile = "a/b/test"; + constexpr auto testUpperCaseFile = "a/b/TEST2"; + constexpr auto testUpperCaseFileAfterMove = "a/b/TEST"; + +#if defined Q_OS_LINUX + constexpr auto shouldHaveCaseClashConflict = false; +#else + constexpr auto shouldHaveCaseClashConflict = true; +#endif + + FakeFolder fakeFolder{ FileInfo{} }; + setupVfs(fakeFolder); + + fakeFolder.remoteModifier().mkdir("a"); + fakeFolder.remoteModifier().mkdir("a/b"); + fakeFolder.remoteModifier().insert("a/b/otherFile.txt"); + fakeFolder.remoteModifier().insert(testLowerCaseFile); + fakeFolder.remoteModifier().insert(testUpperCaseFile); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + auto conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), 0); + const auto hasConflict = expectConflict(fakeFolder.currentLocalState(), testLowerCaseFile); + QCOMPARE(hasConflict, false); + + fakeFolder.remoteModifier().rename(testUpperCaseFile, testUpperCaseFileAfterMove); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); + const auto hasConflictAfterMove = expectConflict(fakeFolder.currentLocalState(), testUpperCaseFileAfterMove); + QCOMPARE(hasConflictAfterMove, shouldHaveCaseClashConflict ? true : false); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::DatabaseAndFilesystem); + QVERIFY(fakeFolder.syncOnce()); + + conflicts = findCaseClashConflicts(*fakeFolder.currentLocalState().find("a/b")); + QCOMPARE(conflicts.size(), shouldHaveCaseClashConflict ? 1 : 0); } }; diff --git a/test/testsyncxattr.cpp b/test/testsyncxattr.cpp index 896d1171e..670478a41 100644 --- a/test/testsyncxattr.cpp +++ b/test/testsyncxattr.cpp @@ -45,7 +45,7 @@ bool itemInstruction(const ItemCompletedSpy &spy, const QString &path, const Syn SyncJournalFileRecord dbRecord(FakeFolder &folder, const QString &path) { SyncJournalFileRecord record; - folder.syncJournal().getFileRecord(path, &record); + [[maybe_unused]] const auto result = folder.syncJournal().getFileRecord(path, &record); return record; } @@ -53,11 +53,11 @@ void triggerDownload(FakeFolder &folder, const QByteArray &path) { auto &journal = folder.syncJournal(); SyncJournalFileRecord record; - journal.getFileRecord(path, &record); - if (!record.isValid()) + if (!journal.getFileRecord(path, &record) || !record.isValid()) { return; + } record._type = ItemTypeVirtualFileDownload; - journal.setFileRecord(record); + QVERIFY(journal.setFileRecord(record)); journal.schedulePathForRemoteDiscovery(record._path); } @@ -65,11 +65,11 @@ void markForDehydration(FakeFolder &folder, const QByteArray &path) { auto &journal = folder.syncJournal(); SyncJournalFileRecord record; - journal.getFileRecord(path, &record); - if (!record.isValid()) + if (!journal.getFileRecord(path, &record) || !record.isValid()) { return; + } record._type = ItemTypeVirtualFileDehydration; - journal.setFileRecord(record); + QVERIFY(journal.setFileRecord(record)); journal.schedulePathForRemoteDiscovery(record._path); } @@ -217,8 +217,8 @@ private slots: QCOMPARE(dbRecord(fakeFolder, "A/a3")._fileSize, 33); cleanup(); - fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2"); - fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3"); + QVERIFY(fakeFolder.syncEngine().journal()->deleteFileRecord("A/a2")); + QVERIFY(fakeFolder.syncEngine().journal()->deleteFileRecord("A/a3")); fakeFolder.remoteModifier().remove("A/a3"); fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly); QVERIFY(fakeFolder.syncOnce()); @@ -436,7 +436,7 @@ private slots: auto cleanup = [&]() { completeSpy.clear(); - fakeFolder.syncJournal().wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncJournal().wipeErrorBlacklist() != -1); }; cleanup(); @@ -708,8 +708,7 @@ private slots: }; auto hasDehydratedDbEntries = [&](const QString &path) { SyncJournalFileRecord rec; - fakeFolder.syncJournal().getFileRecord(path, &rec); - return rec.isValid() && rec._type == ItemTypeVirtualFile; + return fakeFolder.syncJournal().getFileRecord(path, &rec) && rec.isValid() && rec._type == ItemTypeVirtualFile; }; QVERIFY(isDehydrated("A/a1")); @@ -963,7 +962,7 @@ private slots: QCOMPARE(*vfs->availability("online"), VfsItemAvailability::OnlineOnly); QCOMPARE(*vfs->availability("local"), VfsItemAvailability::AlwaysLocal); - auto r = vfs->availability("nonexistant"); + auto r = vfs->availability("nonexistent"); QVERIFY(!r); QCOMPARE(r.error(), Vfs::AvailabilityError::NoSuchItem); } diff --git a/test/testunifiedsearchlistmodel.cpp b/test/testunifiedsearchlistmodel.cpp index ea7de04ba..61885524a 100644 --- a/test/testunifiedsearchlistmodel.cpp +++ b/test/testunifiedsearchlistmodel.cpp @@ -265,7 +265,7 @@ public: return QJsonDocument::fromVariant(QVariantMap{{QStringLiteral("ocs"), ocsMap}}).toJson(QJsonDocument::Compact); } - const QByteArray &fakeProvidersResponseJson() const { return _providersResponse; } + [[nodiscard]] const QByteArray &fakeProvidersResponseJson() const { return _providersResponse; } private: static FakeSearchResultsStorage *_instance; diff --git a/test/testuploadreset.cpp b/test/testuploadreset.cpp index cc7d4c5ae..4eb55c88a 100644 --- a/test/testuploadreset.cpp +++ b/test/testuploadreset.cpp @@ -48,21 +48,21 @@ private slots: QCOMPARE(uploadInfo._errorCount, 1); QCOMPARE(uploadInfo._transferid, 1U); - fakeFolder.syncEngine().journal()->wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncEngine().journal()->wipeErrorBlacklist()); QVERIFY(!fakeFolder.syncOnce()); uploadInfo = fakeFolder.syncEngine().journal()->getUploadInfo("A/a0"); QCOMPARE(uploadInfo._errorCount, 2); QCOMPARE(uploadInfo._transferid, 1U); - fakeFolder.syncEngine().journal()->wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncEngine().journal()->wipeErrorBlacklist()); QVERIFY(!fakeFolder.syncOnce()); uploadInfo = fakeFolder.syncEngine().journal()->getUploadInfo("A/a0"); QCOMPARE(uploadInfo._errorCount, 3); QCOMPARE(uploadInfo._transferid, 1U); - fakeFolder.syncEngine().journal()->wipeErrorBlacklist(); + QVERIFY(fakeFolder.syncEngine().journal()->wipeErrorBlacklist()); QVERIFY(!fakeFolder.syncOnce()); uploadInfo = fakeFolder.syncEngine().journal()->getUploadInfo("A/a0"); diff --git a/test/themeutils.h b/test/themeutils.h index 4e8327e54..e180b0961 100644 --- a/test/themeutils.h +++ b/test/themeutils.h @@ -22,12 +22,12 @@ class FakePaintDevice : public QPaintDevice public: FakePaintDevice(); - QPaintEngine *paintEngine() const override; + [[nodiscard]] QPaintEngine *paintEngine() const override; void setHidpi(bool value); protected: - int metric(QPaintDevice::PaintDeviceMetric metric) const override; + [[nodiscard]] int metric(QPaintDevice::PaintDeviceMetric metric) const override; private: bool _hidpi = false; diff --git a/theme.qrc.in b/theme.qrc.in index c341ac5a0..cdc669023 100644 --- a/theme.qrc.in +++ b/theme.qrc.in @@ -209,6 +209,7 @@ theme/more.svg theme/change.svg theme/colored/change-bordered.svg + theme/lock.svg theme/lock-http.svg theme/lock-https.svg theme/lock-broken.svg diff --git a/theme/Style/Style.qml b/theme/Style/Style.qml index e6d906469..5c0453fe6 100644 --- a/theme/Style/Style.qml +++ b/theme/Style/Style.qml @@ -18,10 +18,14 @@ QtObject { readonly property color backgroundColor: Theme.systemPalette.base readonly property color buttonBackgroundColor: Theme.systemPalette.button + readonly property color currentUserHeaderColor: UserModel.currentUser ? UserModel.currentUser.headerColor : ncBlue + readonly property color currentUserHeaderTextColor: UserModel.currentUser ? UserModel.currentUser.headerTextColor : ncHeaderTextColor + readonly property color adjustedCurrentUserHeaderColor: Theme.darkMode ? Qt.lighter(currentUserHeaderColor, 2) + : Qt.darker(currentUserHeaderColor, 1.5) + // ErrorBox colors - readonly property color errorBoxTextColor: Theme.errorBoxTextColor - readonly property color errorBoxBackgroundColor: Theme.errorBoxBackgroundColor - readonly property color errorBoxBorderColor: Theme.errorBoxBorderColor + readonly property color errorBoxBackgroundColor: Qt.rgba(0.89, 0.18, 0.18, 1) + readonly property int errorBoxStripeWidth: 4 // Fonts // We are using pixel size because this is cross platform comparable, point size isn't @@ -48,6 +52,9 @@ QtObject { property int standardSpacing: 10 property int smallSpacing: 5 + property int iconButtonWidth: 36 + property int standardPrimaryButtonHeight: 40 + property int minActivityHeight: variableSize(40) property int currentAccountButtonWidth: 220 diff --git a/theme/black/state-info.svg b/theme/black/state-info.svg index 762de0370..fb9f81505 100644 --- a/theme/black/state-info.svg +++ b/theme/black/state-info.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/theme/cfapishellext_custom_states/0-locked.svg b/theme/cfapishellext_custom_states/0-locked.svg new file mode 100644 index 000000000..e0722f326 --- /dev/null +++ b/theme/cfapishellext_custom_states/0-locked.svg @@ -0,0 +1 @@ + diff --git a/theme/cfapishellext_custom_states/1-shared.svg b/theme/cfapishellext_custom_states/1-shared.svg new file mode 100644 index 000000000..014392d5a --- /dev/null +++ b/theme/cfapishellext_custom_states/1-shared.svg @@ -0,0 +1 @@ + diff --git a/theme/cfapishellext_custom_states/1024-0-locked.png b/theme/cfapishellext_custom_states/1024-0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..073bb7a207a4983242da965045419c4758571a80 GIT binary patch literal 12483 zcmeHtd012Dw*HrZf)j{b>%^dSYRd^=TNw>ht)@x=3xObm#8R~ihRJ}0A+ZkBs!(eM zTBce~i)4ooMFtt8RH=sHP~Cts1(CrWAToqVAjw_3_xzsU-}j$;pLs{|!-xn_)@M0`mymm1{XxY9`KK4P#5dJho#tY$%Z)tND-WElDaxfMdNczcN%A!RJ zuEB?EPVEUe$X;agt*w${fR;x|v>rmtCE#FcnC!u*y`sf6ti+~_i>37eNqf}jHo24@LO}b+5s#)WUyZO zk{HqIRKwV%8ST_D>=GsudXLR@U5v^AKMjXXG zXF@XdQ_C<#MfY@Qz02XJ(uSyL)h(g{XJF~0bEMshemeAB;^;+MtCee z%}})yV|bU4f78~oatU(yioA8Gk}$#7;2|?wUMk_Tk>UB`K9Q60&g+N7GCW(@df8$D zQtU-YV8=ZrE1Xq}#@kjp&NZf4Jh&d*9up{EhCjo@XSABxs|ARCeGx(j3jNe4?mp93 z5gh0H^=Y<6y*{yy#ErN^N2s7{O*cJ8c zAA68JK#(pK`}UMn@l{u7jdNN{r$X;jdzPNwCtG4fVJ}X3Lt*zh>dUu zcV;Cmf07?AGvnt^mgc(oR}#UfHkt>SJy0v`@vqcT;h#~Ywy{(s=!x2;>cP{Q@m4hp{O_d(dKu22P@MsrS?AzMuPUx; zH?H>Yu!O5^5AZ20zvPhfX-J(kqo-PPHe+LJL3&7aup%b6XR<7_PD>S7_JhoI4R#V; zL20vnv9I3>IA&dxQmc7D%!Ad=^$-UJ;ewkB3z?3vro*FS!oCxWD13LYy6z){#Pa7DiGK+7fe?I41OV)ctTgGrU}}9p62*!2}`6**cL%kF`4L zw){T$qm~z<`WCU5JPkwQN3U?xiX8*|NjXh=z4or=5s@BvA0dnH!T)64pjWT&60E&|ay(7=1UG5m$S= zijO4L>A-N6G{bSOFJXE)JE*o&~do_T}J z>LAr5p%!KXP^oRyv^hI=?D%Y8{VJxqrN~b1F;+AlK)>NqKBzFTv#c@}SPrD_6f~cz zCf4A!fTaC#cHrmIa0XzSOE5(2QVU;gfa+oQyg`t9JB|rMF)v7?;N*}Yk`7gR$Vzp` zE?ZF}&ZRT;b%TmsluqP@kf`1q%MVX@l%LIKS0^Q?nleh3)jpEbP=tXU#V{Z;zC`yk z@5`TUB_D8t=(h$31tsE{v|Iye|D-XJ@?6B4iHu=w`kI;rS&iXXqkp6|-B3^r^kr+i zi(E>1r`=RWaUEB%M!)<=jth{;aw|gZjd?^U%iY%!h$Zz1^fJhCLma4keeF3$mDo{l&3{OIiI&_J_Bmc!(T_=Mrc%==-(>4 z$``21YBs$dz2}O4?YD#$HEc#}JOq4t+KknooSiX8ac73TC~>`c#8zRbFwN3+0s9vV z-{fPm{A+xA++yhv=~oNnZY=5kf+)|FdR~O;Jgnhx9ZEJoo# zGnQ@v8H;NWkUd#F}@E3w9%xOA}O*8(MEIck8D7SrV7xGAM%S+ zPE8vN_SIBsT8LOkt_Yfk{I!;;vfi7HvYNuNNU_^CfKz3LP&vn26^mbk>dAWA=VyA; zZ3kR%Auk;DR!z}bwFdSreJpjK+6JY9_&J?Q6zUIZU&Crl)fuREr3KxPZD|aR8ScM? z*RLfRU9-0wCBz4!1qKLi?YDey%XQru#Xm2B!y11fC^G^C6{}R zI1iXF!^)*D<-8Qx)?KJ+z?N2sS|E<>ibY5&$~%U zNJs3O9+>j?0VMqx3dX@yr2CuQ8R}1NzR9~~9fs5h5c#Y}Coz^^A?f<#H&NVlq8ogP z`>_OULYc{}RSsB$mO?tEYln#J@2KlAa@f&+2ilxdi7DoK6 z_o2r@V%wk70#p3m!Xdn4FU%18Nm7{Vg`pQp>+a2nygK^?AeF;*CE~kmX5>vV!AmU&Wy$F8T=gNe0tYcR| z9ad72BrUDz(6h;1ThQwMZo&)SN+Mta0#QNX5cq$Klp_z(n=C#`ZW;2qV?Q`t4H ze#*xz18Vqvaz*DG;A0oG1~eCZpy$@$RV27R1X0VKXL59u02*|cT+?>JcDXT4Vmt0f zr}wWA;IT5o0AB~IRl4loEHUvC_6GNSKD`_{eZ55J%CrVP%GpWZEfk&A{|IUF&t^~r z*P+R?@!Zeo8}EUEc#KHKvll9n)B5u(puYY1K|Qggfscn-6Q097TMU?H5_1gR({2R|IUfE2=vVZ0kHa>|cSoK|8j0B)yyXmT*tA zq99lK%M3=O{satC9GDp}c^1)(kCAIyPCg(o42VQ+lEs!w-#eYe(e)n~Eq3!yuGAb* zwGs2gHGF|lrERa8uYRP}xw>`4Z1mw4XGHeibSbh)v2`jNG?zUQD*OtSbHg%z?Q!l@ zMv1e5Npm#b$~1-8Wo4Qp>6csmlwuAjspxBOma;p(wqWqd{aAH~^{a2P)qYVu8LM)7 zL{$&!LX{F_Rhu+K@_0O`Hfh?J?L|fQ&-ERXINv_|5?0}Nj1~Fi-Dmt`vckD+`5mB{ zr8*>DIR3}vyYDoOjuPYe5g_IijBr;u!L``n>h~jV*U~}_W{3=HT`MO+`C!jR#9e!bP+zR!0~d!jz!Y)PTh^v8fkCKTZccNY zZxtWfetHRaj+mg?`M4&(e#>b^K2|3jv~i;#hn9-68nd3kK$YSTVh>(1gem;-MR-AA zop18Aa#f}xsw8w7JJX4RMt`N_3UX*TgH2o{DujhBayyYa9tYcu#y=- zwFwfORQ=;2|Bn|jmZQ96RcD4$cq}>BN1K`vd3d!p@$sO`Q$>eC=K^40^{X4JU7sx+(nCe7|W5Wn^g%2g^%yNqQCce zkjGUm+g5EZv@UY%ebaZ%w!^O^bO~ZN*WR9RXWkvE?R^qs*qs>J+4l(NhtEFcPAfml zR7@(C;8&ogebtfkrcAMOiMO9OCt;0+Mbk;)Do33flW}KNrIgX-`4^Du*r0P<^Y~mT zVT73isOP7@R9#9~m_6a<+jFN1CRz5B#daQ&w2kLx^W!?)?<5WUwmWvJwH+p;-7?m$ zL+_tn66;!|xdF0^%8B%~{O|wR-pGxXO?7uHPV4T$Dqz8~@Lok2evuMUTEH+x4(-iY zX!E{}alO@8WN{u)L;gwfO-(aQqm>MuMVLCI+NFZ01-2fYShZH-o8ol!YOcB(UqcI> zFzR}>1WzyD@p!uBUQpH(-^o%JBw6TnA|at|WaIbZ=32LQnB_+=m}8-l^UB1Iq>i%& zoqL6EOU&y^s>VmmB1D<~@uEXe)=w%W8XXah4;w`uw)M86qt3t8EnMEoVU*SEP&gE% zN}^}{>zUfF9g0?`ielYQn|IygRK}_@+BOQB<%USoQ@7bsA5jmAQIhw4Hvb`yq2kh% z`GOv~4du+q0rC!=Q1h^DW9K`=%)Vza0}HU13@pFJ=)F-pP7Z&L&#vYTG9>Eq|tb3 zpqE4%r}>=wga`xCQpgq|wrlrxN4>=lmx4H1-Seg6b)Az=Pwg&S-GAsT)?^kikOC%= z@&=eM*~KADx=3@aZ8tl6v^dX4OG3y%%xi%UQlj>nfpAbm&8#@u;9w z7>3P}#wt@}iCf&@Gf5uInxD{bYgQF7BpJ3R6B1r7fl{|T~gSL|0SQH?l!gb_rX@vW6XMfE{Q^szP^n_E`8KUu_?}b5@llO+A1E zg2Tm@LFC{m)j$_$7;M%@JYWb@%aX>do5sH)cH%}1xFxxDgd){U7^5hsG|bIE_kEsm zc>nzj=T_T z3xvZg(>3&SWu+BWdsMo%-2xR^4SuG-H@kO?#?rR#>7H-cUM(7YARLCoJ%8q#+(;r@ zjs(TL&Jl{}y!FlAZ9GHKRkCv2V0;X3?2}11!2VFOGEE=*PD%x@X~azOYhD2TBslZ< z2<{nJ$5|;q;S7`I1INLkd`x|n*jK=iu1(~rYT7mi*nq-1@C+qZ(A#WkwE5wayJ3_| z7i?EoCRMlwP5qK@&gd&J1#I^`nN0n($~_d4!i%D}v>2I5E2G`o0LpoD*mdF+R4;+}+V`aMQv8!_u5 zT>|X(zXnLR-(_)hvp!03O6;_8R?{`?5+j}cOK#_++CfSIt=K+s+}vm~KkyJT9?gqq z*6#pVtzk&I6L3~;i4@fxoi_G=92At|9qhm}{&b`YuNK;^qo2F3dPrObrNm!Csd4Le zgueS*re*?|@lL)l55U-rwcte{4%j}}A+{LA`h0EUTFujqnAzX$JCR_4OkUn3djJ1* z5Rbw6%o9rTI;a-u#h4ozg-2TxrT8qHdktu?Mk(Ut59lR}XPA+{y9PQ*I+$vhLjvef zct)|M-Se?W^mIqP!cLW&3kXG4$r9Dh-a`MYw|t_CPVUFT2UPb z1XD#`PtpQ!zYi7K0%hK;aChb*8(H6gG!r;|HkvAsC5w5_A!U?Ya`R&B|6M#np|G(r zdHIq^16%Ls1tmjW$px@*zJZvqnmuS;xtRYBGKy&>Mo72lT(j4b|8X^O;p&|6}kaAL6Uy_~ruehU6OF zEAZj)TrIHvT`GF*4F%0l)BCFCiSK|+4KqIywPZZKia9_5$y)L<75Uk%r6Z@e6Jr+( zY^F|I9{}3IcMVCmG#EUyaSM{v!}bh`7E(}WpCuGbWqpwwlxNg$y`R+{hICy(hza35 zuV6W@rGM2Avn%R!Xk7;=`_0J1bb*bN&U+D(?1QNR*$iONs{CR98$9k+U}WEI6qvTm zAiKXApM%QToO37yS~+>%TbZL=G;{?8^#tIJsethHAKC_~7(3)d+Oq+B z524s)Ju%bhLgFlhvOMu%-Ltdj;X`nZ+mkVD@Iyx<77yE^h-$l`Q>II9SVNv37gGP0 zuTw&XJI(CKq=3Z1snL7+ix2Q!!G4$_+CORp{-3vAd>R-mO-l&l-WxGn8h@5}1EINP zh<+m80t`=k2^vt}b?6Tw5)`PCj$eV?K7=PHjisZyI+9z`G~P2ZwQ#V8E^kI?&`j_Q zqKDXxwQBIuKlJ*02O=R`ozeLv zWD{sugzQ1qU(dV4Auj4%Spre-uQ6P{1eaLsS<5OZ^R^+BQO2s_G?f zga0A@=Yc)s^UKlDj2HqO66;k4Q_h7Ih#f;k>rs;@c`jb10a;wi%_W`#$N}J6CJ_Dr z^gYz+2Q5k(ur+*{2~C>ssal zx_4o6hkesvE=huSANcNQ(6NWLzI<8K9UT{oqXlqG~AuEQa<|6 zPtDQL&@4Zzbr0SM?768RgA0cW-G+j@04r7_2egBR=+jS;;BJEX>+Yn*#<45V&=y2G zoRtj=!t8@CIK_kUs&+`R6Pz85{k_d#HE|7G+C4u22DmT&dBGE9brq8LFW3J+6J3wM z{qGqFHm%a`9n}8E zh&f3Bm>D=}l$Nne;Nlo*5&8p!ONp{F-Sxvm zt^6!-9)9d86!LA$dh%6j2wzAclqDcvkvSYt!Z)W>D*5*5N93zu5uC67pM1#7k_m^^ z%ReUnFTlSdzP~X23zPSMIk{}uTzwh|`T^fYUFtr&?ef2sa{Mm`|07ax|L^MVU(x$Z zm;Uvqi@#X@-(tBy|0Kqi3eRe=7SOeuekpVU7G zQ^P-}Pvbx5(!U<~D@uP+gDjN4>fs|Y41cM{|CCgc(f;@Ssa&SN?Q>M~bF(!WgME9v KJ{Ip{fAyaeL)M-E literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/1024-1-shared.png b/theme/cfapishellext_custom_states/1024-1-shared.png new file mode 100644 index 0000000000000000000000000000000000000000..637548affcb04f9a62461447eb542cb1353e6fb4 GIT binary patch literal 20840 zcmd_Sd0dmn*EsrwAVE>k*H%F`mv3uZ5mAs;pq2`46;XjCia-LUS=bwH&fMJU8ry{1T1pkZH-V_7>Tg?3FU?4^o^rC-Bix)4t z28|j)yXZlV0iHo2M@}EdLPA3Hz5RUxJ&rJs>j#|nN*mj;2E*23KmWMX=}h`aXZWYl z5ZCTmue!w>|F!Px9~AfhuvdBY&x$Md@s^lt*fu0hoI4?WL=E!I;kDs-!(Km}AWRL- z6Y?KBTeOAcuKB{RA!&u{QI&*U`lP?s7oERy?&>#d&vqC_M?`Pk__}z$ZhS;&-7PFn ztU5H#Qq^0#rS9i4uk!9W>1>1w(E5MwKa9t9YqWv=mL&t!Warg1wYIql$Em0&U+rA| z`*r?=iGJJMxNdG;_uOnezB$}l#$T;hVVK zTsPNFBcm0*S4jXhl0>07cuS}<4csv8BG%FDhYzPIDe&({nYbv77|0R%d(j;7%N~_* z!j4)EWL^q!E_V~&mGJRek3JD`#sI@aQ?u^~GkbekU~1i`f-v0x^Y1Ab`xi{lY2wZDc!W`SbPhOMhnnLU$i$3b=EXD5TW>FTHU0fZUE2CNqSV=^z0yF z;RiMT!jVQlaR?{>elxYZ^>jB6nnhOH{w1Puf@rEVc|-FIn3KB+5mE71nYa7*GD?`Y5w$BleJrH zh;LAU)+Y|UDAV}zL++hU(tWJ`Fx0o>HlfL}_KS$QpS0h^DZ0qq0$Pp#RN*$8l&y2B z&MR_q{{mWkCSPS&x7wPpf9X6Zyj!vZnyCHhL^z`G)3+?&PN&Ea*1w>&?o}h#WP4eI zBXLYzNVI}Pm~D03sNYNSCu%be%;j2ebou(qz;VUyPim!OY8-xkmzBA)hqip@7>``QH5=y(v@#uqg%Zt}K!EmrA>~Fl&OG+LXWLZo zG*G$T41^>4ufqqVzciZM76kFRWp_$~gO(dtuK?)a&ecx*y_0Govm@Ezq+5pO%4w`K zLC`_JR=^p*zu?Du*7A*k#ej2k{?P7T+1sEUZ0!Ny5Gx%d*%!@Q2Lvr|QP{#OyIpcB zXn9jLbg*3~{~*4?uh~-0ZvJ?Y*v*-aSA8x~haSOhs{%r?Ke-qZ8$^!9Hz}8|M%gsD#KCPD5?d6>4zeb^BtEq~Y$Oj`~EnnMl-0zn~1TClk z?#{pE-f3j6O!0s*qC!)?1SiaZopaK1d-9XSMAhd*hS0;%)bc*LkZEDA{6~Ou^jB$^ z%fKIKA(=~Hmfe$Tfv23sSMb)X7-pE9`*dwiRH1}u*vSr`i6br(FGDRvO<)Z$2Ct5@ zz!IA%4PXi5mx*5c0186|abiHTrbo69E*Jf5c{_|D&a|WSzC(PZWQ}vn0)vzp?zi4P zdNBF%nVIP#WO@4g1E|(U=8DWix15EgC7wac_tqfhQm$>e@7DII&6-i#aVYX<@xz9l zrdIL+e_keT;JdP7Fv?T|G08EBQ+*zZOE1AXz5>yrP-mTC6!;#Em`FFm+v z92!jU!bk~Y@8_K?ndnYFASfL>5oRdbZAWL9V$k5L_X1&7 zEG<|@(B95h9M~ZUJH;9sT)W!~T1DAXy7+FxI(B^658}Qo8@-H4DyYU=6>ju4b47y} zUe4n@o`&|Z+z!~pqU^(NLS6|YXgMQAGtF(qOku;$q*rKr826441C8?)Z!@|-={@NN zVXIX;7O@u7^9R zQV?S48+1l;Plq*5$Rq86Hp{-YAd#A1e`2c{sCkgdiJ!#>(gj? zn(QpAI5*5mTn4z$E`ttLg2JuW)>dfo_M#0?%RyfH0<_ROwelD44`p;>!$Cgc6r!zR zXJLjM{!cs3#spQ8-t%69ghvDZ_Ev;H$dVHl*mzQ3^mRwqr;{SYNGs zx8D(%NOUP;5-i|c&%wtI3GmI_k!&RNn)@)g7RzCVH~NseEzDna$R&HG%&OK}psh-C zw*-!m73?`vb}|TKH-0$RKq@?oRHviegHr^{#Z1+47J3Bz+pGXFE}Z>(S&MDGt~O(A zDF8h&8J3BRw>{ml2&uSflb2I~hPFZvoA=6aZCFXyj1<@MbWJkeF z$+wPd>_xjgr1)-F{or!UYw+!k>V#?p5;FT+0|}${m}QY`Zor(-@Ta`tiY+B&6Po9~ z`2kmVR|9ipk%r_1>lABvaBZLm$ePWm2g^Tl(SdWz*!+bSGNt>do@YD%ycw*8FkhdP ziTt->rmDy=e7H)GLAmn&$iQRL#*B|7B6;81YL1C6XE;^)r9MZv9JiK+%0^+}2tokyXR##PyXJ`-WN6gd@tRTv2Vbt@D}UJnN_%y%L`6hjlTXDLbV^N6<%>uk}{PQMi!rwSffj2%V27EKeX zV+6~BU5TEOBd-6`T9JI^(TrCnlHbR}JN{>9`6BWv?}>VJ#IoNXoR4KNeqALS`Hc7_ z|Cz#nM($vO%9DICm<5a>c9@G!$iF>6cE6HD(1`h_ zlQ6-L|F4LP7^3x?7h2I-EZA{HwtT7HZ_C&qbgbpc%V=dKkV1t6lEU#~PDwHPP(wk|Tf1A^1wA zZqLk8Ozw<)Wwd~898i{%n!Y05TC~uDsYA5MCO6EG({(iE2$+WeiZXc{&EbRQnA+8+ z#$<+22b|$d+V&f4J9cOzz!y&!edsSo!tVd2PfcLnobb0+P2QQH(1pXW`^ku#&_8C# zd5O!|2+|e?=5@2cQlK+jqz<&!J|Ll3QIzdHPcj~Ng|24@5hHr%D|H!hiPY83AqlG6 zQqi>Hw=?88@kJvUGBcu*6Z540-gp>r0ezl?@%=9`Mxy)!^$jgUeY?S>tBV6%Wn+0d z^vE+oSIy9|$25SsXTw8MW#z|!FlHEV-QJf9JLLs@GNRGvz?XnPZV_Gs^1@~?g()kO zF$GL36Y!Nr-YL0Xay;m2u^gWR;OqQA@m?5zh7f=ZS~l0oy05@of*{oQ*St)K%nQ4>XlQOXP+f0l>GOk%5^1|*tlhKC(ornh_-&ZHgL>`!^5M<8Gi=~ZgYadPU1@!H( zTq2>+s#dlb?ay{w_`LM=1fUOu)|Rn1 z%BWU$7Mc3JKLSS`9f!5^tqe@7sL0>wNUPLk7fV9C7u1kj!(0sv1_p<-j*IQUqd`Jt z1AyO$N$-XFe}iVz^#P#$&nDslZUOF{Cvd_D1wwt(qSN|iajgLV9+p%P@1JXxh1`5U zB)4GDLbl)3HSY!5bC_jBj$|yG*pJWIQd$=wB-0?BmM>-NYh`bMRCecWpgcK35Edl< z72LuLFm+25Fc{om{mW$e0W=~UEw*#BlLOCRSNm8p8Z`>a#b}NUPnF#OtIQrnNESmP zWo&SHDT)YEtbzL7ryRvCM9DL=U}PauwxFg-srN#2C6HE=2$X&m<^f)BQJm^SQvt@{7Qoz_8^FiG^Bo4wVxIyD>>JPJfS@O!J{Wai7p}qqbvSYqSOvc5k7=}ep1)RljE6d~ zdJHuQhdDXaXmeA_^q+7hCjA7MhbI~ce)eqUSD+zDpqkilppW=Ht_k5VoCDy20NHuX z8Mq3!TSxo+N?1`wGGf+n;b*a7mJRbXcr}dGs3kD!u4JlVo#}R@YnOl|3orxM z0878f<lH(x&f-T#GK*T+2rM{`(xxsFTn>e{MJIhx;ma$WE%z6KJ|}(HEMO)rnARsd zpY7T2fzznnw?dLDE_Jv?dWp{weK7?B(il*1BYlEmJh}{@rj>VGa(AA}Ba%6>zTbV} zdv=)1&yDhdtW*_D=8UivW>(7RYVC9NR>w1LGj=~Mlw3wzuEhYnY}1ug=~?^IX^t!^ zRmPd#?x!&SBK7pM!kJd$ruV|?*GiaHO)-8Pe~HITMa^FqX6m}waa1@3X$zsHC&tU8 z@0v%C513GkMx^r<_PWRXxeG_fyUTBT?;5@+l>D*Py1ZYte`;p`>d%i7NUHGsm;wW`5~f!x zSJ6-9rf>PxU5{1YWl5^LuwvIBg0ysmAg zDwF}uXhviIRJ`o3}!ja0V4|5blRwcb>I$?Gq zzWl(+#_aO=(Jz`K4D?I6VW31u~AcRY_%xi%o(v-nm<=pdewQ3`*$MUAY@JS zy?5C@E}F9N(z`=PA2*cW`lYiq$hvWZLJKK2E%iD#t&3(ZA#qiyMJAmZALjRD4}9Op zzup!!`U|W_J&)%-&*vZV6c&b2F^itx2n)`%(LyhW>M|Zsvgh^O4HJjY&?iBKZ0uJr zkN$n4yz8U}E3$EaO9jdIK?Ur%a@Wp=nON>WS@~jXQPXbusLi)0%8RaWbbZaQSW24R zM?E9&NUS+3e+=HP>ky6mFu3(q)(Sz{9N zhpnf!$tAkGFIr-iB{8wL8EYtyK6y)giP-qDn9_1O+4Ez5UEbIl#U0xcK2vP8;5GKl z-fk^FV17I&)h_bMkn&$Siv%zAy~9#&263HnSFc{3hKJtsHx8uf$IFO}#!nJakMZg63lm#Pd*lJ#MO>nS<$k> zz2(!9BcCdqHy3mrh}>Ul_c!oB@4m)N5^X^Bo*%EBo4j3W_;}czim6Pz%C=6owPxHX zDG2+ybb@zSuAlcNGWn2W-6^KT%jSL@<-0jcrH2X1$kjm3cs_{ShMMa!oK2K+H~8uP zJ)m1Z*;qR=d{>{WYyWhf$#!99Z^K4OZA|e*k5~CEH|a6f%fYqG{|exPM$GnT%|V8` zo>LF$1A3f^Q@6YHwBzLSsn9)O%r|kW)ao8O@dG4Yg9PChQ-I}lgxV)3cQnm>%l)SY za^hBmoU_@=XcNo3L+kswTX|V;_uwPAKZ+|gf{-z>f^wUPX zJ2#3Ibk!0(U*lSnh3ZqmjfMTINAZ;(&1Aoi<+;&>LHvdC>@Ck38_yUpcdT}nJ(Pe6 z5iOZN+_<)9L(GC?4QzO$g~R(S?}d4a9SpbL`x< zZMpAnBrL?NRKgRQ?=V%#tI)<1jfGV2jOagnz&tk21TN2Xvg9B;-ngsY;l93(#>oo{ zcZPl|Gcnmd3)xS#KAR0T&mfd`a&7vQFKe`;oLx2(L-?e1sSAGjOnhG3K`36@|4|Kv z(4g^wWM?()>%(Wp^19qz+dt(mxLSi40>|xo+?HZzj)gHsi7q`S+Z=B# z@Lm&bTO8f^eb1l7&Z_yDZ=q1?JRMLH*s~BW6RL1+Ac0C5k%q%UL`U0&bTH3;i%k25W`PysqUg#JAUyGh=lSLM6^>Xgs zFVw5G?r4wU$ebb_rX%&;oQ0gBOl?U2Ee^O}#u>7mT8*NjUA~xJ1v%A!Ho9wYtzePc z;Yb_tBXlw+1pu~9WQZoA;$%M_vS@0c4~OI?b_KcZ8!FsGvjB%X= z(I{t#{PF@EJ=pZ`6TDXT{6BXAC=BIfY%Dv#x8x5(Jz+prePZkp7IRo<`@ zW20ztkEw#d0_rk+q8&~W>^trPRue}O`I{b=o)JUlNbbP)zs4AI+Wv=TWfx%_qZcNx zNhOJbEe=S35To3z=p2ZmWr-5jKKzuRaZ!#PQ$Yb5R~_@s*(OW7OTi z@*Q<3Eq@6mZ%A{J*xD#Y`gJMRKXe-(r>W^`D`LU_hJa>Q;NqV7bei-~DtPN(g0l(9 zBoi-ZS(&5*5lKP8iMkRt`7x0*0CgYC1!8@ys#ldg`-C%8DXTzINdkUFKf`nt_aG>S zLLiB~`7SuTkxWI#(>YrCZ~YLLpcrCr3`umxnri8d7+DXDm||r112=kPA7pF=DEq@y z>L3}^y~l?+Dv0WvpthnVkOb14`xeeGPk>}xk z!rYQ$pnK{lRw0`y2sEs(_Up3Wqj{FLVD$1FDnCy(9#&oxdHxz(F*<(((7OrIyG#xR zgWS4rph2*DB8ZOZnbm3f3l?60mTm|#_9baz!;=->3#1l5kV4CPW2~u99`7h%O^8&N zR~SRAYT`OS{RFMTOQ25hQj0_vqUwvt9~?`Os(>UolzCW~UvdVaB>~!z<(e2*>;PF< zffS91@x}7$D$>fNA(Ifj!#2PyYLrC8d>?3}??xD)$6m(9O%F-;vyL%UF;i`zg^qAc z2oY&I=yRX@|*SWzkd6I}Ex9-(;&fLp71a?gM_Y=+`FA zUj4dv!3adb08wNMX8Oc|%d34Kjn%}0;7!+QVw7n=m?DJ&L@<9bhM@GHS_z{8jVWuz zOjA}v8keDkAliH(kgdRVos+?Eiv9#0V3P|-Oi3A-A}kFyAXb+`5)I9{KweG&IXjGT zT#ICCnRvg;4QlR+>Z$LN}x*jz}k_!e;+bXX9GrfqA*TFOx! zgpG&Ui-kBJ!g;Kz24l#|LLt)_d=YFHJ3dg65v`xg%U4CjP(eeniWaN|PIp+EXCM=H z?^0}PfD0K-#wPUH%2e!mr{gGOfz}sZhN)AuHL;v2D2!k&YY?%8OR>GR5^D_QZ7|RJ z73^zsam3~<8_d83b^Cw-i&52seGt?ObE(20J8&B4@q|S9=PAXWnFOb1+G?;~B3ndY#&L4bjMbJ}Yte5=v>9F)Gr}E( z!J1%_u~iiiF{R5Wa#dxV>L4-Q)pD&2%oQ;od3UvvDALjc$e|+Bpm&P|pONSj@@|*_ zh%NJlC>y0ENIV zq(_3vW9eT*XV{;R$WFfwV(eibRyb4ixw;`bg_N=G>N0kzWfV+4W`ibQuY`p_{vbsS zO%68@Iz~@{hWrlm&{vb$rI5B#w?lBA`lNI%j@6+IYsgbS2N__-FO)=oJp^4zLsYdG zklC*{K%I%Mj4-WL!mgph#fT~TV*K;<4f@)nj_r{bF+30hh8~zfu`d(_w2`P%z6CU> zh*5|#HH?0^NySjA%lEJ0FB0uUvlgCT#vW>qhJ_eH{Q7E;*yj z7wvUXk|72q6jKfKcY*lFc9H@I^ExvM}(xN4Ysp^8R=yrAK!fz3ck;9BoSO!QnGgB(xw zU#%2OV4#GREg~nqE>Oc5N0wp{DoT3SymaL-a(GC$u`g^zbR@loOc8=X|04lANgxcR zCunbB#?_bzvOix#g5&>&{@*aJT1x-A-bxPhVVyetYg8pw@qkL2fnd+YO!?pYbakQZ z#I~c=^FhRl7`qnaqY3*_y=R^vh}5NUxn|Wf>~|gl`@PC*IV6jel`zOIzF7-|4QL?V zw5rkHb{d$e0#rVgAc(&WJJ@OdmFP1dV+UoW!7oSpj|od-MAkmkgKA z6n7PN%o!W86s~)PsMaZ9qMuu^`wqucu%6$20fX;iPzES8V7_K()J;Py<*)@5j1mkW zQzzFH)H$Lq@7xNVsG5|p4RyjuRE!@!4wD;z;rlBCAob4ggtXFHt26d>9IFHJV&?Ow zwE zZdt+(Dww#MO%f$Ln?MO$6V3uzM9itviMd_osPFv=0N)OF9};VQ;KwkUKq=X+f#{@g zitGhLhm)X8k=+!-+rODI?gVR?kN zc!3!8=!1eHI7$l{uEJ8uBk(?2%n~3?>f=Rb$j0vL^Q_?Z7#5s>h=b$O)H2z5{MGPE z5`7C2`y14v%d;vEgY+miVkB?VfWupp%SYtxLds38T)}P(c_PUoJ_35WmK_-ieCRkI z>)^sUrO1AX7}ZKy#*Q)LhdGFUM^JK9a<{;Rt1|h^_gLjav_xqD6#f&-l_h&-hV|%! zCbCyPBr%yL#;%Gpa9Ilz=^z>w16_tRr-09nTh$TJnVH?jSY1slr^*T4bHNfSU;#fQ zgQHPw2UkhKc~`{tqD9pMIt-`1@C}@e$lcFjz}QvbMx8u-NSJTF4b&%H38oONHHH-V z23&rLj>K-1gS`N6E8>tifk3`=4;yx!NVR|@Fpu7EDF|x=2{FG1iW#xsA?7=rEK%uM zhbUgsq6`PdQ8MGPKhKI9IRtP51vwnJpTY{b>{^ek8np(f^L+qu*~sth+;S68tGs7@ zTrSrq)tDUdE1ViHRDMJzNGY6G{{hYKY|aBGpQ4Z)+1a>#YN>8FAvRly$j{L!%_D*CW%hY`^G6;d-# zVAwO=UHG8H7nDT(6%e@e7@1+{pWj7|90fiMu7c*NgL50$wcqk#*gR@V0gJE{x#q5P zS4VAaRID9S?dccMMYXZmZZ9WbRs4Rg^Zig9<3n40on$OekiNp@JJMb3~F8zoe*!Z=WP6kqrE{zh!aa}YY0S0IF`UbrRb)W{{3 zmy|>T(=9(F@_GK|honpFYYh1xx@(a;1iy^M_-m~XPo>F?DNpwnUG3y4}zdx>>9 zRa6=}+IE9c747}7Ml>397j9P;qrnQHk!vv*h^WIeXu>BFUBuW0u*D261ZzV7d>)V2 zvI%1pz%t3h=c0D5d#--|Edx^(Oz#G)fXg$8#yeSCdtx~C+Ubk1q#9uEpdp+ATk`eq z!-X7(m(u~R0QAx&s$l47mDl@oc9?oC0^151fGvEUPuQ;CyWKJMdert|^Te3sdA5qe z7PNhyQ21(!3}r|}1Roa<;|(ALIAValEC}vIhlII92SjjPP{F0YvVp|jbtZzvV%ayY zAi39I0w@QTj+5~M?rOC}%-W6jk9F`=M7no6gIG{{gw=V5_(_JL9%r71>cJ4QN z#kgXw!(r`k(yqE~PW8*_yMM3oz|h)1omS*6`Q~Jv?N1x&&&XSstM+O=Ttd`c8(O3)(6VQ=E~goH^+CRU9E_XG;Z!{9*{_*njwdy*mb}%XGnZA?Y1(u z${xr{5-eie;_=-Y9@Wq8k0}uS#J{iadx#`BSg3?u@$`Wee7*#OGG;u%iwP91cXgMZ zaU?Mx<-zdU%b2ZMv3ZesR!LQ5bGZNf8JXE_^T*~qDBFCBFPEJs^fj%^9<&K3`s%k! z50&Lho>ykdf*g0shT>=6MOl~eN=iz+T^8J*uW`ioJuV14F24KBjIpBYuw}VKv`QBE zB}sJWTZNXB7Mw|APp`(>g*s_}m&Z}e;H#md_mH>)X3rI>KtovY^Xlt&-vgVUgl%q2E-l`JhQk6Q9ox$#jQ1a~+pLsMb!> ziovyMj9p-)sET=IvDA9*t!wqivYr+UmEWepQ;76M43~_3(gTe8_p!-J8z{w<{dwX}$Cd}}|JK}PsJF|Ajz-HX>khL7W-3ozL zf}g~)#~II$m$8l{_)ZyRXng3P1|DB8%4ll{!fLBDqn~Y`Oc_p1`a!2X%u!L@W0mD) zHk>DJ`&`>++{vCk10MFV-rd&h?SWz9=h?!RtSyC}mIK*DGq*8y^)B{S&xS1JmZ&Of z_d#hUF;y8|UprMdihrfqJ;{n@lWJ-X;#UqRrsSt}+VjPw0h8Iv29HKq}(oyr|M-_DF@9;_=amSo~KWcmg* zUR3GOdK1YHK1qR4G~tHr(^CCsz@xx49X1pN#*+`mw@za(2G%n2(_0@Yj+IoppQt@u zGmx4j>fD%c@$WT=xEJ{FV}n-b$R-7y<)Sra4~E2N$NlFoG{xQIrn(J;B)9zXxBLx+ zZ^m~W96C|xKb3JI$PLnScB~`flI+UBPcNH%$46Rc+}xi`!0pm+6ymnRjmT9bS)PPn zJYmvqVnUPM8@kbs`Ml4|ZoV^eavlbZMm&<>k6JeT4gCelB9*!=>du69x2MkJQ1*>$ zRf`0k!A6~ro_-fTNDZArm5=3vCftcHNR=tO>PuFUx?4WU{65w5Zw@>y4YS33h%&sM zn!J7CoR6_d059t6Sjpy1a;X&P?-G$yb@s+B%o=$Hu=cZLSW}Cc{qD@JmYFNO;=aSJ zpMqm4IwNUSZ}-c!hI>dcoi2?fk}73dYYJo?houKtKL~#229qvE>Nr{Q!}f{=&kptz zez;HSt&2|sn5z;x8aeK{I&ewOKr?{9;Mh36E}Y_Jc6}pt3s(m!uN{}BY1W5@N0_SY z3r}c`J9qFoR_!y!!L9=rv)_AKAMOlr?AD-O`clr@Homgyy`c|n?Q3L{$7(#`8pl06 z_gMzLQbk`YzAv>+;^kYj;p6c9Pow!=hg_d-jqd)m^WS1mv~#Nq*Y~7xlkbjrZjXEf zuX-NC6^Zl?^#@~n^L1#J#bIwN({~s(e1zhRO-ov8-N7f1O8if(w>eL-Xf53vfkC3l8AW#gP`Zs!K_gX>>_ zsgD0f;np8P6+vC+79s`8P@;8|b~o&#>ny?UmpTv7Ry!r0G#?yTfop8A@w>gnNc-(H zFFS31Q`(ek)X8JtP!rZ;^hdkCAXPb+3$|AIHEGxm+vwkGy)p@|BTPb_ zM-=xh*7GX;os)9<{!Wi_{&dGoNx`u$tqoLu?us=Gy1pTIHv4 z(~Qfa!pdiz8q4OTvYFKQa@AEogI#W;f@YUU0&v#^<1g~AYH~8~M};s|l@36}YlP<4 zwqLsU)phT)Tesf7vKHo#NM z!rzbtYQG?L?~@*3_22p7*^-%{MxQP2Cg#dl`W`uAg>Na`Waj{m&VkMlUoD2xn6qV( zBq3WfHDr9cT-#CjyLbI$u8MBbyY@o>kZ=Gj(w z_4domHF#$Q7j}+>e+z!MBI<|g-;w-v(=TN8Y-eM63gG*(Cl>C6`LibB9*+h*p5y)q(|AZ(V3uCOgPI7y zNBtG>RTkfsH03GM%@FnM4a}e67TFMf97?F74!ELFK|qGybO(aIiJ;E}iz#OGsCzS> zB!TMF?GP)D-^Qh>U8lvsBmD0mrqxREp&pq?IMgTU$# zn7TtQFPEpTeLiM#&G!%#4UKGz2L?}2NV(O>cE0wN;!j0%QD zTq=SjS5xRutUz%kTrxQUxwW2jfU+Ba=Y3?j9IXt@wk(Bdw2JGU5_vqhN;Z~G!m!x> zI0$7q8Fmxw;VEOl$X@shZBD-Sx1Cff9qW=xt)M9=@ z_|pPC8aF9)o4^J2Rt1=@9&#Hk>7`EP?%LLWx4Be7o9UxD-w0vQiOU)fK?H?~`4E^f zifFQ@VHG`E1$QuzNDhdF|LJyi49OavC>%B=16-ydP_ik*RXW|UuKxwPA7)wyU>0F? zaT6iTim5rf88RmcfNfth)!jAnNYGW57fcZ60i3?`w&zox!qr@Plb+fp1uTWz&gBPu z_pJ?LD^VYZkQBWY(d1_-QahZlsp{z zUepfrY*ZyFvhnwV@3AKQCT_>AhDS;psW7)hupSiaV=i$P9{{-3|7km&Ow16hte8BN zO^^eMJP7zWrN!pu5_r}zEJBmIqe+Pb?q1%)^xthMh++D!BB~k(tu}rTNSQnWa^ViP z5Ij6HQS~8_2ZEn{2-7-0$SL_fY*hmsqr9aktbqon`tpT=V%2=DuI%opHSO3G}?fPP=jsX1}`%(!9%$< zvUE6t(enbi@Mz+}Nw6BC2C!TP&lBTR1t)!hlEPF_3%%!E*?t%e9?X1)C@D-u)IHyd zPs5;JCh0JTNC(s_mHSvsEzM8BKC~$D^?6!R6IR z<{hkj(8CCFVxNJZHZm+&=GyS1H>HU^JZt@tmMMkmF+)OSc70!nk#?2vgJcfPND~ zuMg;*pajG|eq04UdA`fAl$>F%A;$&u(HM;wesdY_*_XJ8&%>40UtxFCL!e>y!Ll9< z&3O151+3qO#Kh_V7EA&O8} zO~8eXrLV^rtX3s~E-)kN2U@80EA1$Bw6WP0Spco=ZUMqLrMwn216D)yvCXAZDCq#| z(2ikefw)B<&9fz`z}*FygW&^6lCCK*V&orS1Cy@&{Sl6ODk@;XSHb4R=u2Z4Da1`& zARc9tNnW)G+e_HHj5tSbAS}0%yaAL^uM1+!&!1aC+E)q!LE66q@#=G@512vBE8HwJzujCIT zmoncBVp(uVVf_OyP^HKey&6FjOd8IqJrn8Gmd!iCR}DBDDOs)VbANZ`FraIpEeE<% zGFz<|kv+Yqnyt{{&ets17#QsSo1o|4f`L9DCk|C8lYWZ%Yul1WrchAQ?s!!|4b`<^`x6ANPWz0COK(z$sAPGTozgAL>&_ zZ=!Qulw8X3{&us7b0*M#LG5SMa<)YY%loh9JbMA4W|PghZO+;jrWDcb4r+#DB)pJ5 zj$AQ}^0AlTBXONCuc?(~BN3aXBqOz3%yUkI(kg%i9%k9IGC@G9e{Qg^mI2|PPvRbi zKiAC)G%I5!qhmfG6}$wj<7OaN?XPDm1QAozfdMhRW%)rB%vW(qNf0b5`Aj6xcLlAI zP3UWo3FSi?oVja|OiZtPaHpx$P<&uiP`DINne2#sIc-`Ug(qOF^r?Y~EEZ`rX54q3 zXd`qWCtfgplZe9O!EafE)UqXR3l%Nd?_sC>7ZU%C2=Z+ba$NDBp9rim@Jd`4)}W@X8l?RK`2{^pIKu68{zbY{1P<3w{=c+HtNp=4sw(AJYiTQ_-0QBd zmF<^PRl$mKT)~9%O61#d$nq`}Bd$7oB7w#ZOL3%sp6^2d?K?TzpVA$LeDfplu6}fs zr*jw{M!n(`AR%lxW#72cj6FK_5ahQQabS92I@fAn280BHLVthrkiXzMSe|^#nI6#1 zcY{a!f~KeqCNh^w#6v=5XKJ0o6UZft+GdZ5MFeCB@~(KmKExRJIuCU2vxK(!NYX%K5n!D{YBv4*Ij%~ARZ-mM>+%>`=A5Hl{lZy{x211Uos z?~YS_kbqn_1~;81)EfW@rcJKPr_x)9PBJbqoE}N3E<71t9GFsb7gW;uM1K z+l2>!H#jDr*rMZ}x7j$Vh3p=0%l5M|0owoRp-WqU_FrZuI_9^WhqwdWMl~n3`#Mn6 z5IlQ=8pXce5;Xq-X$kODtY zaACHJ_!i#`u@pKG*emLI`us67pk>tRpd|-I7=Z%_x9!Y6u`7NHM)*C>fvWHPmPKCB zZ14uh#|UqrrM-UFDl2ZjGzQ7MIxLUuc{Dz!KXV=3Shb+NF z&^@;BqV)I@7pTdC-`F~w+T|<0{V;oB}^H8)dJ`+R;D5*IGK-G+a<{C#FX@8Bpe z>i3}`Yo8x?FM(iorZStX-~fh{+5$hZlXiJ~6C}GJcs;#Syc#J!<4adpNO?eQp&u4e9_C19iJY{Bv?I0hZOxj#P9$=|;Y#Q3ze)&qYBKz)$)D(KNr@@oG|R6C zB#B%&14crtYZ?#GmN$D+7PgD!DZc;gAmc90NZ3DK0tXK4*7j*<_xn?846|k<#Fkrq z(Ec#6v*6OG4r|iMt9ol;71aPc{c}eqH;O;>da(KZW>Q{`B_8b`_A%hKH4F()3<%q1 z9(Jj4tBYA_>KnAPrveW(_MXTJXp3vT92&|hf+o}ZUdEPY+L2_hnqQ$#9-s!4*`vA+ z{2WvF9~uQW;VgP&z8xS{+gEZzj2HUrQY_L!j50jX;_f%SExAYZS9T9-K$6-?`U5Kh zAboEZ%)Rv?$7@)wb{+s$MTMa!S-biIu+Q}rSQ*B;V5e@E$fpw~=RI`-UB%b%2Y^n% z%%N@ZZG*=uN)34ffG&)62+%DJp^EQ(LGm2-3~BU{j=_Z@Z1+Hvy@_9u@q*IZy#5h? zbKj2(X#A&OD2T+GgmY-l0~DC|O(;{`j@QPQKQpQ}GjT3=wnQsJ?YfC?G0FJLN^-GL zuPTB!)bZ~*MSyPmr}VJwzJ?)fJ3I~1M@XlFo!|UZestkaiaj}l$wr}+0 zd_1SMZT5tii-#hiT-3%JQ}>>mo?_z}miRDtfLeu4mXJUHt`1ym^7ZdJEZw6j_IRyr z2nhs?xo^O!yX(`Bvp>faFzv=UZmv>35ed~$xp%_YzTd{~5>rrvw{xHbk24$V z-|UBxBBGck-oo*6cHr;T)%5b~q`Mw+b#guIYGJIZrH!V|E9~QJq}I2j*!>l_@N1ik z@G<1g|0Kq_?H9j3xB0K<05bgk9dQc3mR7gy%mLQNKYpwpZX!nUG>(a}h{iVXdQhTF19&tH4O~}U&3=GU$JzX3_D(1YseY*Q>qRjD+ z-+Ls>C#&srxsk9baMR?YM^5>9dj4UaBCD;vaYOQAPtBaj2+8dxkr5jvv=v29VC7Uy zRw>q*=Q-!-jN*Ck-y1#uTzPe~&GPp)=Woxs|MM*WjF}M7wQd!=#=)!v?G1uA7}l`= zYB+kpDS_z+PYvTeMt}9|8U^A%qW+zjwpjWG9}naCMz>?XIPWm`O=j98742uWBK(Q$ zuaMV_1spTtFP%@hyg|rw|6RCk*SkmSyKnAl=nko$@pj$pB@JtRm#_FIP<(yqhgiXl-LLrdvt)Vh z&FD#ASU_1riPtX=jxKoDr9a*+eFJ3 zm}cx_dwEba+sNt6!}l5)`y!9rom$g6U-8FrsR!aerFXA?U|HSqd-suqgPYH3xSza# zfm`+LE&p9z=jVRU@%(&_qx{6}Gv^On5_;adBmCocvkSbt3UDaS0>{A7hQ z!_L_S+9_Sv{wl@pezM|^=OaIk1eKJoZ#?Py>S9lbNWKy{&~@hee!iKDY!}a5|DJ!Q zlCvz+iNEhd-#ahMIKTVM_1`BGFTK4zNBd>v)BZoln>3%zI`=E^---XL4u59oJ##($ zuko1|KVN?kOb{(%cqG$c!LD$Qv7?wM<_@KK?x$Hq)$8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11szF5 zK~#90?cKj_6jv0-@o(1HiICGkQXmLrNRtK=ifv4g(4Oypo3V66fg}gye_;cW>z>GGqc{gbI+N3e;?^oJJQ^_=Zw8GbLT9Gh=_=Y zh=@oo-m)G*rlx>-;1Vzgd<2{VX3NiafWLspz(ZgI_!ZcXK2izl1K>Ka1q_ZDe*#Ou zndqaI#@+{R0ez01_|fPCE5LhEk3c5&Ij~Lh#E-@c;7Y{fkRzG~z9D?#M`N|zmpF19 z_=Wb9Ka90$_Q@Z{&6bZNr*i-<`&DL*X=H0ptQ~=F&dR?UoU~(S=cksO!3y_Y*&iuftAHx>7mg z55_KVI^-m!D80j&A5gq9rbVHLNImhx_$<_fr6QNa4}j%BbC!gh5_yKSay&UQ;@ehFSBkX4xhiCp2#cJ6_ib?nbcnR#4@e+7cezpi)Wb(UK z-V(pge{aDq(9SDk|KRWoU(6mj-V=Y&Ns8CCb_48Zm*P7A#F+CGMa&*JT}u3@(-cMi zY=Zqfqqx26?haq99ync2{HPwqOB>fHp4o4fbJ#Cq8~DBa>}t6mcMo=A^}x9Ud`B9I zPe$w>I37ZYFIn}#QR1Dj?17`i8}rZuM~OG$r3a1@Z^Tm%93?(7Z#{67_{gqfpRf?I zPqFaxeAwwpo7WyVI^!ep+yh66k6;n|Br5TSe!xDNO1z;**e6wqH`Kp^sxyF~^P*Ej{R)A}eTH-r8Kv`$|FGpEbI%;`o@<}PBNOcjEm9+RzO z_ZBLI29~f-V2IG;;0b9#h_Hfv(o_hBPM}4h*}H;$qEraRRR z4y<9H92J70Y2sWNd`t13yj~A?Dpn7ilo~|D?4cAz%pN#hE`*ppluX3zfzzczh}lEQ zg_u2Xyca^O9!lBsRtOJ(pCasM72iKy7oE34h!Jb3RqX%dRtW3(UA}KBr$Sf>G-pZ5 zr4SZEO<1Z@FNAHJUm|*uav|IdI8Vt-u@L&e*^rZzgVcUFaw+Wej6}# z9h(ZExee<9RPa2uWO(hN^pr79aQy{nZXdX9J%~fxrWl(<;H`(!E)IWXJawLWDBWoJ zSmh92dMLd>i$cwK=%IA*m3lE?*+XeL!tqHBs~$@CfnyPlPsR|thtfUta;Q78dMGWU zGvBpXJ(R?;m_3xlv6wxS#-cTWHhRDX;4&}=oTEtWZ29>P#hX1(C?4r<01wf literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/24-0-locked.png b/theme/cfapishellext_custom_states/24-0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..d380716890310e9110d006f113411d1a4e62dd11 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9E$svykh8Km+7C@5Lt z8c`CQpH@mmtT}V`<;yxP|+n%7sn8f&bL!+xeggfw8^_3 zJ(_L7Sz4r5!FkY`0Z!kmmA%D`_cT)DMo#;LBwiUz+nh?wOyL zKEXdFrnhIGo&nph{e=uNjp>53XE58c5^XX7J+lG6^;XfEEI4`h9FiStsdUpT7 z1=R#?h3b9J1;Y6)IBTB^Enqod{6cx*{TL=E#ti8%eHRX^c-%7WHTtn;UYeJKVrZ3v zw{-P^QxB|D5{}MeE$}n?c|(5M+FH&v|0J(4mO8L9eOd3sczTY{)Z)MOUm4Y(x?Q-l SN$D5RcMP7celF{r5}E)PfO{AK literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/24-1-shared.png b/theme/cfapishellext_custom_states/24-1-shared.png new file mode 100644 index 0000000000000000000000000000000000000000..ebeea1710ae963ba45ad935161ff3e0b222e465b GIT binary patch literal 405 zcmV;G0c!qX7Fu*R|Fdd*yKbt z9O4{1;;YFU(`8(@)(_%*>N=)*D)OP7^kYD=sHpX8k|^@OXYI8`xir1RQ^x*V3HG0| zemD~$465RWcEY3Nfl3G$arV#S9cOqA#Ld?)NL-*<28kXS00000NkvXXu0mjfeW#?m literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/256-0-locked.png b/theme/cfapishellext_custom_states/256-0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..4d24d7478e864b5808044dc0235b8a218a54e340 GIT binary patch literal 2257 zcmd6peKgyL8pnSTLTP2CoqF%ESr?>tMTSZ=rKGD+N@iX=YeN;Aw0w{xE7e7@&A|9sE)kLP(RBJrWS z%7kuOt`KEL>ygZTQcy*mPfjjq2yHEOe z$HWujukVGG#7|)}Z20@l_gch6jukXjUTQGEghhG%cAZoHX>8MjAFYB1>&ka0r+sX4 z&G$PO>BJ{5>n@vLqu|6V54N7Cc+?KlhXa+QQ5D*G>&KWckjk4x*=s+gL$w>O=Ff`q zYh=Gs{rwPdQg}wlUM}>z<2co&ed}_^cIvLSOy944+af#(n#qwV>4i>!4C>S{pw6h; zDZJwea3E|L+o)h1uMc?^L)?zF65Om4v2Ok3wWjeXyPS zH6E3mRpX!MB)6ADGg~2^Whtg0Hs`{|JE^G1)b*<}}Dv_+j?fMK%OHYhug&z$kvAn_akZt=IrO;^&K-T%og1j18eNv9BG|AEGRO8Niu~fd5?sW zW9tcM+6lo+B=k~$=Bw&eH+iE^66#H-CxBtF?aUd-+IgOjxT+6aebc(ZZ>Wq^3aDPkrJ>$gSuXdofJ->P053w}9? zXv&$w7Ox~KB7BIt4R%aY1pSd9l`&1EMG!c@!F1Mrm76!ZT9^Hd595nFm8sn%8nSuz zLaK$7^gCh9Nq)a!v*b}zX>2}5x;Egx?Rg;ofHb&GkMor}n3fusmg_CiLeCdhTuL;`<3{>)0wm-$i>=dj%5WCc1dLth2AAM-zdOXqoCElkYh zV~hVyW_TDenkcZ7{bhI*iqxa9qi;u^!U*`m=&dxjg$SNgYeL%oxkW&RFF2@`>B^6; z4xW+7>QqAB8qH>x1Yo*rJ(P=}JMCy-s8CFr1#%1(T*uI5QD>l%W}a zBqI6w?KuWwqc#ggIQp_~K3*`bxH38&@aDP6QFm%x0r$RLGyVP2{={aAAMrf@n2w+L zvy#NSZO4S4EK9*t?YVO=T;ge_ZSw+aaAr2E{R#^XSM@dIBzNYzDl}v)*PHxQ6K8)X zSVxOf3^o?VF)=nf66e-?&INfj>8ZRQ{>3<+eXBG%B29Usd^Hf#u+~lhwmy>z9k~77 zQ!(83A``U`@P4%iX-EgTgKGzo*6N&rQPe38Rh^2tmmOLr)_t=1#8;AiZ*vcN=^+W| zp67O8J`hLqw1ojMEsyNzJMQ$E-7}!uf;#G%bTxSoQt*gAi3s9qa=f9DhCq$05IVRP z*`#&^glx&)?JW&{zqoARlT|VLBizkq(cs_+k_br342IP8cL*Jutg_jQ6x@WQF(9Xk zSY*|8%MX!d#p~}zY=J%|Sq0x7Mk$ESFlLcS5vW~U#w75x$0s4>0wfi}GFXFMi^~N6 zD4v!dn0#8cGf0=W)c9#qY3opBowK2vc{!UwA0D4bvU*^4IJ!@Jydf>Zy8WHULLJne zs?G*m1u&Tbt2f_oatMez2>q)O&q|^lIMGfB^0(+m50#ky)qegKq5N%4{P`iTaZ~)a Z4D#~g0y!DXWN*JC04@X{%*Li%`X5U4nXLc- literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/256-1-shared.png b/theme/cfapishellext_custom_states/256-1-shared.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc623e4ebbee2c42390961597539c7b99dd7cdb GIT binary patch literal 3666 zcmZvfc{G&$`^WDwGnQeV@(3~3MwBoW29G7gER`%NB5U@otYev(h8}IU@a>UIC?m=; zgp_3r5%q}2r0k55tt>MkLzdt8J?H#>|9sE6?{mGc>%KnM{W+h{IoEkzckRw&;V^j^ z003}2&dLD*KmrK@M1=+BN<^ujz=&PPU5*5R1;f1;6n^Z3Kmc-4*3MBEuK7g~ydr!7 z0)e0t7#19P)$6*i&b0{tyd@KPLB$EYm4#z0b#d%ks$2BqPM!hS>)EGE0pdmGu!`@m z)PiF|WA8N_DYJJer7h^z+%4Nb=%WgeQr>uIbr{XV+q6S|X5OllR_1GXTdHkZX`aFF z+B`Y0y&tyt&msBw1vCD~0OQBTk;|qnk&Icw(ys?Z7A=>$wPe(?yq=%X)7%2iQp5kZ z=Xt13iW22O0Ble=q*>(xGstsns|8pFN@jOSiiQ#jkl#SR5)I@PqcLb8Eep?{px6TS zAmwNA@GWI-0$Y};%j~5Pj)h%tP`}EoU@Ce3_Coq)5HQe zto$k#SLCO`mEl>N2KXi3pnKiGA-xm^ZHTH)AC;PLN8mnS?lDe^ffHG*ytm;tExkdB zugJ5`Ge&_Bx=R|*Bg2Gu%!$=s9!$~b$g?hAh1t@al-eaK5cZ+wZ(7)(`5)HlIz7)K z0J<2?yuot3Se(2)W7K4K1;R>_c&ucgeUgZX&Y-U+CSf)o%(Kj$0Aa~S$`|cZP-t zMMT@%)x9^If4sCgmss0h#uQ0BH9K7B4+LfJwsSmsqM0|oj_$cBC)h{k9i5tOz`M8x z9lPAUP{vi>`jj#yV`lgv+&q-GF$X%JHp2LUqzrpX&kGG)>;oTdA7P4gaUq9#fqvnF zHjZ-pFIvwmZ}a?G3g=_~dpYXR?jZ9DTq#Pssi48^cl~_BQjmCW0qn z-uKFjx9_S1AD5nn%e(?5#6DPm3^(r!0p8YtN@HE0ir5`TQ0}cK3jSXHgHZ!IGCcf$ z@)6uK77a*WvsndTe&G9hCJ4&Y?W6Gk)Yvr|j0UWSBo;uG=}Nd(O#|S0pm_4G6DMa_ z#}p;;dKndN{TYrU4NDNAe4(DkEAC|tpnZRS^P3!)wfhW@HFuO1Zy}?By7c4;>Ib;_ zhmMqlk25A!Pv}VG=dQMl_bb~9)CaNmo_WQ+Q2w4f2MW;JNS{b2#uS4OPy0;PYxv{# zUC0dbpR7ksxc|I^mkWXBL&lNhw!D<=#mPdJH)E>a7<*kV`ZKc)g9T3aV04?J|{#GWBlbN}v9%u#X(^pzoR3?;m`e{jijl7PGh zLS%0GOcFFAnX~sd1rbz+Y6Y`x*)JbjY4xqOZ8^*x@&&0a5HWrfM5atNx3OS~DMJ%? z<`-pxV;gN{tGEfXCf8p;r@9{aCr0C(`NyPp)+u>-@l3Nb4Ngj?m0r3c3+mjU8}s7g z=RhO4vH>k0n6u5d(z4mzB}Mk?Rtp_`JMkt>^J3Oy@*BzZ}Q zaW-zb@EX_y!caE7pLH(lH+~qK@O6GCl2%eqmU^8%BkQ`V*h0`Dc6#*KFc~tb^%Dyn zy}w8ZaM)q#_gZVp)XQu!Pm$|!Y4pF_mLHSFZ&WWbt7TGKoSyNVNTfVKN#!TyJa|2u zAT1-_Lb#>9C0-$aIu%vUA-+4T4a>ZO67 z6jzTY^>Sk2>NGvrh2Q+iaT0~L*p%2gIKR}pq56)|9~`H|7oHDyvwl2N|K#){M5&~E z#L(lA%~$a_V|x8`*sS&ITTzHO@#k{dqZoJbEAaB%-Nr~7;b)B&39<1JgB_EcqJ4Tf zM<{wRq`T`PIGP=|lN?14?K%)&nkS{}_=6>+cj)3Gyj!?Y1sgCyz1JS@k7PHR#n` zY4+`QThG1Fd5%W4!1w%pc|Au)++&EC%NGmPB0>*}?BKTA(J~An6Z5UFdp5OiN%}I@ zNQMzaK=7o-u29!08u(*lxVm^MU+kI#vD2yO(q#S4@P2U*)ult^9~lu^MEK!>7j*?) zwTkd(p=Ap}R&U-FEc4~N}jU*@cWcM@$(1af6mJ= z?(uXvwwaB;+pb-tPDpte7I(HeRlBP)C}+}>>Bo(f_U))wnZ1p{^aYL*V0wRfA%ZXM zNUa^0GX>IKDZtGgo40~{Vgdf~d5y6WODwJDA;evM z$E`=ORHZK z1OkhY=DKn;Dyt=rbiw&*la=o#a;YmfQ>N0OKt&#_PkpZtH&)t_Xxl25q ztFE1Gkk5-wOATk6v5$m{a7C}9<_~%3pp)Vet!e`AC6w;}Z{v8TI%>H&8gp-R-xoR7 z(b2{Jgv@@-{T9iE!m%>@k3gd^(WZe3nb+lCrIpcV-|G(Li!eaMzk*6O-d0IEUW4RO zN?ebRlWQ_+-7&Axqr&AJc~&S@n}&aR9pSHiUBAk2XSpYHe5m*3YADqJp}59sA`Om2 z)bAq*Wn7pE{ff$zr>+|0ORf?y$Ilylc{F%aR;&(!X#J5^c=x-7&2$cp-g!2sN-`DW z?mdml3H)%ui{j}#Qd{JRUzrSyZn__*l0uG%PS~_DcuSP8 z%vwIOle`K(_#hO?HDh=7f$cAwAm=VEVdRt23K2$Wve1iy+uqt@XBBC}yD)Y!F<0Vo z#jQi4AG%KjIfr#O0!5vT!oDup&F#1JB9W(IywpM}Rc$3+Iv>=fn-o!gm~@eEASg?S z!~C}JND7EOoRPc-bC;Oixn;Ia^A3gsSJ&Xkf=QPBWGQ1seDfO|1I|BoGI zCU>y{Wa_8^N%RUAa++lXsTaoy0w6I~5J<%rd#j#a%x^~uNQpB9+;WPW*sw9TZj^~t zoaGeGP>!;`eLTG)V54!sJyppn(Y?@{cN1>D$UP?jo&We23<+=xO=$IL zB|)P0426!}_Z09z>L+P6iI$?}G%6wqq*Zg5ZxF638}$Y~Cr26nieg^vyBSbT&#dMb zqaUf6I;w5f#Ee87cvxEHQS42;#ZL-$T`H}`7Pl=R8FRx~&C=_|j#LD`SK^KiW3CAr zQvMoMd?-|7Oes~Tt+X3dP}U?{oV2LU*k8m^luT<1XB%-+s^?9_ujG2|;yW5)d~Kff zkfVTH{D&ePu%keeB{BTVV>uSo4xh5ur95cS(}q=tN5-@MnEQhjAKTaQ$XJ9MQ_!EY z7WKW2UBhfBPr!Y9eT;%V`YS;wk~TthU(C4`B|AS7(br)j!25)tL1k9go4YT`##OSX zmd_4_YG@z%-HqLRGOguXc2FHG_D*g5`KVUZzXXBO_fvSCQF|ZbIH?R;>PR6vl)B=a zMr`eG^c8^efv^&azJcp0^P@##?Cg~{aK8TwdWsQt)0>5&6l5z6t8)P$rOrYh^O5rcvyJJQy<6oCqMcwQrt-Ii%(zl#S T9ipsY9t7~#=dCI&J(KMC@5Lt z8c`CQpH@mmtT}V`<;yxP|JzA+{!l4|sT}+M_)pmb~d?v{4TWqK=IpcWtyT;ppi_hC1o}hVN zciE34=2Cke3tq1ko1f4p_F8xIp*Q_&XC>=cbv?GZK5d5Bl>BEa!+uV^zr5Fc&tc7T zh5gqLY}v6=@q>Wa{s%AQ-|?J2;Fra*r*-LKzA~8`{ZdTvi7#E*t0ixwUH{Z<%W|zX zz3azeTb3$cE*`xNZ<~+wUx~i|Kz{<0CIlJmaCpXk^@eZr#B;iKKrbMC@5Lt z8c`CQpH@mmtT}V`<;yx0|O(6r;B4qMC;pWhI~y90~zS-Ah$4SG9WsyU4pi|5fK&x2E;&O zF-VYF+C=KK?(OL7~%MCvk$lVtq_#P-~eh5O80=f6BrFs79Y7zO4vsq5yS4o1g{CUB0o8J~N z^h16rqWf$187Fx+sOtQsAn#OLN&NXsoCIS@g0UpQSdw5YNidcq7)uh2B?-pT?v;NF hM?Lbm?orP__b1%wbm#3#@qt&nFB&!o{8@F^4QU+u6;|9OxIOy4{@*GrPZ;8~&$VW(xEG(7*MVuHj|n0XukzlZmj8SQpma8C=I>d`2H{(Hjm%t=yZ?;a&sSq2+dsj*GwyANZvO zYzu2TTvA-Y=8r*+OzV&?ir+8kdO;h`kz^xX*Y$JMi0-$K2 zj#(kjQBluvoLP!zbpLn>mh^!hlS8@M3UxjMjJZd}Z&Q0K0X!AM?~hUR4FCWD07*qoM6N<$ Eg7eu12><{9 literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/48-0-locked.png b/theme/cfapishellext_custom_states/48-0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3e1f200e48a4effc04528fd6f474b50b02e428 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?2sFA!!duPX5c3QCr^ zMwA5SrEalY(fIb7t~X1dMB78} zjVnASAA01z;Reg>e~irvNgvr~Z2u8xKI0AB>WeBJGg$v}Z#t?n%k`$hj@@mcADTD6 ze$!VRV`080)8c%!{h34wq0V^{CoJ>XvLg?X@+phX~Qp>t@ z3U0VPW3--eoWpHnL+#pXd8_i6DSuevn1rTFWEYo-T|IDfSJOV9XvRkNp8t>j%=s`| zXp1o>vAUNS?L0iv7hhxQIGxPqn&azB> zI>~rO;miHXq8+|k0<-t&8(ew#(`Z`V%&pfKduu$G3cuSH`sDlRJ8wg7aen(N>cyHg znd^ueL~)3M*-D3;pvD_Zm^ONXBvgcI&q>#OJ@a<4_J%}YL@;=|`njxgN@xNA{2#*B literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/48-1-shared.png b/theme/cfapishellext_custom_states/48-1-shared.png new file mode 100644 index 0000000000000000000000000000000000000000..f58d721e4b157c37788b95c611f7156d1b6bb77e GIT binary patch literal 585 zcmV-P0=E5$P)h7N9PS!p5ZX$3b3uw0q^sHm!(9cB}Nx%H^3r#i#cPh#RZ^_sFCWxe8M$Z z%jrwWb=F#orXOgmwH8e|V!gF!;-TJ2Yf!;!qTs6$`Cv*O%etwonF3)+hF zTEib)I&h#k?@%j61_j6)T5&VpT1=}7BEwFaiAzo>B`PEC2U+C3dP5nP*4ARKTq*Po X9n*%T!#+I#00000NkvXXu0mjf%5(Wp literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/512-0-locked.png b/theme/cfapishellext_custom_states/512-0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..4da18008d65357018238d5a552db4fe31d679e74 GIT binary patch literal 5037 zcmeHLYg7|g*FFiL0 zt*G3*D+weZ5UwHd8WjWuhg%4VML;J&fH*+{3E!~R`{Voly?>pxX3d;^&VKfO_Sv)d zI&)@cfd5>Zf7<{6=5E{Sw;KQ~`icc}W}%NyDQ}JF! z@txO++S{wkuiP#EY7gOhQuwTYmAT%$`7`D6s?Pc0l0^?zcV52#aqWYQB#-@Tf0}-M zcUal&@}{$W59d_1|1XS&$G141G7@v#_o3UNElP6Gzk(6a?o{@YToc0s8^6C zBoz;f;);g_#1Pdk)oxX|>Jy(=UtLpLBdRf#Oe-*_{egVA_PX&bya@Um>Z22k*_F~i z#AELy^Qw5nFsYc$OCES6<+r+mh)SPgcAV1I?4irK=dSwD$dMR(;c;D#TG$iB+1IyQ zUVsM?d1XSO5Esn5V}#)ccNQ-ZX$6(!_*xxJtu{DWmhb`pR&o^50xuTeB!>CsL!Ke+ zq49#AaL$pT4Qnz0|8a7hl4c-CArKU7{@ceeQ*#LQ%ZQw(mrB zDLYE3aK&i0=7mVBj5>M&i)Om%l`t&o*)1*Fpu6DW4mt|(p=ydr+$ICpNI6-->Q=*! zKL8^lKinjQdy9Fc9`+*`sW@?wB^8;p#& z$4<^sQ;K;%cueN7B%Dk0z|yvh%HcKRxak);tZytq%6VIXPE2ey;=WI+(&s>WY(#lk z7x8Cil9qO*@lDfWA;E^9kRK$iMF@TeRNcEw87Wbdzmn=d0A%oirD4PA82vgSu>gAsc{V1@bQQ)ltS zE%+pcF&O?kMQOy%Pf8ychShzCfV^~cHMF{zhxq{?*+b?;fx#k0Ij5*$iMjv!fC0WH z(Pe^&)8Qee04?p?#uxdtgOe{~08>tD_>838hH3DLAKL9ZLlS?#fMFKJ+_V+F-ey3;kNO+@E)OeDB;mzBKej3XDy^1 zdv&Ri5tST*w9?5|5!M*_A%ci2*bt2@XPl@n+8|@=;VoCTgOV1Aj+ZOMR7qW<%i_IWs*MykqKB^>1|^KGFyn-yVMi&;L&=z=O$?kvb@A1PF(*J$@PgtQtN`1 zQxVjucie$cQV>PLb~xYwoGW<290lwap$HF?E~9<*#39ih_D%qg%4=%*4w4_0%1$}bs0L&?7vqAND3RE5TE1>p zgo`DZMD9xn-%qqa8Lt&W`*Ks%XP(eL#50&@MDI3G;u07$8LR(Jh+CvNC5b1eYdQKGe>eC% zZ|#cvW%3lfg-*ggeUq{SLBob=)Jy5KU5D(V%_YWch@70h&(sa?>58+F79)z0+s#X$ z1^1BW!1;Ve;xW>>>T07s+B+1gNTEz+c>1F-OS>(*W|_8Kb0J-vjfoJ~ zixGTXFR?wed3~z|?^yV5(@v$o1DWK6-#Z*PNd^4P`rB|@Tfs=CwoYbz=0SwRVXID zSyDNHNSa^jpXcv1ZA}i;x|H>9Q1hPoFVU=3`74KlylW$I6$!-O zd`BDY*UKM!Lxv=oFp!~$5{b<%RJ(PMA;&`2WmJrMHL-@?rC9hB;VR8fnBo1e=%l-k z&ABSW8OM0*+|H?jskhz?KKBNKm-Ma?(odJyclxq#%_;}R zh9nB{n9bnhK#AE;BGfmJCxmwv5Jbcls=@THX8>AI}mmk(2z z$$PW~wzWRuPW>CJpVLycff2P{vV7eq^#XO63Nj8n5jFYiOM@fqds>W+9imrrp)Hf^ z?>krN4w>}(vIpGKNab=rG$}5{ATMIG`-ki9)d;C-VRi4^@RVC$mBTW5tK1_eNPwnwvEQYRNOZG^ucz0yn*Glep8l+TZuGZ zrR0q32Cie1royy=VYO>L%cZi$(a|VqI@XjF-QNGeO0-H4k9x|_G{t)1ebl)cu8_ekZLDbHZ5j=5O=q&44o6|!aA z@7ZJ0p{)4Zg{bEb+33s;9&Mx-N<-Vqjhaeh;ml+Zl#SL%#1e$y$br8}pX`%$Fe|zcYCVw(^><6U2o}pV(C$La;@6aNqbBWIG75r=zPpNf~>RpTbsQ zfnX<64%x0^#wy3BJ&p@~lRN(--6F(=4f;a9=q5j}^K}_NVl{(oBd{VM+FkID;ITEZ1VN@| z6lVoEmXJGjs$$(gcYF_19X$WYJR9J#6npD28 zfGPzI>4#BZUo;bn+(618YJ0K~_2U40%9{Vq5@7j-ap>;s%lb_UVy(el-rN#!C6*1U zuxoOGd;z$7&FsWq`5#|)$gr;9ly?PcD#z^m*-ToKGeC;0Mo)1T)&MNr3V?hgI+!&d zfHmg<;2*UF;9uVW5aEjXvgH2}mm_E@_MV5-Y zjmnnEQcC7YgpyIzkmY+#&-3|we}DY`{k~p_`uVMn(k}e6v=9AR+guNO5nZSXr-{S-{ruVdq^g#` zAtH6s0w;9jAK)kOncwFYhNP{ft?fVV7} za(3i!6}-_2s&T18rw`Tf9Mk9eUxyEKNM+Nf*juSvKi@wS`6i}Mf-eVOJ-#uDLo$11 z&ELvh{65xVJr*x5)L%PWLXkwJmp+3Z-c7pLOgBJv zRwgjDs4v^c;kugXSlWH61FzV{*_*?aYR6XT3PEX0@*0$eKH)r9woCgsclKTLBZ*MK5V}NL2nMJ>_n)* zqsjHgAUw50pya~oxuwq2JXWGy(7SJt6)SU&a{OL9hZGa0Bry9} zkk{)o$aY|n${ZYEgQpfo6}GeP@9|lr7=GrNNNg&WUzx5oXj0x2w+=wVg0$ajXiW@OmO3!&Lm$uN|a)D+Crm^lu3k z$@LqPFRm0{mWz$Bs>!>1;GCH!L<)(jLk2sg>^!&)mw{%tRWK-#9^ueJ<0c-wn}`5GU@D4dpG zR^5o6Lk@7Hb4p&?I*7x(auoi-#Vu3ZC!y^K-&FhtRj~ND-Q~xl)gK7xgbn1UTlNBX zE_RRxc`-+rvbB$uVJo&lw|z?##*XtdR@Xdfwo9MS8Iv783<0@)D+qR#IU~nj0v8U1 zt`KZviq&?i@*Gb1p2puc5*b#V>4e+4P8y+h2EYCSiba}?31LFDea&fj;|o3z=bS#) z!!c!N#Y4$BGWqFRFhlpn_if>|E*?|sLDFzZ)FQLIr*cbBUq!ogqJ%XoJn7aOx|$&+ z@Mg*~fKpJRctP`o1)<&&%m-6mjyde9%I@#yG_Dl_l#>spG9d=A?pZg&tx*3%G>ATz+-E7b zQlmVWkbq=I4J;5}Ku;mAJQ@&J!H1fCA)Bk5QSp@(0lnpRgOLAG(y6@w)?+(&;VPl^@}??$LV zr1R|vyItV7?yFAV6c3?bqb3=k=AjZ+<`D>6p2eGxSt9+?%$J6c8B(3ax5Lx$d|(RN zJaME2IFlYQ>{$f>%CKM{;y4omYlj~g_S}8*%pW=Fum!pj7@J_H`?<<*f}|XASzHM) zc>5B(A3Y@fN*Hl;V4dH^6AQH^N@+iV~D)-3M=ly-vV*Q-pH!z}H)25TDB8 zdhthEWa(lil zaQj5Ykg)XIpen)NIs!qNIGOHO9wf)Gt}!D&_X7C&Y3Y6w9fW{43y**=hVM*oefSQc z4=t@HKaT^)?yiw?bB}FoPRI`&I0sthiDk_{pQ6HllQe-*9YMpnAHy{VXFgy2 zCoR&om7C9HemUgz2kaV{d-SMSoLbE~GNn!h;s(`BZ=HL)&3oQYxv*qq9VFV?(u93f zhXRp{8o=5|fA8iECn|#zt!reSsGF3@`MFraiIKL#ZNgC?h2 z;oxG29*{&P(!uAMpiUzEK)w{iLo_q65&P~Tnh^{Ad==C%M2u-|sV+~HSTJL(A3x4b zxQSa*6i}G5)VYhOy|@SVWZmbt$(0stW%e*7L&q$CY_CVTJZw!0ky37UuWd13Ixd~L zkkqZXwc3ZB+FCSyF^!A_=ie?OK=Us>X+svf~ z4cC=>5Ym(U9AJ6w*4M>J{nz@*{Neh+N+oGjF0$=;Xh?I0HzEOPdDqA}LJ+p#(OZ6h zIx}X?_`}B9YeUyNYA?-rA63nyn`AQEp7)pix3Z~g*%5LL*+Pqi*P*C!nR``j43P)u@xy9eNWKzZ{9|Th zGhK^eHf}yntK5!g+PYBC6h2D~Sy$@!NAMsJ4B_6FG`zk?M}G=ZC7LbXsN5nSgdGpE z@QwEI3s*l*>=+Z6DQ1dvEj3-5Zr2Exd%rmzOWB^g>YGNT*L$f1vFbs!HB%Yq+I4Kw zhEMQSN`(l)dY;1>@`yvcn|p7{%-y%yUzd$nc zDiA-4S9jt`N%E@ER@j~UD0G8)qI=-*RHt#s<>Q-W{@sl6+aHF|+jlnWm z-piLDf1R$*>3pSD=}FC0_p|ywrSx-C<6a39srOC`-#!0y$%Xx`rHK{v^ACEALL_vc z%$3Xbfu-?jGwCQ`{Vd2w`8{33BgZ%PIq{+@(}yPRfsBGFy@X=uhP;@|8Y6PzM^&49 zk~vrw=p1+KX};6r1Tuh(%b`;a+}6HCGWj&O2xQ+)^xu&2mI3930C4orgPf;y_b8O- zH2+GN&R5}-gREj!{<~_&u2Zannz^m60U$+RsYJoE-0O2xIv!LWyKoh#3Xy0;KFQ4h z)1h!H9RCSCcz5a-XW)5@5r)3IoletM8boQkc0hOHw7C{5&|Et90cB3Vs0(!z;S&NeE!huKY%f zF{)m&p!pmMq)0ng0#t?lpiJ1TR|xW7jdlb=AL+sAT*@_#1JaoMdr0Fyz459?Ek?DJ z*I3pN+VC`9UA_f8?##Id1);i-(Iv^0zd$-R=;O+>Y~fKO=@aRGdUm@#pzXLK2%n1A zsLcZd6fm%aGEXWq1ju%-UI?$v@jO4d+b*D6$d%|j3FbZ>HJZ&y_oMwxkI@x88Iz@L zeIwL*Xz)v(HFO3~tYxM9@eonIh&-J2jwOfGbL*6wx#A=5_u4vsnB(q!E7Wq;?U!d= zgx7KJFH22AS0Z*&-s4O;TY}of>8PquwLE(AIK< z%`fwYgj%!ut@13;%Vuo|9M0{r*jNQwV;-y{pFFn$tku*Oj`3e_o)mHpK!-;uLxw=B zK)A)I>_~$&)Vz{lCjqwG)OaHZs#P_rd8&jhO2%LwyDbF6&#jrO&<9%Vk5YmRGw?*| z(*UHt5X%DHBgG6f2``-tKSS->gD;t&8Im~v)LjC zMJYlG&bX|3(cHw_o`F_Y!m&`K7h#p?-hw@ev?DBzsX`v&=(84w*B&u56zBcfQ9KlWrG#YMcDp*zn zXf&!si)`&2r2}-XD|0-wsAIF zLN@}Q0A@iq6~%HH1?{HSMk$Cx3W1~6K=+(MPkc|*My|y}dZ4xCg2wqqfEDly?HpLt zLevCDvp`)fPNwj#00qNRK}+q5+Jv#rOlEN(17*U}@K-((QbkXo`#82yjH2g+N5PF_ z5N{10$?-NyLHLIQtB|6HHiTV%J`fcd?gh-7$PzuQNyS6$=tShUOuR!4CF1_CfY} zp=B7=9)t-VwdBYY3xQP7q`%riB>l~6*bh#v43T}Wlx51;X!foWHbUua!DVCHkJ^)#(HVuWLqVI zdOUYn0^ZDfjfig79)SUvP1|9Nznmb^-$C~w*0;RyTGZy z>|K#Hb5A?rj_GB?4n|F-i}KMrB+WkmHWD(Hj8m`#sohNs2q}cVlz?Cle-ptYprSfh%ljsE z9h6mt7OIXT)^f0I@`y6Wd~*oWC)q5`fSN(Ossg4R;wiv4TwzuIA~0ifgBh{bPRGv zm%Uy2t^you*RSlvF7UdQ?RF-a<(9k>3sHXI-nhh{tjQH~=>W^k?$Sj;+zM0?dXt#S zszOIv3{YO}oGAoZODANSqE(cX9S??~zhM=i6m;+|6QIw;z%;DMmBUmDy%FuoN5e;< z{%qA>Dwo>m9uLLei>aiLTo2^U>|e2X)jfXDWnSCjLNd#}7AT32+pMw|`yLI5BCc@( zb!%Phj_IKe#3u0t1xCQ&)gHY~%o|oF>>PFuYfdvp-#B+BHcsl8txn3@-~8G-N}Yeo zOzcC%n=J!=ta6?}&O>b94dKF;r_s$nlh$?kN=BXRlCg*bgg zr&1ZFC&~AXA^)gq@E+3S@J2_e? zAy`#YAnZSQ_egftt44XDF~iNZ)h?fh`KyyMEBl%;dN1Op&Qj*p@mjplayHyzqnMX_MS3!O3uby-lee@(XI>~vWvD97(ea-69MKT>D5Py() z7JEpYArn%qH!nl{HQ-3Tv)tq2+!*^udVpvwBU~v^nr@AFHLE0WnwtN z87}LU=4Yo}5ePS&&#dYxm17xYMZ~XI998?bS8fnjLEkKww-GDECrBzM>C_gOk_^h3 z+)@b_Yw_S2Lx0y{k)P~kkayT$sIhO)E)5oVyrce-&wDq!D>uFds>jBi5Zazd>~-PO zdEuMiJr=1LBZGWRseADu@6pu2%z)keZdASTBe@Fb9 zw-~bk9y<|ANSoPNT)Ywb6qt9nYt!Y2nV+mPdd`hzZ9jC;aX{1hH1qmq%8=cWtnGFQ zmzbxP4n1^c6JmAUUnH{}SAO*jJ4jUm!Y2EqEkoqJy&9TxQpVJgc3=(x4y=R`nr^@0OCc{_b(?0Yj{D%QRRwOhItBUBAhi{s5>K)DG z;pG|VYHzpw{4-?)_11%{Sv@K~)Lij<2ebe!_cA$|)gz@$@f3Toioo>*n7#mWp%UGx z89r=w;WI=zI<11xO=`{lwn8vDMtlfp!|x!ejZ6;0XW{ZOqI&~|XqN1Qq9y*9mqysp z6>tb$BU_SKd9qrIlbJ68KXeI{CG3gj{nR$^;HM3PAvd+ z8$g*=)UYugD;gu_0FjlTYR$e=kzo}Q@*~XOazj=R6wR_d3kYPu*~S0e$1<(8;ijM;$`S(nM6}&sJ}6$#Db_3u zoc9|zk7f&+i1bK#!M8El-%)@>1vPWrZVFkHfnP6Ts$)P=CBItMDhY=GcNh~ToAr~t zM(7PlKoHAHq&lqI?R}s_3GKFrfo{nosVo(Wg%Y%u5b*D9#r`gG@C=1khIIU> zS_Odfe@3?ahb{gqNvy&P^zSPFOE6P;e4xMH+n<1D?z=Yzi5Trs=n81zIjf!n4*Fk` z`)3fK+Se^S{48S23yMJ}ulx^%y+@c*^S|u3%>MrheGv(L`Ik~35TWP)gMQB(FykZO z{*e9H_M|%?+CS_B7d;ZDazb%q8}jMY+j5p^{QHPT5O@JTtj{G5H!PP~b;t``Mg@Sh z{D*-i1y1k3SsXB3BqGimL92e{qqPD7vKHUT3Cb=K=Yxxb#}WLs{?Y$j9Q?uxm`pMG zgJz1RNnkHYtP}vXM#c%ZMx+QM2^gnY@GBqe)yj6PIbWLXR(%QX=7wKqfQViB0KY&a zpY)#Ezad1#Wm8L*V!^G*hvVIdpCbw^lGgRVd!h3FaoD6=-3gG*)E6f3?r!xS?{zP3 zh*(h4o`h+g^igAa&Up06Zzh_?{tW;=-hw>oM6xp@hGG3I1IPyhYm=ASv~F+O08 zPH-jAGQ1&|G#RNa*f7pEpjDeAT2VeF$!R0ta%nPBQcyc4OHa3YUNe^r&aP?EF!k6y zaC^3^WD-(Z1Y-lRe3OP{0URD5T(MA_7{-9mE zecDtE^yuVU1WUO%L-KRCYv8Sx+a8V#5;f|@PQnd}n}orCROtcxBgbGeWdp-)#@Vz2 zaHaPcoZI{X4_?YVt|WPF=w)P+8liYM(3=)~4Kai=l>|?Y(?j zyAOg;#-i^6kjjqfWPg*5+rpInYv4ab_!N3Ab0Np6(EJ7t$#uV2{YBxmz}f2&n>k#(E9x7u>FAz^y`IzbjZ|9hDb_M2LGDg@uR&aC zA*l?PL`g8Y(^&DP^|+Q6b%HmQW2kvHBCPLIt)y^L+}DB1(VLSU53=ue?Nn;Mhg7@x z=b{<+IVVC(dGPDa#ZZFa1J&1p%85T>EfAY_?Q*F_=2?ud)27lcOQ9@Q4lTHd81U60;^%#)@UD~E`h zT)nfJ_ie^Fq>%%lpB*=^?M^rQHGp|9T_|FIIp?kdmUsFhQm%Iczwo8ACx_d9N&3B` z_h?2$V|Oi~Ue2=Ox~3kLmRtxWfER-VP1XN!w;Zkppr$z&;CD?nHAo>^kkO>Fk;?Ht zfM7@q(9<1_ezhy>l`I=FTd5pwA32>F`)CBle^fqtz4lL6xq5c-##s0V6?@J=q=Miq z>m;uIr9BX8As`8ef_?l*stkqJAqrn>XXIzZR!Z6=JZ zoNCJ{HBlI$#{(Ycu;*Z^=CUfTU9qfzd;VkyY|pilM?Ro>-y4#Cu$}CXbk`Tt2ZcH> s?L&oCEPH1EAAX-i^ktRB@5=~@igC|+5A;{?WgCdz>% literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/64-0-locked.png b/theme/cfapishellext_custom_states/64-0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb27a958ad56bd089651ae780f998c814d5f690 GIT binary patch literal 580 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GAd?3ttX4}GMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7HJzX3_D(1YsVVErvD01}U z{H_I@ffwBlDv2>36?GM`K6vktR>X~8rfc5lOb*l8a`{|-!ty#sQJv5LN7jQ4o!N#t zla=x}y+3=$}*{jNbmfDI36F#l{?^iDT=CtbFw*~5F z?^|3{aa1**a{b>anO&<{?`pmatIBuE{5wB9W4~60{i+LW?AfdZdq3=1)^NP_`DCuQ zX*HWZhexfuU>ASkU(mw4J(t$+SuA?1oAqrkSMHXd_6b%Wtl6&S7qb1ip2B#MZP7`l zMZ7MPSzV+%)VMp$1kUE=1um7o8MiomTkU?vNQW(r8Jik1m@i^e>nkRZt1wGP;g*95 gUWF4>JcUl$b4JT`iRDeJ0;T{4Pgg&ebxsLQ0P@=RHvj+t literal 0 HcmV?d00001 diff --git a/theme/cfapishellext_custom_states/64-1-shared.png b/theme/cfapishellext_custom_states/64-1-shared.png new file mode 100644 index 0000000000000000000000000000000000000000..a840bd1bbe0cfff1d62e71f0b51baaba6b9590a1 GIT binary patch literal 656 zcmV;B0&o3^P)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10v$<2 zK~#90?V8U{!axv*zhFQg32(lE1Q1?H#J7;(RpW&R@Tg}{#FO!E@TL(DbQ4m-zwPXF z7WyS~Y1(0b(`~!^W1yg*pddafKpW@-Bj7uUQF5%6oU@lSfC(_$5N|*|r!fZM2)Jgm z@N{&6QV!!4$49)2P7dQ0rGdYA7d7=!3sGVIJZCMyJCVK^+hiB-;v$_qhL?ln)IAr> zrN%3AGhn1Vb`hq?6=0f9Zv7Fc0w;p`{seOcr3ySCcjsLUHAVOkO1O&~Jt@0!3JeG* z+(lDM(6)rWyQ%u;c-m|fzQ3K10yB;5jab7)`0OA z*NhRG_C5|w2;qyAnQv@*%)jl^B!t5xt?Me`s$_9sq81J^4osB7LC%4R zPPjwTfmsy;=F4A`+;U)dJdLCS6P0j>qyzJd;i(Qfj?l5fZ;0~3fj~G2BjoGAgeXLmJwkb!qNaL; z^0LLv^$6ur2$MZRnuRdkBc%1`=u(f6HA2sbo}QF!gepXIJwjFB2e|?)^$5j)q(%3Y zPHtv_u!hf&xnd~5vtX{L^nn-(a3`4SUNDy$QVx}=9-&>4aHvf52xTFQLzR1vkOaOC ql}L|}CDeO_ETYmQR8UZ`|NH|2NQBN$qd>O+0000 + + + + + + + + + + + diff --git a/theme/lock-http.svg b/theme/lock-http.svg index a77e45536..3dbf27870 100644 --- a/theme/lock-http.svg +++ b/theme/lock-http.svg @@ -1 +1,61 @@ - + + + + + + + + + + + + + + + diff --git a/theme/lock-https.svg b/theme/lock-https.svg index cf013708d..3d493c925 100644 --- a/theme/lock-https.svg +++ b/theme/lock-https.svg @@ -1 +1,43 @@ - + + + + + + + diff --git a/theme/lock.svg b/theme/lock.svg new file mode 100644 index 000000000..88c2274f5 --- /dev/null +++ b/theme/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/theme/white/state-info.svg b/theme/white/state-info.svg index d644e9bad..715fe8bb1 100644 --- a/theme/white/state-info.svg +++ b/theme/white/state-info.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/translations/client_bg.ts b/translations/client_bg.ts index 66bee8842..e69990d00 100644 --- a/translations/client_bg.ts +++ b/translations/client_bg.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Отвaряне %1 локално - + In %1 В %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Показване на повече действия @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Отхвърляне + + + Open file details + Отваряне на подробности за файл + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Списък на дейностите @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Изчистване на менюто за съобщения на състояние @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Отхвърляне + + + Activity Активност - + Sharing Споделяне @@ -226,12 +236,12 @@ Преместването в кошчето не се прилага на тази платформа - + Error removing "%1": %2 Грешка при премахването на „% 1“:% 2 - + Could not remove folder "%1" Не можа да бъде премахната папката „% 1“ @@ -321,7 +331,7 @@ Грешен HTTP код, върнат от сървъра. Очаквани 204, но са получени „% 1% 2“. - + "%1 Failed to unlock encrypted folder %2". "%1 Неуспешно отключване на криптирана папка% 2" @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Файл %1, вече е заключен от %2. - + Lock operation on %1 failed with error %2 Операцията за заключване на %1 е неуспешна с грешка %2 - + Unlock operation on %1 failed with error %2 Операцията за отключване на %1 е неуспешна с грешка %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Отказ @@ -400,12 +410,12 @@ Изглежда, че функцията за виртуални файлове е активирана в тази папка. В момента не е възможно имплицитно изтегляне на виртуални файлове, които са криптирани цялостно. За да получите най-доброто изживяване с виртуални файлове и цялостно криптиране, уверете се, че криптираната папка е маркирана с „Нека винаги е достъпна локално“. - + End-to-end Encryption with Virtual Files Цялостно Криптиране с виртуални файлове - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Изглежда, че функцията за виртуални файлове е активирана в тази папка. В момента не е възможно имплицитно изтегляне на виртуални файлове, които са криптирани цялостно. За да получите най-доброто изживяване с виртуални файлове и цялостно криптиране, уверете се, че криптираната папка е маркирана с „Нека винаги е достъпна локално“. @@ -415,29 +425,29 @@ Да не се се криптира папка - + Do not encrypt folder Да не се се криптира папка - + Encrypt folder Криптиране на папка - + No account configured. Няма настроен профил. - - Display mnemonic - Показване на мнемоника + + Disable encryption + Деактивиране на криптирането - End-to-end encryption has been enabled for this account - Цялостното криптиране беше активирано за този профил + Display mnemonic + Показване на мнемоника @@ -445,19 +455,24 @@ Активиране на криптирането - + + End-to-end encryption has been enabled for this account + Цялостното криптиране беше активирано за този профил + + + Warning Внимание - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? На това устройство не е конфигурирано цялостно криптиране. След като бъде конфигурирано, ще можете да криптирате тази папка. Желаете ли да направите настройки за цялостно криптиране? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Не можете да криптирате папка със съдържание, моля премахнете файловете. @@ -470,121 +485,121 @@ Wait for the new sync, then encrypt it. Този профил поддържа цялостно криптиране - + Encryption failed Криптирането е неуспешно - + Could not encrypt folder because the folder does not exist anymore Не можа да се криптира папка, защото папката вече не съществува - - + + Open folder Отвори папката - + Encrypt Криптиране - - + + Edit Ignored Files Редактиране на игнорирани файлове - - + + Create new folder Създаване на нова папка - - + + Availability Наличност - + Choose what to sync Избор на елементи за синхронизиране - + Force sync now Синхронизирай сега - + Restart sync Рестартирай синхронизирането - + Resume sync Продължи синхронизирането - + Pause sync Пауза - + Remove folder sync connection Премахни синхронизирането - + Disable virtual file support … Деактивиране на поддръжката на виртуални файлове ... - + Enable virtual file support %1 … Активиране на поддръжката на виртуални файлове %1 ... - + (experimental) (експериментално) - + Folder creation failed Създаването на папката се провали - + <p>Could not create local folder <i>%1</i>.</p> <p>Провалено е създаването на локална папка<i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Потвърждаване за премахване на синхронизация - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Наистина ли желаете да премахнете синхронизирането на папката<i>%1</i>?</p><p><b>Бележка:</b> Действието <b>няма</b> да предизвика изтриване на файлове.</p> - + Remove Folder Sync Connection Премахни - + Disable virtual file support? Да се деактивира ли поддръжката на виртуални файлове? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ This action will abort any currently running synchronization. Това действие ще прекрати всяка текуща синхронизация. - + Disable support Деактивирне на поддръжката @@ -607,145 +622,177 @@ This action will abort any currently running synchronization. Цялостно мнемонично криптиране - + End-to-end encryption mnemonic Мнемонично криптиране от край до край - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). За да защитим вашата Криптографска идентичност, ние я криптираме мнемонично с 12 думи от речника. Моля, запишете ги и ги пазете на сигурно място. Те ще са необходими, за да добавите други устройства към вашия профил (като вашия мобилен телефон или лаптоп). - + + Disable end-to-end encryption + Деактивиране на цялостното криптиране + + + + Disable end-to-end encryption for %1? + Деактивиране на цялостното криптиране за %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Премахването на цялостното криптиране ще премахне локално синхронизираните файлове, които са шифровани. <br> Шифрованите файлове ще останат на сървъра. + + + Sync Running Синхронизират се файлове - + The syncing operation is running.<br/>Do you want to terminate it? В момента се извършва синхронизиране.<br/>Да бъде ли прекратено? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Ползвате %1 (%3%) от %2. Някои папки, включително монтирани по мрежата или споделени може да имат различни лимити. - + %1 of %2 in use Ползвате %1 от %2 - + Currently there is no storage usage information available. В момента няма достъпна информация за използването на хранилището. - + %1 in use Ползвате %1 - + %1 as %2 %1 като %2 - + The server version %1 is unsupported! Proceed at your own risk. Версия % 1 на съсрвъра не се поддържа! Продължете на свой риск. - + Connected to %1. Осъществена връзка с %1. - + Server %1 is temporarily unavailable. Сървърът %1 е временно недостъпен. - + Server %1 is currently in maintenance mode. Сървърът %1 е в режим на поддръжка. - + Signed out from %1. Отписан от %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Извършва се оторизация от браузъра. <a href='%1'>Кликнете тук</a> за да отворите отново браузъра. - + Connecting to %1 … Свързване на %1 … - + No connection to %1 at %2. Не може да се осъществи връзка като %1 с %2. - + Server configuration error: %1 at %2. Грешка в конфигурацията на сървъра:% 1 при% 2. - + No %1 connection configured. Няма %1 конфигурирана връзка. - + There are folders that were not synchronized because they are too big: Някои папки не са синхронизирани защото са твърде големи: - + There are folders that were not synchronized because they are external storages: Има папки, които не са синхронизирани защото са външни хранилища: - + There are folders that were not synchronized because they are too big or external storages: Има папки, които не са синхронизирани защото са твърде големи или са външни хранилища: - + Confirm Account Removal Потвърждение за премахване на профил - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Наистина ли желаете да премахнете връзката към профила <i>%1</i>?</p><p><b>Бележка:</b> Дейтствието <b>няма</b> да предизвика изтриване на файлове.</p> - + Remove connection Премахни връзката - - + This account supports end-to-end encryption Този профил поддържа цялостно криптиране - + Set up encryption Настройки за криптиране - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - Цялостното криптиране е активирано в този профил с друго устройство.<br>То може да бъде активирано на това устройство, като въведете мнемониката си. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Цялостното криптиране е активирано в този профил с друго устройство.<br>То може да бъде активирано на това устройство, като въведете мнемониката си. <br>Това ще позволи синхронизиране на съществуващите криптирани папки. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Удостоверената заявка към сървъра беше пренасочена към „%1“. URL адресът е лош, сървърът е неправилно конфигуриран. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Забранен е достъп от сървъра. За да се провери дали имате правилен достъп<a href="%1"> щракнете тук</a> за да получите достъп до услугата с вашия браузър. + + + + There was an invalid response to an authenticated WebDAV request + Получен е невалиден отговор на удостоверена заявка за WebDAV @@ -799,7 +846,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. За повече дейности, моля, отворете приложението Дейност. @@ -809,12 +856,12 @@ This action will abort any currently running synchronization. Извличане на активности... - + Fetching activities … Извличане на активности ... - + Files from the ignore list as well as symbolic links are not synced. Файловете от списъка за игнориране, както и символните връзки, не са синхронизирани. @@ -865,32 +912,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Продължаването ще означава <b>изтриване на тези настройки</b>. - + Continuing will mean <b>ignoring these settings</b>. Продължаването ще означава <b>игнориране на тези настройки</b>. - + 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>. Някои настройки са били конфигурирани в по-нови версии на този клиент и използват функции, които не са налични в тази версия.<br><br>% 1<br><br>Текущият конфигурационен файл вече е архивиран до% 2. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - Напусни + Напускане - + Continue Продължи - + Error accessing the configuration file Грешка при опита за отваряне на конфигурационния файл @@ -900,12 +974,12 @@ This action will abort any currently running synchronization. Възникна грешка при достъпа до конфигурационния файл при % 1 . Моля да се уверите, че вашият потребител има достъп до файла. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Възникна грешка при достъпа до конфигурационния файл при % 1 . Моля да се уверите, че файлът е достъпен от вашият системен профил. - + Quit %1 Напускане %1 @@ -951,56 +1025,216 @@ This action will abort any currently running synchronization. Файл %1 има невалиден час на промяна. Да не се качва на сървъра. - + File Removed (start upload) %1 Файлът е премахнат (стартиране на качване) % 1 - + File %1 has invalid modification time. Do not upload to the server. Файл %1 има невалиден час на модификация. Да не се качва на сървъра. - + Local file changed during syncing. It will be resumed. Локален файл е променен по време на синхронизирането. Ще бъде възобновен. - - + + Local file changed during sync. Локален файл е променен по време на синхронизирането. - + Network error: %1 Мрежова грешка: %1 - + Error updating metadata: %1 Грешка при актуализиране на метаданни: %1 - + The file %1 is currently in use Файлът %1 в момента се използва - + The local file was removed during sync. Локален файл е премахнат по време на синхронизирането. - + Restoration failed: %1 Възстановяването е неуспешно: % 1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Не може да се преименува файл, защото на сървъра, вече съществува файл със същото име. Моля, изберете друго име. + + + + Could not rename file. Please make sure you are connected to the server. + Файлът не можа да се преименува. Моля, уверете се, че сте свързани със сървъра. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Нямате право да преименувате този файл. Моля, помолете автора на файла да го преименува. + + + + Failed to fetch permissions with error %1 + Неуспешно извличане на права с грешка %1 + + + + Filename contains leading and trailing spaces. + Името на файла съдържа начални и крайни интервали. + + + + Filename contains leading spaces. + Името на файла съдържа начални интервали. + + + + Filename contains trailing spaces. + Името на файла съдържа крайни интервали. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Конфликтен сблъсък на случаи + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Файлът не може да бъде синхронизиран, тъй като поражда конфликтен сблъсък на случаи със съществуващ файл в тази система. + + + + Error + Грешка + + + + Existing file + Съществуващ файл + + + + file A + + + + + fileA + файл А + + + + + today + днес + + + + + 0 byte + 0 байта + + + + + Open existing file + Отваряне на съществуващ файл + + + + Case clashing file + Конфликтен файл в случая + + + + file B + + + + + fileB + файл Б + + + + + Open clashing file + Отваряне на конфликтния файл + + + + Please enter a new name for the clashing file: + Моля, въведете ново име на конфликтния файл: + + + + New filename + Ново име на файла + + + + Rename file + Преименуване на файл + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Файлът "%1" не може да бъде синхронизиран, тъй като поражда конфликтен сблъсък на случаи със съществуващ файл в тази система. + + + + %1 does not support equal file names with only letter casing differences. + %1 не поддържа еднакви имена на файлове с разлики само в главните букви. + + + + Filename contains leading and trailing spaces. + Името на файла съдържа начални и крайни интервали. + + + + Filename contains leading spaces. + Името на файла съдържа начални интервали. + + + + Filename contains trailing spaces. + Името на файла съдържа крайни интервали. + + + + Use invalid name + Използване на невалидно име + + + + Filename contains illegal characters: %1 + Името на файла съдържа непозволени знаци: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Възника грешка при запис на метаданните в базата данни @@ -1018,12 +1252,12 @@ This action will abort any currently running synchronization. Моля, въведете паролата си за цялостно шифроване:<br><br> Потребител:% 2Профил:% 3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Моля, въведете паролата си за шифроване от край до край:<br><br> Потребител:% 2<br>Профил:% 3<br> - + Enter E2E passphrase Въведете парола E2E @@ -1199,8 +1433,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Грешка на сървъра: PROPFIND отговорът не е форматиран в XML! @@ -1208,27 +1442,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Грешка при отваряне на директория % 1 - + Directory not accessible on client, permission denied Директорията не е достъпна за клиента, разрешението е отказано - + Directory not found: %1 Директорията не е намерена:% 1 - + Filename encoding is not valid Кодирането на име на файл е невалидно - + Error while reading directory %1 Грешка при четене на директория% 1 @@ -1236,91 +1470,91 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. Получен е невалиден токен. - - - - - - + + + + + + Please try again. Моля, опитайте отново. - + Invalid file path was provided. Предоставен е невалиден път до файла. - + Could not find an account for local editing. Не беше намерен профил за локално редактиране. - - + + Could not validate the request to open a file from server. Не можа да провери заявката за отваряне на файл от сървъра. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Не можа да се намери файл за локално редактиране. Уверете се, че пътят му е валиден и е синхронизиран локално. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Не можа да се намери файл за локално редактиране. Уверете се, че не е изключен чрез селективно синхронизиране. - + Server error: PROPFIND reply is not XML formatted! - + Грешка на сървъра: PROPFIND отговорът не е форматиран в XML! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Не можа да се намери информация за отдалечен файл за локално редактиране. Уверете се, че пътят му е валиден. - + Could not open %1 - + Не можа да се отвори %1 - + File %1 already locked. - + Файл %1 вече е заключен. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Заключването ще продължи %1 минути. Можете също така да отключите този файл ръчно, след като приключите с редактирането. - + File %1 now locked. - + Файл %1 е заключен. - + File %1 could not be locked. - + Файл %1 не може да бъде заключен. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Невъзможност да се генерират метаданните за криптиране, Отключване на папката. @@ -1450,145 +1684,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Локалната папка %1 не съществува. - + %1 should be a folder but is not. %1 трябва да е папка, но не е. - + %1 is not readable. %1 не може да бъде прочетен. - + %1 and %n other file(s) have been removed. %1 е премахнат.%1 и %n други файла са премахнати. - + %1 has been removed. %1 names a file. %1 е премахнат. - + %1 and %n other file(s) have been added. %1 и %n друг фаил(ове) са добавени.%1 и %n друг файл(ове) са добавени. - + %1 has been added. %1 names a file. %1е добавен - + %1 and %n other file(s) have been updated. %1 и %n друг файл са актуализирани.%1 и %n други файлове са актуализирани. - + %1 has been updated. %1 names a file. %1 е качен. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 е преименуван на %2.%1 е преименуван на %2 и %n други файла са преименувани. - + %1 has been renamed to %2. %1 and %2 name files. %1 е преименуван на %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 е преместен в %2.%1 е преместен в %2 и %n други файла са преместени. - + %1 has been moved to %2. %1 е преместен в %2. - + %1 has and %n other file(s) have sync conflicts. Възникна конфликт при синхронизирането на %1.Възникна конфликт при синхронизирането на %1 и %n други файла. - + %1 has a sync conflict. Please check the conflict file! Възникна конфликт при синхронизирането %1. Проверете файла! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 не може да бъде синхронизиран. За подробности проверете журнала.%1 и %n други файла не могат да бъдат синхронизирани. За подробности проверете журнала. - + %1 could not be synced due to an error. See the log for details. %1 не може да бъде синхронизиран поради грешка. За подробности проверете журнала. - + %1 and %n other file(s) are currently locked. % 1 и% n други файлове в момента са заключени.% 1 и% n друг файл(ове) в момента са заключени. - + %1 is currently locked. В момента % 1 е заключен. - + Sync Activity Активност от синхронизиране - + Could not read system exclude file Файлът за изключване на системата не можа да се прочете - + A new folder larger than %1 MB has been added: %2. Добавена е нова папка по-голяма от %1 MB: %2. - + A folder from an external storage has been added. Добавена е папка от външно хранилище. - + Please go in the settings to select it if you wish to download it. Моля, отидете в настройки, ако желаете да го свалите. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Папката % 1 е създадена, но преди това е била изключена от синхронизацията. Данните вътре в нея няма да бъдат синхронизирани. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Папката % 1 е създадена, но преди това е била изключена от синхронизацията. Данните вътре в нея няма да бъдат синхронизирани. - + 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). @@ -1601,7 +1835,7 @@ This means that the synchronization client might not upload local changes immedi % 1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a Ако решите да изтриете файловете, те ще бъдат недостъпни за вас, освен ако не сте собственикът. - + 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. @@ -1621,17 +1855,17 @@ If this was an accident and you decide to keep your files, they will be re-synce Ако това е инцидент и решите да запазите файловете си, те ще бъдат синхронизирани отново от сървъра. - + Remove All Files? Да се премахнат ли всички файлове? - + Remove all files Премахване на всички файлове - + Keep files Запазване на файловете @@ -1667,22 +1901,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Състоянието на папка не можа да се нулира - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Намерен е стар дневник за синхронизиране „%1“, но не може да бъде премахнат. Моля да се уверите, че в момента не го използва нито едно приложение. - + (backup) (архивиране) - + (backup %1) (архивиране %1) @@ -1692,27 +1926,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Неопределено състояние. - + Undefined state. Неопределено състояние. - + Waiting to start syncing. Изчакване на сихронизиране. - + Preparing for sync. Подготвяне за синхронизиране. - + Sync is running. Синхронизиране на файлове. - + Sync finished with unresolved conflicts. Синхронизирането приключи с неразрешени конфликти. @@ -1732,62 +1966,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Прекъсване от потребителя. - + Last sync was successful. Последното синхронизиране беше успешно. - + Setup error. Грешка при настройката. - + Sync request was cancelled. Заявката за синхронизиране беше отказана. - + Sync is paused. Синхронизирането е на пауза. - + %1 (Sync is paused) %1 (Синхронизирането е на пауза) - + No valid folder selected! Не сте избрали валидна папка! - + The selected path does not exist! Избраният път не съществува! - + The selected path is not a folder! Избраният път не е папка! - + You have no permission to write to the selected folder! Нямате права за писане в избраната папка. - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Локалната папка %1 вече съдържа папка, използвана във връзка за синхронизиране на папка. Моля, изберете друга! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Локалната папка %1 вече се съдържа в папка, използвана във връзка за синхронизиране на папка. Моля, изберете друга! - + There is already a sync from the server to this local folder. Please pick another local folder! Вече има синхронизация от сървъра към тази локална папка. Моля, изберете друга локална папка! @@ -1800,7 +2034,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Добави папка за синхронизиране - + File Файл @@ -1808,152 +2042,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Трябва да сте свързани, за да добавите папка - + Click this button to add a folder to synchronize. Щракнете върху този бутон, за да добавите папка за синхронизиране. - - + + Could not decrypt! + Не можа да се дешифрира! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Възникна грешка при зареждането на списъка с папки от сървъра. - + Fetching folder list from server … Извличане на списък с папки от сървъра ... - + There are unresolved conflicts. Click for details. Неразрешени конфликти. За подробности кликнете тук. - + Virtual file support is enabled. Поддръжката на виртуални файлове е активирана. - + Signed out Отписан - + Synchronizing VirtualFiles with local folder Синхронизиране на Виртуални Файлове с локална папка - + Synchronizing with local folder Синхронизиране с локална папка - + Checking for changes in remote "%1" Проверка за отдалечени промени „%1“ - + Checking for changes in local "%1" Проверка за локални промени „%1“ - + Reconciling changes Запис на промените - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Синхронизиране на %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) изтегляне %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) качване %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 от %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Остават няколко секунди, %1 от %2, файл %3 от %4 - + %5 left, %1 of %2, file %3 of %4 остават %5, %1 от %2, файл %3 от %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 от %2, файл %3 от %4 - + file %1 of %2 файл %1 от %2 - + Waiting … Изчакване... - + Waiting for %n other folder(s) … Изчаква се за % n друга папка(и) ...Изчаква се за % n друга папка(и) ... - + Preparing to sync … Подготовка за синхронизиране ... @@ -2184,13 +2422,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable стабилен - + beta бета @@ -2242,32 +2480,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Създаване на Архив за Отстраняване на грешки - + Server notifications that require attention. Известия от сървъра, които изискват внимание. - + Show call notification dialogs. Показване на диалогови прозорци на известия за обаждане. - + You cannot disable autostart because system-wide autostart is enabled. Не можете да деактивирате автоматичното стартиране, защото е активирано автоматично стартиране в цялата система. - + Change update channel? Промяна на канала за актуализация? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Обърнете внимание, че се избира само това от какво са взети надстройките на пула и че няма понижавания: Така че връщането от бета канала към стабилния канал обикновено не може да се направи веднага и означава изчакване на стабилна версия, която е по-нова от текущо инсталираната бета версия. - + Change update channel Промяна на канала за актуализация - + Cancel Отказ - + Zip Archives Zip Архиви - + Debug Archive Created Създаден е Архив за Отстраняване на грешки - + Debug archive is created at %1 Архив за Отстраняване на грешки е създаден на %1 @@ -2304,22 +2542,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Нужна е парола за споделяне - + Please enter a password for your link share: Моля, въведете парола за споделяне на вашата връзка: - + Sharing error Грешка при споделянето - + Could not retrieve or create the public link share. Error: %1 @@ -2461,12 +2699,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from Please enter a new name for the file: - Моля, въведете ново име за файла: + Моля, въведете новото име на файла: New filename - Нново име на файл + Име на нов файл @@ -2526,7 +2764,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from Filename contains illegal characters: %1 - Името на файла съдържа невалидни знаци: %1 + Името на файла съдържа непозволени знаци: %1 @@ -2557,10 +2795,15 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Затвори + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Авторски права 2017-2023 Nextcloud GmbH<br /> Авторски права 2012-2023 собственост наCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> - <p>Авторски права 2017-2021 Nextcloud GmbH<br /> Авторски права 2012-2021 ownCloud GmbH</p> + <p>Авторски права 2017-2021 Nextcloud GmbH<br /> Авторски права 2012-2021 собственост наCloud GmbH</p> @@ -2892,60 +3135,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 Използване & на виртуални файлове, вместо да се изтегля съдържание веднага % 1 - + (experimental) (експериментално) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Виртуалните файлове не се поддържат за основни дялове на Windows като локална папка. Моля, изберете валидна подпапка под буквата на устройството. - + %1 folder "%2" is synced to local folder "%3" %1 папка „%2“ е синхронизирана с локалната папка „%3“ - + Sync the folder "%1" Синхронизиране на папка „%1“ - + Warning: The local folder is not empty. Pick a resolution! Предупреждение: Локалната папка не е празна. Изберете резолюция! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 свободно място - + Virtual files are not available for the selected folder Не са налични виртуални файлове за избраната папка - + Local Sync Folder Няма достатъчно място в Папка за Локално - - + + (%1) (%1) - + There isn't enough free space in the local folder! Няма достатъчно място в локалната папка @@ -3017,7 +3260,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Невъзможно е да се получи час на модификация за файл в конфликт %1 @@ -3049,144 +3293,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Успешно свързване с %1: %2 версия %3 (%4)</font><br/><br/> - + Invalid URL Невалиден URL адрес - + Failed to connect to %1 at %2:<br/>%3 Неуспешно свързване с % 1 пр и% 2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Време за изчакване при опит за свързване с % 1 при % 2. - + Trying to connect to %1 at %2 … Опит се да се свърже с % 1 при % 2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Удостоверената заявка към сървъра беше пренасочена към „%1“. URL адресът е лош, сървърът е неправилно конфигуриран. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Достъпът е забранен от сървъра. За да се провери дали имате правилен достъп<a href="%1"> щракнете тук</a> и ще получите достъп до услугата с вашия браузър. - + There was an invalid response to an authenticated WebDAV request Получен е невалиден отговор на удостоверена заявка за WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Местната папка за синхронизиране % 1 вече съществува, настройка за синхронизиране. <br/><br/> - + Creating local sync folder %1 … Създаване на местна папка за синхронизиране % 1 - + OK Добре - + failed. неуспешен - + Could not create local folder %1 Локалната папка %1 не може да бъде създадена - + No remote folder specified! Не сте посочили отдалечена папка! - + Error: %1 Грешка: %1 - + creating folder on Nextcloud: %1 Създаване на папка на Nextcloud: %1 - + Remote folder %1 created successfully. Одалечената папка %1 е създадена. - + The remote folder %1 already exists. Connecting it for syncing. Отдалечената папка % 1 вече съществува. Свързване за синхронизиране. - - + + The folder creation resulted in HTTP error code %1 Създаването на папката предизвика HTTP грешка %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Създаването на отдалечена папка беше неуспешно, защото предоставените идентификационни данни са грешни! <br/>Моля, върнете се и проверете вашите идентификационни данни.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Създаването на отдалечена папка беше неуспешно, вероятно защото предоставените идентификационни данни са грешни!</font><br/> Моля, върнете се и проверете вашите идентификационни данни.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Създаването на отдалечената папка %1 се провали: <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Установена е връзка за синхронизиране от % 1 към отдалечена директория % 2. - + Successfully connected to %1! Успешно свързване с %1! - + Connection to %1 could not be established. Please check again. Връзката с % 1 не можа да бъде установена. Моля проверете отново. - + Folder rename failed Преименуването на папка се провали - + Cannot 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. Не може да се премахне и архивира папката, защото папката или файлът в нея е отворен в друга програма. Моля, затворете папката или файла и натиснете бутон повторен опит или отменете настройката. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Локалната папка %1 е създадена успешно!</b></font> @@ -3209,12 +3453,12 @@ Note that using any logging command line options will override this setting.Отказ - + Enable experimental feature? Активиране на експерименталната функция? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3231,12 +3475,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Това е нов, експериментален режим. Ако решите да го използвате, моля да докладвате за възникнали проблеми. - + Enable experimental placeholder mode Активиране на експериментален режим на заместител - + Stay safe Следете за безопасността си @@ -3265,162 +3509,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Не се поддържат символни връзки при синхронизиране. - + File is listed on the ignore list. Файлът е посочен в списъка за игнориране. - + File names ending with a period are not supported on this file system. Имена на файлове, завършващи с точка, не се поддържат от тази файлова система. - + File names containing the character "%1" are not supported on this file system. Имената на файлове, съдържащи символа „%1“, не се поддържат в тази файлова система. - + File name contains at least one invalid character Името на файла съдържа поне един невалиден знак - + The file name is a reserved name on this file system. Името на файла е запазено име на тази файлова система. - + Filename contains trailing spaces. Името на файла съдържа крайни интервали. - + Filename contains leading spaces. Името на файла съдържа начални интервали. - + Filename contains leading and trailing spaces. Името на файла съдържа начални и крайни интервали. - + Filename is too long. Името на файла е твърде дълго. - + File/Folder is ignored because it's hidden. Файл / папка се игнорира, защото е скрит. - + Stat failed. Неуспешен Отчет - + Conflict: Server version downloaded, local copy renamed and not uploaded. Конфликт: Изтеглена е версия на сървъра, а локалното копие е преименувано и не е качено. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Конфликтен сблъсък на случаи: Сървърният файл е изтеглен и преименуван, за да се избегне сблъсък. + + + The filename cannot be encoded on your file system. Името на файла не може да бъде кодирано във вашата система от файлове. - + The filename is blacklisted on the server. Името на файла е в черния списък на сървъра. - + File has extension reserved for virtual files. Файлът има разширение, запазено за виртуални файлове. - + size размер - + permission право - + file id идентификатор на файла - + Server reported no %1 Сървърът е отчел не % 1 - + Cannot sync due to invalid modification time Не може да се синхронизира поради невалиден час на модификация - + Error while deleting file record %1 from the database Грешка при изтриване на запис на файл %1 от базата данни - + Conflict when uploading a folder. It's going to get cleared! Конфликт при качване на папка. Ще бъде изчистен! - + Conflict when uploading a file. It's going to get removed! Конфликт при качване на файл. Ще бъде премахнат! - + Ignored because of the "choose what to sync" blacklist Игнориран заради черния списък 'изберете какво да синхронизирате' - + Not allowed because you don't have permission to add subfolders to that folder Не е разрешено, защото нямате право да добавяте подпапки към тази папка - + Not allowed because you don't have permission to add files in that folder Не е разрешено, защото нямате право да добавяте файлове в тази папка - + Not allowed to upload this file because it is read-only on the server, restoring Не е позволено да качвате този файл, тъй като той е само за четене на сървъра, възстановява се - + Moved to invalid target, restoring Преместено в невалидна цел, възстановява се - + Not allowed to remove, restoring Не е позволено да се премахва, възстановява се - + Error while reading the database Грешка при четене на базата данни - + Server replied with an error while reading directory "%1" : %2 Сървърът отговори с грешка при четене на директория „%1“: %2 @@ -3428,22 +3677,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB не можа да изтрие файл %1 от локалната БД /база данни/ - + Error updating metadata due to invalid modification time Грешка при актуализиране на метаданните поради невалиден час на модификация - + Error updating metadata: %1 Грешка при актуализиране на метаданни: %1 - + File is currently in use Файлът в момента се използва @@ -3456,19 +3705,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss не можа да се получи файл %1 от локалната БД - + File %1 cannot be downloaded because encryption information is missing. Файл %1 не може да бъде изтеглен, защото липсва информация за криптиране. - - + + File has changed since discovery Файлът се е променил след откриването - + Could not delete file record %1 from local DB Не можа да се изтрие запис на файл %1 от локалната БД @@ -3479,32 +3728,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss Файл % 1 не може да бъде изтеглен поради сблъсък с името на локален файл! - + File %1 can not be downloaded because of a local file name clash! Файл % 1 не може да бъде изтеглен поради сблъсък с името на локален файл! - + The download would reduce free local disk space below the limit Изтеглянето би намалило свободното място на локалния диск под ограничението - + Free space on disk is less than %1 Свободното място на диска е по-малко от %1 - + File was deleted from server Файлът беше изтрит от сървъра - + The file could not be downloaded completely. Целият файл не може да бъде свален. - + The downloaded file is empty, but the server said it should have been %1. Изтегленият файл е празен, но сървърът обяви, че е трябвало да бъде % 1. @@ -3514,18 +3763,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Файл % 1 не може да бъде записан поради сблъсък с името на локален файл! - - + + File %1 has invalid modified time reported by server. Do not save it. Файл %1 има невалиден час на промяна, отчетен от сървъра. Не го записвайте. - + + File %1 downloaded but it resulted in a local file name clash! + Файл %1 е изтеглен, но това е довело до сблъсък с имена на локалните файлове! + + + Error updating metadata: %1 Грешка при актуализиране на метаданни: %1 - + The file %1 is currently in use Файлът %1 в момента се използва @@ -3546,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 не можа да се изтрие файл % 1, грешка:% 2 @@ -3557,16 +3811,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + Папка %1 не може да бъде създадена поради сблъсък с имена на локални файлове или папки! + + + Could not create folder %1 Не можа да се създаде папка %1 - + Error updating metadata: %1 Грешка при актуализиране на метаданни: %1 - + The file %1 is currently in use Файлът %1 в момента се използва @@ -3574,7 +3833,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash % 1 не можа да се премахне поради сблъсък с името на локален файл! @@ -3587,46 +3846,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Файл % 1 не може да бъде преименуван на %2 поради сблъсък с името на локален файл! - - - + + File %1 downloaded but it resulted in a local file name clash! + Файл %1 е изтеглен, но това е довело до сблъсък с имена на локалните файлове! + + + + + could not get file %1 from local DB не можа да се получи файл %1 от локалната БД - + Error setting pin state Грешка при настройване на състоянието на закачване - - + + Error updating metadata: %1 Грешка при актуализиране на метаданни: %1 - + The file %1 is currently in use Файлът %1 в момента се използва - - + + Could not delete file record %1 from local DB Не можа да се изтрие запис на файл %1 от локалната БД - + Failed to propagate directory rename in hierarchy Неуспешно разпространение на преименуването на директория в йерархията - + Failed to rename file Неуспешно преименуване на файл @@ -3647,7 +3911,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Грешен HTTP код, върнат от сървъра. Очаквани 204, но са получени „% 1% 2“. @@ -3660,12 +3924,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Грешен HTTP код, върнат от сървъра. Очаквани 201, но са получени „% 1% 2“. - + Error writing metadata to the database: %1 Грешка при актуализиране на метаданните: %1 - + The file %1 is currently in use Файлът %1 в момента се използва @@ -3673,42 +3937,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Не можа да се преименува % 1 на % 2, грешка: % 3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Грешен HTTP код, върнат от сървъра. Очаквани 201, но са получени „% 1% 2“. - + could not get file %1 from local DB не можа да се получи файл %1 от локалната БД - + Could not delete file record %1 from local DB Не можа да се изтрие запис на файл %1 от локалната БД - + Error updating metadata: %1 Грешка при актуализиране на метаданни: %1 - + The file %1 is currently in use Файлът %1 в момента се използва - + Error setting pin state Грешка при настройване на състоянието на закачване - + Error writing metadata to the database Грешка при записване на метаданни в базата данни @@ -3898,7 +4162,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Отговор @@ -3916,23 +4180,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Настройки - + %1 Settings This name refers to the application name e.g Nextcloud %1 Настройки - + General Общи - + Network Мрежа - + Account Профил @@ -3940,17 +4204,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link Споделяне на връзката - + Link share Споделяне на връзка - + + Internal link + Вътрешна връзка + + + Enter a note for the recipient Въвеждане на бележка за получателя @@ -4026,7 +4295,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4035,132 +4304,171 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + Неуспешно криптиране на папка в „%1“ + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + В профил %1 не е конфигурирано цялостно криптиране. Моля, конфигурирайте това в настройките на вашият профил, за да активирате криптирането на папки. + + + + Failed to encrypt folder + Неуспешно криптиране на папка + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Не можа да криптира следната папка: „%1“. + +Сървърът отговори с грешка: %2 + + + + Folder encrypted successfully + Папката е криптирана успешно + + + + The following folder was encrypted successfully: "%1" + Следната папка беше криптирана успешно: „%1“ + + + Context menu share Споделяне на контекстното меню - + Select new location … Избор на ново местоположение ... - + I shared something with you Споделих нещо с вас - - + + Share options Опции за споделяне - - + + Activity Активност - + Copy private link to clipboard Копиране на частната връзката в клипборда - + Send private link by email … Изпращане на частната връзката по имейл… + + + Expire in %1 minutes + remaining time before lock expire + Ще изтече след %1 минута/иЩе изтече след %1 минута/и + - + Leave this share Напускане на споделянето - + Resharing this file is not allowed Повторното споделяне на този файл не е разрешено - + Resharing this folder is not allowed Повторното споделяне на тази папка не е разрешено - - + + Copy public link Копиране на публична връзка - + Copy internal link Копиране на вътрешна връзка - + + Encrypt + Криптиране + + + Lock file Заключване на файл - + Unlock file Отключване на файл - + Locked by %1 Заключено от %1 - - Expire in %1 minutes - remaining time before lock expire - Ще изтече след %1 минута/иЩе изтече след %1 минута/и - - - + Expires in %1 minutes remaining time before lock expires Изтича след %1 минута/иИзтича след %1 минута/и - + Edit Редакция - + Open in browser Отвори в браузъра - + Resolve conflict … Разрешаване на конфликт ... - + Move and rename … Преместване и преименуване - + Move, rename and upload … Преместване, преименуване и качване ... - + Delete local changes Изтриване на местните промени - + Move and upload … Преместване и качване ... - + Delete Изтриване @@ -4378,63 +4686,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (пропуснато поради по-ранна грешка, повторен опит в % 2) - + Could not update file: %1 Файлът не можа да се актуализира: %1 - + Could not update virtual file metadata: %1 Невъзможност да се актуализират метаданните на виртуалния файл: % 1 - + Could not update file metadata: %1 Невъзможност да се актуализират метаданните на файла: % 1 - + Could not set file record to local DB: %1 Не може да се зададе запис на файл в локалната БД: %1 - + Unresolved conflict. Неразрешени конфликт. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Наличен е само % 1, за започване трябват поне % 2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Не може да се отвори или създаде локална база данни за синхронизиране. Уверете се, че имате достъп за запис в папката за синхронизиране. - + Using virtual files with suffix, but suffix is not set Използване на виртуални файлове със суфикс, но суфиксът не е зададен - + Unable to read the blacklist from the local database Не може да се прочете черният списък от локалната база данни - + Unable to read from the sync journal. Не може да се чете от дневника за синхронизиране. - + Cannot open the sync journal Не може да се отвори дневника за синхронизиране. @@ -4444,12 +4752,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Синхронизацията ще се възобнови скоро. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Дисковото пространство е малко: Пропуснати са изтегляния, които биха намалили свободното място под% 1. - + There is insufficient space available on the server for some uploads. На сървъра няма достатъчно място за някои качвания. @@ -4518,59 +4826,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Изтегляне - + Add account Добавяне на регистрация - + Open main dialog Отваряне на основния диалогов прозорец - - + + Pause sync Пауза в синхронизирането - - + + Resume sync Възобновяване на синхронизирането - + Settings Настройки - + Help Помощ - + Exit %1 Изход % 1 - + Pause sync for all Пауза в синхронизирането за всички - + Resume sync for all Възобновяване на синхронизирането за всички - + %1: %2 %1: %2 @@ -4578,24 +4886,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Клиент за настолен компютър</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Версия %1. За допълнителна информация, моля щракнете <a href='%2'>тук</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Използване на добавка за виртуални файлове: %1</small></p> - + <p>This release was supplied by %1</p> <p>Това издание е предоставено от % 1</p> @@ -4603,22 +4911,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Неуспешно извличане на доставчици - + Failed to fetch search providers for '%1'. Error: %2 Неуспешно извличане на доставчици на търсене на „%1“. Грешка: %2 - + Search has failed for '%2'. Търсенето на „%2“ не бе успешно. - + Search has failed for '%1'. Error: %2 Търсенето на „%1“ не бе успешно. Грешка: %2  @@ -4626,30 +4934,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Нов опит на всички качвания + + + + Resolve conflict + Разрешаване на конфликт + OCC::UserModel - + Confirm Account Removal Потвърждение за Премахване на Профил - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Наистина ли желаете да премахнете връзката към профила<i> %1</i>?</p><p><b>Бележка:</b> Дейтствието <b>няма</b> да предизвика изтриване на файлове. - + Remove connection Премахване на връзката - + Cancel Отказ @@ -4787,8 +5101,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Грешка при актуализиране на метаданните поради невалиден час на модификация @@ -4796,8 +5110,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Грешка при актуализиране на метаданните поради невалиден час на модификация @@ -4895,123 +5209,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Версията на сървъра не се поддържа - + 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. Сървърът на профил% 1 изпълнява стара и неподдържана версия% 2. Използването на този клиент с неподдържани версии на сървъра е непроверено и потенциално опасно. Продължете на свой риск. - + Disconnected Без връзка - + Disconnected from some accounts Прекъсната е връзката с някои профили - + Disconnected from %1 Прекъсната е връзката с %1 - + Disconnected from accounts: Прекъсната е връзката с профили: - + Account %1: %2 Профил %1: %2 - + Please sign in Моля, впишете се - + Signed out Отписан - + Account synchronization is disabled Синхронизирането е изключно - - + + Synchronization is paused Синхронизирането е на пауза - + Folder %1: %2 Папка %1: %2 - + Unresolved conflicts Неразрешени конфликти - + Up to date Актуално - + Error during synchronization Грешка при синхронизирането - + There are no sync folders configured. Няма папки за синхронизиране. - + No sync folders configured Няма настроени папки за синхронизиране - + Checking for changes in remote "%1" Проверка за отдалечени промени „%1“ - + Checking for changes in local "%1" Проверка за локални промени „%1“ - + Syncing %1 of %2 (%3 left) Синхронизиране на %1 от %2 (остават %3) - + Syncing %1 of %2 Синхронизиране на %1 от %2 - + Syncing %1 (%2 left) Синхронизиране на %1 (остават %2) - + Syncing %1 Синхронизиране на %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5163,27 +5477,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Нова папка - + You renamed %1 Вие преименувахте %1 - + You deleted %1 Вие изтрихте %1 - + You created %1 Вие създадохте %1 - + You changed %1 Вие променихте %1 - + Synced %1 Синхронизиран %1 @@ -5249,30 +5563,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Маркиране като прочетено + + ShareDelegate + + + Create a new share link + Създаване на нова връзка за споделяне + + + + Copy share link location + Копиране на местоположението на връзка за споделяне + + + + Share options + Опции за споделяне + + + + ShareDetailsPage + + + An error occurred setting the share password. + Възникна грешка при задаване на парола за споделянето. + + + + Edit share + Редактиране на споделяне + + + + Dismiss + Отхвърляне + + + + Share label + Споделяне на етикет + + + + Allow editing + Разрешаване на редактиране + + + + Password protect + Защита с парола + + + + Set expiration date + Задаване на срок на валидност + + + + Note to recipient + Бележка за получателя + + + + Unshare + Прекратяване на споделянето + + + + Add another link + Добавяне на още една връзка + + + + Copy share link + Копиране на връзка за споделяне + + ShareView - + Password required for new share Нужно е въвеждането на парола за ново споделяне - + Share password Парола за споделяне - + Sharing is disabled Споделянето е изключено - + This item cannot be shared. Този елемент не може да бъде споделен. - + Sharing is disabled. Споделянето е изключено. @@ -5288,7 +5678,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Неуспешно свързване на базата данни. @@ -5346,6 +5736,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Зареждане на още резултати + + UnifiedSearchResultNothingFound + + + No results for + Няма резултати за + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Секция с резултати от търсенето %1 + + UserLine @@ -5409,67 +5815,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Състояние на линия - + Online На линия - + Away Отсъстващ - + Do not disturb Не безпокой - + Mute all notifications Заглушаване на всички известия - + Invisible Невидим - + Appear offline Показване като офлайн - + Status message Съобщение за състояние - + What is your status? Какъв е вашият статус? - + Clear status message after Изчистване на съобщение за състоянието след това - + Cancel Отказ - + Clear status message Изчистване на съобщението за състоянието - + Set status message Задаване на съобщение за състоянието @@ -5553,24 +5959,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloud основен диалог на работния плот - + Current account Текущ профил - - + + Resume sync for all Възобновяване на синхронизирането за всички - - + + Pause sync for all Пауза в синхронизирането за всички @@ -5580,22 +5986,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Задаване на потребителско състояние - + Add account Добавяне на регистрация - + Add new account Добавяне на нов профил - + Settings Настройки - + Exit Изход @@ -5604,11 +6010,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Текущ потребителски аватар - - - Current account avatar - Текущ аватар на профил - Current user status is online @@ -5620,70 +6021,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Текущият потребителски статус е не безпокойте - + + Current account avatar + Текущ аватар на профил + + + Current account status is online Текущият статус на профил е: на линия - + Current account status is do not disturb Текущият статус на профил е: не безпокойте - + + %1 - File activity + %1 - Файлова активност + + + Account switcher and settings menu Меню за превключване на профил и настройки - + Open local folder of current account Отворяне на локалната папка на текущия профил - + Connected Свързан - + Disconnected Без връзка - + Open Nextcloud Talk in browser Отваряне на Nextcloud Разговор в браузъра - + More apps Още приложения - + Open %1 in browser Отвори %1 в браузъра - + Unified search results list Обединен списък с резултати от търсенето - - - %1 - File activity - %1 - Файлова активност - main.cpp - + System Tray not available Системната област не е налична - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. % 1 изисква в работеща системна област. Ако използвате XFCE, моля следвайте <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">тези инструкции</a>. В противен случай, моля, инсталирайте приложение в системната област, като например „trayer“ и опитайте отново. @@ -5691,7 +6097,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Изграден от Git редакция <a href="%1">%2</a> на %3, %4 използвайки Qt %5, %6</small></p> @@ -5721,76 +6127,81 @@ This is a new, experimental mode. If you decide to use it, please report any iss Server version downloaded, copied changed local file into conflict file - Изтеглена е версия на сървъра, копирана е, променен локален файл в конфликтен файл + Изтеглена е версия на сървъра, копиран е промененият локален файл в конфликтен файл + Server version downloaded, copied changed local file into case conflict conflict file + Изтеглена е версия на сървъра, копиран е промененият локален файл в конфликтен файл + + + Deleted Изтрито - + Moved to %1 Преместен в % 1 - + Ignored Игнорирано - + Filesystem access error Грешка в достъпа на файловата система - + Error Грешка - + Updated local metadata Актуализирани локални метаданни - + Unknown Неизвестен - + downloading сваляне - + uploading качване - + deleting изтриване - + moving преместване - + ignoring игнориране - + error грешка - + updating local metadata актуализиране на локални метаданни diff --git a/translations/client_br.ts b/translations/client_br.ts index d83746f8c..c4e5255ca 100644 --- a/translations/client_br.ts +++ b/translations/client_br.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ An diblasañ e-barzh ar boubelenn n'eo ket bet ouzhpennet c'hoaz war ar bladenn - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Arrest @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Kont arventet ebet. - - Display mnemonic - Diskouez an niver-memor + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Diskouez an niver-memor @@ -445,18 +455,23 @@ Aotre - + + End-to-end encryption has been enabled for this account + + + + Warning Kemenadenn - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Ne c'hellit ket sifrañ ur restr gant danvez e barzh, lamit ar restroù. @@ -469,121 +484,121 @@ Gortozit ar gemprenn nevez, ha sifrit anezhañ. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Digor an teuliad - + Encrypt Sifrañ - - + + Edit Ignored Files Embann ar Restroù Disoursiet - - + + Create new folder - - + + Availability - + Choose what to sync Choazit petra kemprennañ - + Force sync now Rediañ ar gemprenn bremañ - + Restart sync Adloc'hañ ar gemprenn - + Resume sync Kendec'hel ar gemprenn - + Pause sync Ehaniñ ar gemprenn - + Remove folder sync connection Lemel an teuliad eus ar genstagadenn kemprenn - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed C'hwitat krouadenn an teuliad - + <p>Could not create local folder <i>%1</i>.</p> <p>N'eo ke posupl krouiñ an teuliad diabarzh <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Gwiriañ Lamadenn ar Genstagadenn Kemprenn Teuliad - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Sur oc'h lemel kemprenn an teuliad <i>%1</i> ?</p> <p><b>Notenn :</b> Ne lamo<b>ket</b> restr ebet.</p> - + Remove Folder Sync Connection Lemel ar Genstagadenn Kemprenn Teuliad - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -592,7 +607,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -602,144 +617,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Kemprenn ho treiñ - + The syncing operation is running.<br/>Do you want to terminate it? Ar gemprenn a zo o treiñ. <br/> C'hoant ho peus arest anezhi ? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) eus %2 implijet. Teuliadoù-so, an teuliadoù rannet hag ar rouedad staliat eus oute, e c'hell kaout bevennoù diheñvel. - + %1 of %2 in use %1 eus %2 implijet - + Currently there is no storage usage information available. Titour implij al lec'h renkañ ebet evit ar poent. - + %1 in use %1 implijet - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Kenstaget da %1. - + Server %1 is temporarily unavailable. N'eo ket implijapl ar servijour %1 evit ar poent. - + Server %1 is currently in maintenance mode. Adnevesaet e vez ar servijour %1. - + Signed out from %1. Aet maez eus %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Kaout an aotre gant ar Furcher. <a href='%1'>Klikit amañ</a> evit adloc'hañ ar Furcher. - + Connecting to %1 … O kenstagañ da %1 ... - + No connection to %1 at %2. Kestagadenn ebet da %1 da %2 - + Server configuration error: %1 at %2. - + No %1 connection configured. Kesntagadenn %1 ebet lakaet. - + There are folders that were not synchronized because they are too big: Teuliadoù so n'int ket bet kempredet peogwir e oant re vras : - + There are folders that were not synchronized because they are external storages: Teuliadoù so n'int ket bet kempredet peogwir in lec'hioù klenkañ diavaez : - + There are folders that were not synchronized because they are too big or external storages: Teuliadoù so n'int ke bet kemredet peogwir e oant pe re vra pe lec'hioù klenkañ diavaez : - + Confirm Account Removal Gwiriañ Lamaden ar C'hont - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Sur oc'h o peus c'hoant lemel ar genstagadenn d'ar c'hont %1<i> ?</p><p><b>Notenn :</b> Ne lamo <b>ket</b> restr ebet. - + Remove connection Lemel kenstagdenn - - + This account supports end-to-end encryption Douget e vez gant ar c'hont ar sifrañ penn-kil-ha-troad - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -794,7 +841,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. Evit muioc'h a oberniantiz digorit ar meziant oberiantiz. @@ -804,12 +851,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -860,32 +907,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Ur fazi a zo bet en ur tizhout ar restr arvenntennañ @@ -895,12 +969,12 @@ This action will abort any currently running synchronization. Ur fazi a zo bet en ur tizhout ar restr arvenntennañ e %1. Grit sur eo posupl d'an implijourienn tizhout ar restr. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Kuitaat %1 @@ -946,56 +1020,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database ur fazi a zo bet en ur skrivañ ar metadata er roadenn-diaz @@ -1013,12 +1247,12 @@ This action will abort any currently running synchronization. Ebarzhit ho frazenn-tremen klok: <br><br>Implijader: %2<br>Kont: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Ebarzhit ar frazenn-tremen E2E @@ -1192,8 +1426,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1201,27 +1435,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1229,83 +1463,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1313,7 +1547,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. N'o ket bet gouest da grouiñ metadata evit ar sifradur. Dibrennit an teuliad. Ur gudenn a c'hell bezhañ gant levraouegoù OpenSSL. @@ -1442,145 +1676,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Teuliad diabarzh %1 n'ez eus ket outañ. - + %1 should be a folder but is not. %1 a vefe ret bezhañ un teuliad m'es n'eo ket. - + %1 is not readable. %1 ne vez ket lennet. - + %1 and %n other file(s) have been removed. %1 ha %n restr all a zo bet lamet%1 ha %n restr all a zo bet lamet%1 ha %n restr all a zo bet lamet%1 ha %n restr all a zo bet lamet%1 ha %n restr all a zo bet lamet - + %1 has been removed. %1 names a file. %1 a zo bet lamet - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 ha %n restr all a zo bet adnevesaet%1 ha %n restr all a zo bet adnevesaet%1 ha %n restr all a zo bet adnevesaet%1 ha %n restr all a zo bet adnevesaet%1 ha %n restr all a zo bet adnevesaet - + %1 has been updated. %1 names a file. %1 a zo bet adnevesaet - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 a zo bet adanvet da %2 ha %n restr all a zo bet adanvet.%1 a zo bet adanvet da %2 ha %n restr all a zo bet adanvet.%1 a zo bet adanvet da %2 ha %n restr all a zo bet adanvet.%1 a zo bet adanvet da %2 ha %n restr all a zo bet adanvet.%1 a zo bet adanvet da %2 ha %n restr all a zo bet adanvet. - + %1 has been renamed to %2. %1 and %2 name files. %1 a zo bet adanvet da %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 a zo bet diblaser da %2 ha %n restr all a zo bet diblaset.%1 a zo bet diblaser da %2 ha %n restr all a zo bet diblaset.%1 a zo bet diblaser da %2 ha %n restr all a zo bet diblaset.%1 a zo bet diblaser da %2 ha %n restr all a zo bet diblaset.%1 a zo bet diblaser da %2 ha %n restr all a zo bet diblaset. - + %1 has been moved to %2. %1 a zo bet diblaser da %2. - + %1 has and %n other file(s) have sync conflicts. %1 ha %n restr all ho deus ur stourm kemprennañ.%1 ha %n restr all ho deus ur stourm kemprennañ.%1 ha %n restr all ho deus ur stourm kemprennañ.%1 ha %n restr all ho deus ur stourm kemprennañ.%1 ha %n restr all ho deus ur stourm kemprennañ. - + %1 has a sync conflict. Please check the conflict file! %1 en deus ur stourm kemprennañ. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 ha %n restr all na c'hellont ket bezhañ kemprennet abalamour da kudennoù. Sellit ar gazetenn evit muioc'h a ditouroù.%1 ha %n restr all na c'hellont ket bezhañ kemprennet abalamour da kudennoù. Sellit ar gazetenn evit muioc'h a ditouroù.%1 ha %n restr all na c'hellont ket bezhañ kemprennet abalamour da kudennoù. Sellit ar gazetenn evit muioc'h a ditouroù.%1 ha %n restr all na c'hellont ket bezhañ kemprennet abalamour da kudennoù. Sellit ar gazetenn evit muioc'h a ditouroù.%1 ha %n restr all na c'hellont ket bezhañ kemprennet abalamour da kudennoù. Sellit ar gazetenn evit muioc'h a ditouroù. - + %1 could not be synced due to an error. See the log for details. %1 na c'hall ket bezhañ kemprennet abalamour da kudennoù. Sellit ar gazetenn evit muioc'h a ditouroù. - + %1 and %n other file(s) are currently locked. %1 ha %n restr all a zo prennet evit ar poent.%1 ha %n restr all a zo prennet evit ar poent.%1 ha %n restr all a zo prennet evit ar poent.%1 ha %n restr all a zo prennet evit ar poent.%1 ha %n restr all a zo prennet evit ar poent. - + %1 is currently locked. %1 a zo prennet evit ar poent. - + Sync Activity Oberiantiz Kemprennañ - + Could not read system exclude file Dibosupl lenn ar restr sistem er-maez - + A new folder larger than %1 MB has been added: %2. Un teuliad nevez brasoc'h eget %1 MB a zo bet ouzhpennet : %2. - + A folder from an external storage has been added. An teuliad eus ar lec'h renkañ diavaez a zo bet ouzhpennet. - + Please go in the settings to select it if you wish to download it. Ket d'an arventenno evit choaz m'ho peus c'hoant da pellkargañ anezhañ. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. An teuliad %1 a zo bet krouet mes er-maez eus ar kemprennadenn-mañ eo. Ne vo ket kempredet ar roadennoù e-barzh. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Ar restr %1 a zo bet krouet er-maez eus ar gemprennadenn-mañ. Ne vo ket kempredet. - + 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). @@ -1593,7 +1827,7 @@ Talvout a ra ar c'hliant kemprenn a c'hell n'omp pas pellkas ar c %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1601,24 +1835,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? - + Remove all files - + Keep files @@ -1654,22 +1888,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Dibosupl adlaket d'ar stad orin an teuliad - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1679,27 +1913,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Stad dianavezet. - + Undefined state. - + Waiting to start syncing. O gortoz e krogfe ar gemprenn. - + Preparing for sync. O prientiñ evit ar gemprenn. - + Sync is running. Kemprenn o treiñ - + Sync finished with unresolved conflicts. @@ -1719,62 +1953,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Arest Implijer. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Kemprenn ehañaet - + %1 (Sync is paused) %1 (kemprenn ehañaet) - + No valid folder selected! Teuliad mat choazet ebet ! - + The selected path does not exist! - + The selected path is not a folder! An hent choazet n'eo ket un teuliad ! - + You have no permission to write to the selected folder! N'ho peus aotre ebet evit skrivañ en teuliad choazet ! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! An teuliad diabarzh %1 en deus dija un teuliad implijet er genstagadenn kemprennañ teuliad. Choazit unan all ! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! An teuliad diabarzh %1 a zo dija en teuliad implijet er genstagadenn kemprennañ teuliad. Choazit unan all ! - + There is already a sync from the server to this local folder. Please pick another local folder! Un gemprennadenn eus ar servijour d'an teuliad diabarzh ez eus dija. Choazit un teuliad diabarzh all ! @@ -1787,7 +2021,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Ouzhpennañ ur Genstagadenn Kemprennañ Teuliad - + File Restr @@ -1795,152 +2029,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Ret eo deoc'h bezhañ kenstaget evit ouzhpennañ un teuliad - + Click this button to add a folder to synchronize. Klikit war ar bouton evit ouzhpennañ an teuliad da gempred. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Ur fazi a zo bet en ur c'hargañ roll teuliadoù ar servijour. - + Fetching folder list from server … Ho pakañ roll teuliadoù ar servijour ... - + There are unresolved conflicts. Click for details. Stourmoù diziskoulmet ez eus. Klikit evit ar munudoù. - + Virtual file support is enabled. - + Signed out Mont kuit - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Adkompezañ ar cheñchamantoù - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" O kemprenn %1 - - + + , ' - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) pellkargañ %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) Pellkas %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 diwar %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 choma ra %5, %1 diwar %2, %3 restr diwar %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 diwar %2, %3 restr diwar %4 - + file %1 of %2 %1 restr diwar %2 - + Waiting … O gortoz ... - + Waiting for %n other folder(s) … O gortoz %n teuliad all ...O gortoz %n teuliad all ...O gortoz %n teuliad all ...O gortoz %n teuliad all ...O gortoz %n teuliad all ... - + Preparing to sync … O prientiñ ar gemprenn ... @@ -2171,13 +2409,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2229,59 +2467,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Kemenadennoù servijour ho deus ezhomm ho hevez. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2289,22 +2527,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Ger-tremen ret evit gellout rannañ - + Please enter a password for your link share: Ebarzhit ur ger-tremen d'ho liamm rannet: - + Sharing error Fazi rannañ - + Could not retrieve or create the public link share. Error: %1 @@ -2542,6 +2780,11 @@ Traoù lec'h m'eo aotreet al lemel a vo lamet ma ampechont lamadur an Close Seriñ + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2874,60 +3117,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Teuliad diabarzh kemprennet - - + + (%1) (%1) - + There isn't enough free space in the local folder! N'ez eus ket traouac'h a blas dieub en teuliad diabarzh ! @@ -2999,7 +3242,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3031,144 +3275,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Kenstaget mar da %1 : %2 stumm %3 (%4)</font><br/><br/> - + Invalid URL URL fall - + Failed to connect to %1 at %2:<br/>%3 C'hwitet d'en em genstagañ da %1 da %2 : <br/>%3 - + Timeout while trying to connect to %1 at %2. Deuet eo an termenn pa glaskemp genstagaén da %1 da %2. - + Trying to connect to %1 at %2 … Ho klask en em genstagañ da %1 da %2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. An aksed a zo difennet d'ar servijour. Evit gouzout hag-eñ e c'hallit tizhout ar servijer, <a href="%1">klikit amañ</a> evit tizhout servijoù ho furcher. - + There was an invalid response to an authenticated WebDAV request Ur respont fall d'ar goulenn dilesa WabDAV a zo bet - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Bez ez eus dija eus an teuliad kemprennet diabarzh %1, ho arventennañ anezhañ evit ar gemprenn. <br/><br/> - + Creating local sync folder %1 … O krouiñ an teuliat kemrpennañ diabarzh %1 ... - + OK - + failed. c'hwitet. - + Could not create local folder %1 Dibosupl krouiñ an teuliad diabarzh %1 - + No remote folder specified! Teuliat pell lakaet ebet ! - + Error: %1 Fazi : %1 - + creating folder on Nextcloud: %1 krouiñ teuliadoù war Nextcloud %1 - + Remote folder %1 created successfully. Teuliat pell %1 krouiet mat. - + The remote folder %1 already exists. Connecting it for syncing. Pez ez eus dija eus ar restr pell %1. Ar genstagañ anezhañ evit e kemprenn. - - + + The folder creation resulted in HTTP error code %1 Krouadenn an teuliad en deus roet ar c'hod fazi HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> C'hwitet da grouiñ ar restr pell abalamour an titouroù identitelez roet a zo fall ! <br/>Gwiriit ho titouroù identitelezh.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">C'hwitet da grouiñ an teuliad pell abalamour da titouroù identitelezh fall roet sur walc'h.</font><br/>Gwiriit anezho</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. C'hwitat da grouiñ an teuliad pell %1 gant ar fazi <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Ur genstagadenn kemprenet eus %1 d'an teuliad pell %2 a zo bet staliet. - + Successfully connected to %1! Kenstaget mat da %1 ! - + Connection to %1 could not be established. Please check again. Ar genstagaden da %1 n'eo ket bet graet. Klaskit en dro. - + Folder rename failed C'hwitet da adenvel an teuliad - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>An teuliad kempren diabarzh %1 a zo bet krouet mat !</b></font> @@ -3191,12 +3435,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3207,12 +3451,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3241,162 +3485,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3404,22 +3653,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3432,19 +3681,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Cheñchet eo bet ar restr abaoe m'ema bet disoloet - + Could not delete file record %1 from local DB @@ -3455,32 +3704,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! N'eo ket posupl pellkargañ ar restr %1 abalamour d'ur stourm anv restr diabarzh ! - + The download would reduce free local disk space below the limit Ar pellkargañ a lamo plas dieub el lenner dindan ar bevenn - + Free space on disk is less than %1 Al lec'h dieub war al lenner a zo dindan %1 - + File was deleted from server Lamet eo bet ar rest eus ar servijour - + The file could not be downloaded completely. Ne oa ket posupl pellkargañ ar restr penn-da-benn. - + The downloaded file is empty, but the server said it should have been %1. @@ -3490,18 +3739,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ar restr %1 ne c'hell ket bezhañ enrollet abalamour d'ur stourm anv diabarzh ! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3522,7 +3776,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 dibosupl lemel ar restr %1, fazi : %2 @@ -3533,16 +3787,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3550,7 +3809,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Dibosupl lemel %1 peogwir d'ur stourm anv restr diabarzh @@ -3563,46 +3822,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3623,7 +3887,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3636,12 +3900,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Kod HTTP fall roet gant ar servijour. O gortoz e oa 201, met resevet a zo ber "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3649,42 +3913,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Kod HTTP fall roet gant ar servijour. O gortoz e oa 201, met resevet a zo ber "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database ur fazi a zo bet en ur skrivañ ar metadata er roadenn-diaz @@ -3874,7 +4138,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3892,23 +4156,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Arventennoù - + %1 Settings This name refers to the application name e.g Nextcloud - + General Hollek - + Network Rouedad - + Account Kont @@ -3916,17 +4180,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4002,7 +4271,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4011,132 +4280,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Roll kenaroud rannañ - + Select new location … - + I shared something with you Rannet am eus un dra bennak ganeoc'h - - + + Share options Dibaboù rannañ - - + + Activity - + Copy private link to clipboard Eila al liamm prevez d'ar golver - + Send private link by email … Kas al liamm prevez dre bostel ... + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed N'eo ket aotret adrannañ ar restr - + Resharing this folder is not allowed - - + + Copy public link Eilañ al liamm publik - + Copy internal link Eilañ al liammm diabarzh - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Cheñch - + Open in browser Digeriñ er furcher - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Lemel @@ -4354,63 +4660,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (lezet hebiou abalamour d'ar fazi kent, klasket e vo en-dro a benn %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Stroum diziskoulmet. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Nez eus nemet %1 dieub, ret eo kaout %2 d'an neubeutañ evit kregiñ - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Dibosupl digeriñ pe krouiñ ar rouadenn-diaz kemprennet diabarzh. Bezit sur ho peus an aotre embann en teuliad kemprenn. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Dibosupl lenn ar roll-du eus ar roadenn-diaz diabarzh - + Unable to read from the sync journal. Dibosupl eo lenn ar gazetenn kemprenn. - + Cannot open the sync journal Dibosupl eo digeriñ ar gazetenn kemprenn @@ -4420,12 +4726,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Plas el lenner re vihan : ar bellgargadennoù a lako ar plas dieub da mont dindan %1 a vo ankouaet. - + There is insufficient space available on the server for some uploads. N'ez eus ket trawalc'h a blas war ar servijour evit pelgasadennoù zo. @@ -4494,59 +4800,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Ouzhpenn ur c'hont - + Open main dialog Digeriñ an diviz pennañ - - + + Pause sync - - + + Resume sync - + Settings Arventennoù - + Help - + Exit %1 Kuitaat %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1 : %2 @@ -4554,24 +4860,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Kliant Burev</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Stumm %1. Evit muioc'h a ditouroù, klikit <a href='%2'>amañ</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>An digoradenn-mañ a zo bet roet gant %1</p> @@ -4579,22 +4885,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4602,30 +4908,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Klask en dro pep pellkasadenn + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Gwiriañ Lamaden ar C'hont - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Sur oc'h o peus c'hoant lemel ar genstagadenn d'ar c'hont %1<i> ?</p><p><b>Notenn :</b> Ne lamo <b>ket</b> restr ebet. - + Remove connection Lemel kenstagdenn - + Cancel Arrest @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4772,8 +5084,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4871,123 +5183,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Ar stumm servijour n'eo ket douget - + 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. - + Disconnected Digemprenn - + Disconnected from some accounts Digemprennet eus kontoù - + Disconnected from %1 Digemprennet eus %1 - + Disconnected from accounts: Digemprennet eus ar c'hontoù : - + Account %1: %2 Lont %1 : %2 - + Please sign in Inskrivit ac'honoc'h - + Signed out Mont kuit - + Account synchronization is disabled Kemprenn kont disaotreet - - + + Synchronization is paused Kemprennadenn ehanaet - + Folder %1: %2 Teuliad %1 : %2 - + Unresolved conflicts Stourmoù diziskoulmet - + Up to date Izhivaet - + Error during synchronization Ur fazi a zo bet en ur gemprennañ - + There are no sync folders configured. N'ez eus teuliad kemprenn ebet. - + No sync folders configured Teuliad kemprenn ebet - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) O kemprenn %1 eus %2 (chom a ra %3) - + Syncing %1 of %2 O kemprennañ %1 diwar %2 - + Syncing %1 (%2 left) O kemprenn ù1 (chom a ra 2%) - + Syncing %1 O kemprenn %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5139,27 +5451,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5225,30 +5537,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5264,7 +5652,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5322,6 +5710,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5385,67 +5789,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5529,24 +5933,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Kont bremañ - - + + Resume sync for all Kendec'hel ar gemprenn evit pep tra - - + + Pause sync for all Ehanañ pep kemprennadenn @@ -5556,22 +5960,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Ouzhpenn ur c'hont - + Add new account - + Settings Arventennoù - + Exit Kuitaat @@ -5580,11 +5984,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5596,70 +5995,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Kemprennet - + Disconnected Digemprennet - + Open Nextcloud Talk in browser - + More apps Muioc'h a veziantoù - + Open %1 in browser Digeriñ %1 er furcher - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available N'eo ket aotreet ar varenn sistem - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5667,7 +6071,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Krouet gant Git stumm<a href="%1">%2</a> war %3, %4 en ur implij Qt %5, %6</small></p> @@ -5701,72 +6105,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Lamet - + Moved to %1 Diblaset da %1 - + Ignored dianavezout - + Filesystem access error Ur fazi tizhout ar restr-sistem - + Error Fazi - + Updated local metadata Adnevesaat ar roadennoù meta diabarzh - + Unknown Dianv - + downloading o pelkargañ - + uploading o pellkas - + deleting o lemel - + moving o diblasañ - + ignoring do dianavezout - + error fazi - + updating local metadata o adnevesaat ar roadennoù meta diabarzh diff --git a/translations/client_ca.ts b/translations/client_ca.ts index c5d3cad8d..ed375197e 100644 --- a/translations/client_ca.ts +++ b/translations/client_ca.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Obre %1 localment - + In %1 En %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostra més accions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Descarta + + + Open file details + Obre els detalls del fitxer + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Llista d'activitats @@ -50,9 +55,9 @@ BasicComboBox - + Clear status message menu - + Esborra el menú del missatge d'estat @@ -65,7 +70,7 @@ Answer Talk call notification - + Respon la notificació de trucada del Talk @@ -75,7 +80,7 @@ Decline Talk call notification - + Declina la notificació de trucada del Talk @@ -175,7 +180,7 @@ No recent emojis - + No hi ha emojis recents @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Descarta + + + Activity Activitat - + Sharing S'està compartint @@ -204,7 +214,7 @@ File details of %1 · %2 - + Detalls del fitxer de %1 · %2 @@ -226,12 +236,12 @@ El desplaçament a la paperera no està implementat en aquesta plataforma - + Error removing "%1": %2 Error en suprimir «%1»: %2 - + Could not remove folder "%1" No s'ha pogut suprimir la carpeta «%1» @@ -321,7 +331,7 @@ Codi HTTP incorrecte retornat pel servidor. S'esperava 204, però s'ha rebut "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "% 1 no s'ha pogut desbloquejar la carpeta xifrada %2". @@ -329,19 +339,19 @@ OCC::Account - + File %1 is already locked by %2. - + El fitxer %1 ja està bloquejat per %2. - + Lock operation on %1 failed with error %2 - + L'operació de bloqueig a %1 ha fallat amb l'error %2 - + Unlock operation on %1 failed with error %2 - + L'operació de desbloqueig a %1 ha fallat amb l'error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancel·la @@ -400,14 +410,14 @@ Sembla que tens la funció de fitxers virtuals habilitada en aquesta carpeta. De moment, no és possible descarregar implícitament fitxers virtuals xifrats d'extrem a extrem. Per obtenir la millor experiència amb els fitxers virtuals i el xifratge d'extrem a extrem, assegureu-vos que la carpeta xifrada estigui marcada amb "Fes sempre disponible localment". - + End-to-end Encryption with Virtual Files - + Xifratge d'extrem a extrem amb Fitxers virtuals - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". - + Sembla que tens la funció de fitxers virtuals habilitada en aquesta carpeta. De moment, no és possible baixar implícitament fitxers virtuals xifrats d'extrem a extrem. Per obtenir la millor experiència amb els fitxers virtuals i el xifratge d'extrem a extrem, assegureu-vos que la carpeta xifrada estigui marcada amb "Fes sempre disponible localment". @@ -415,29 +425,29 @@ No xifris la carpeta - + Do not encrypt folder No xifris la carpeta - + Encrypt folder Xifra la carpeta - + No account configured. No s'ha configurat cap compte. - - Display mnemonic - Mostra la clau mnemotècnica + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Mostra la clau mnemotècnica @@ -445,18 +455,24 @@ Habilita el xifratge - + + End-to-end encryption has been enabled for this account + S'ha habilitat el xifratge d'extrem a extrem per a aquest compte + + + Warning Avís - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + El xifratge d'extrem a extrem no està configurat en aquest dispositiu. Quan estigui configurat, podreu xifrar aquesta carpeta. +Voleu configurar el xifratge d'extrem a extrem? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. No podeu xifrar una carpeta amb contingut. Suprimiu-ne els fitxers, espereu que se sincronitzi novament i xifreu-la. @@ -465,280 +481,316 @@ Wait for the new sync, then encrypt it. This account supports End-to-End encryption - + Aquest compte admet el xifratge d'extrem a extrem - + Encryption failed Ha fallat el xifratge - + Could not encrypt folder because the folder does not exist anymore No s'ha pogut encriptar la carpeta perquè ja no existeix - - + + Open folder Obre la carpeta - + Encrypt Xifra - - + + Edit Ignored Files Edita els fitxers ignorats - - + + Create new folder Crea una carpeta nova - - + + Availability Disponibilitat - + Choose what to sync Trieu què voleu sincronitzar - + Force sync now Força la sincronització ara - + Restart sync Reinicia la sincronització - + Resume sync Reprèn la sincronització - + Pause sync Atura la sincronització - + Remove folder sync connection Suprimeix la connexió de la carpeta sincronitzada - + Disable virtual file support … Inhabilita la compatibilitat amb els fitxers virtuals... - + Enable virtual file support %1 … Habilitar el suport de fitxer virtual % 1... - + (experimental) (experimental) - + Folder creation failed S'ha produït un error en crear la carpeta - + <p>Could not create local folder <i>%1</i>.</p> <p>No s'ha pogut crear la carpeta local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmeu la supressió de la connexió de la carpeta sincronitzada - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Segur que voleu deixar de sincronitzar la carpeta <i>%1</i>?</p><p><b>Nota:</b> això <b>no</b> suprimirà cap fitxer.</p> - + Remove Folder Sync Connection Suprimeix la connexió de la carpeta sincronitzada - + Disable virtual file support? Voleu inhabilitar la compatibilitat amb els fitxers virtuals? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. This action will abort any currently running synchronization. - + Aquesta acció inhabilitarà la compatibilitat amb els fitxers virtuals. Com a conseqüència, es baixarà el contingut de les carpetes marcades actualment com a «Disponible només en línia». + +L'únic avantatge d'inhabilitar la compatibilitat amb els fitxers virtuals és que la característica de sincronització selectiva tornarà a estar disponible. + +Aquesta acció anul·larà qualsevol sincronització en execució. - + Disable support Inhabilita la compatibilitat End-to-End encryption mnemonic - + Clau mnemotècnica del xifratge d'extrem a extrem - + End-to-end encryption mnemonic - + Clau mnemotècnica del xifratge d'extrem a extrem - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). + Per a protegir la vostra identitat criptogràfica, la xifrarem amb una clau mnemotècnica de 12 paraules del diccionari. Anoteu-les i deseu-les en un lloc segur. Les necessitareu per a afegir altres dispositius al vostre compte (com ara un telèfon mòbil o un portàtil). + + + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. - + Sync Running S'està executant una sincronització - + The syncing operation is running.<br/>Do you want to terminate it? S'està executant una operació de sincronització.<br/>Voleu aturar-la? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en ús. Algunes carpetes, incloent-hi les carpetes muntades a través de la xarxa o les carpetes compartides, poden tenir límits diferents. - + %1 of %2 in use %1 de %2 en ús - + Currently there is no storage usage information available. Actualment no hi ha informació disponible sobre l'ús de l'emmagatzematge. - + %1 in use %1 en ús - + %1 as %2 - + %1 com a %2 - + The server version %1 is unsupported! Proceed at your own risk. La versió del servidor (%1) ha quedat obsoleta. Continueu sota la vostra responsabilitat. - + Connected to %1. Connectat a %1. - + Server %1 is temporarily unavailable. El servidor %1 no està disponible temporalment. - + Server %1 is currently in maintenance mode. El servidor %1 es troba en mode de manteniment. - + Signed out from %1. S'ha sortit de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. S'està obtenint l'autorització del navegador. <a href='%1'>Feu clic aquí</a> per a tornar a obrir el navegador. - + Connecting to %1 … S'està connectant a %1… - + No connection to %1 at %2. No hi ha connexió a %1 a %2. - + Server configuration error: %1 at %2. Error de configuració del servidor: %1 a %2. - + No %1 connection configured. No s'ha configurat cap connexió a %1. - + There are folders that were not synchronized because they are too big: Hi ha carpetes que no s'han sincronitzat perquè són massa grans: - + There are folders that were not synchronized because they are external storages: Hi ha carpetes que no s'han sincronitzat perquè són fonts d'emmagatzematge extern: - + There are folders that were not synchronized because they are too big or external storages: Hi ha carpetes que no s'han sincronitzat perquè són massa grans o són fonts d'emmagatzematge extern: - + Confirm Account Removal Confirmeu la supressió del compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Segur que voleu suprimir la connexió al compte <i>%1</i>?</p><p><b>Nota:</b> això <b>no</b> suprimirà cap fitxer.</p> - + Remove connection Suprimeix la connexió - - + This account supports end-to-end encryption Aquest compte admet el xifratge d'extrem a extrem - + Set up encryption + Habilita el xifratge + + + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + El xifratge d'extrem a extrem s'ha habilitat en aquest compte amb un altre dispositiu.<br>Es pot habilitar en aquest dispositiu introduint la vostra clau mnemotècnica.<br>Això permetrà la sincronització de les carpetes xifrades existents. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,22 +845,22 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. Per a veure més activitats, obriu l'aplicació Activitat. Fetching activities… - + S'estan recuperant les activitats... - + Fetching activities … - + S'estan recuperant les activitats... - + Files from the ignore list as well as symbolic links are not synced. Els fitxers de la llista de fitxers ignorats i els enllaços simbòlics no se sincronitzen. @@ -859,32 +911,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Si continueu, <b>se suprimiran aquests paràmetres</b>. - + Continuing will mean <b>ignoring these settings</b>. Si continueu, <b>s'ignoraran aquests paràmetres</b>. - + 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>. Alguns paràmetres s'han configurat en versions més noves d'aquest client i utilitzen característiques no disponibles en aquesta versió.<br><br>%1<br><br>Ja hi ha una còpia de seguretat del fitxer de configuració actual a <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Surt - + Continue Continua - + Error accessing the configuration file S'ha produït un error en accedir al fitxer de configuració @@ -894,12 +973,12 @@ This action will abort any currently running synchronization. S'ha produït un error en accedir al fitxer de configuració a %1. Assegureu-vos que el vostre usuari pugui accedir a aquest fitxer. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + S'ha produït un error en accedir al fitxer de configuració a %1. Assegureu-vos que el vostre compte del sistema pugui accedir al fitxer. - + Quit %1 Surt del %1 @@ -914,12 +993,12 @@ This action will abort any currently running synchronization. Enter username and password for "%1" at %2. - + Introduïu el nom d'usuari i la contrasenya per a «%1» a %2. &Username: - + Nom d'&usuari: @@ -937,64 +1016,224 @@ This action will abort any currently running synchronization. File %1 cannot be uploaded because another file with the same name, differing only in case, exists - + No es pot pujar el fitxer %1 perquè existeix un altre fitxer amb el mateix nom que només es distingeix per les majúscules i les minúscules File %1 has invalid modified time. Do not upload to the server. - + El fitxer %1 té una hora modificada no vàlida. No el pugis al servidor. - + File Removed (start upload) %1 - + S'ha suprimit el fitxer (inicia la pujada) %1 - + File %1 has invalid modification time. Do not upload to the server. - + El fitxer %1 té una hora de modificació no vàlida. No la pugis al servidor. - + Local file changed during syncing. It will be resumed. - + El fitxer local ha canviat durant la sincronització. Es reprendrà. - - + + Local file changed during sync. - + El fitxer local ha canviat durant la sincronització. - + Network error: %1 - + Error de xarxa. %1 - + Error updating metadata: %1 - + S'ha produït un error en actualitzar les metadades: %1 - + The file %1 is currently in use - + El fitxer %1 s'està utilitzant - + The local file was removed during sync. - + S'ha suprimit el fitxer local durant la sincronització. - + Restoration failed: %1 + S'ha produït un error en la restauració: %1 + + + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 OCC::CleanupPollsJob - + Error writing metadata to the database S'ha produït un error en escriure les metadades a la base de dades @@ -1004,7 +1243,7 @@ This action will abort any currently running synchronization. Please enter your End-to-End encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Introduïu la contrasenya de xifratge d'extrem a extrem: <br><br>Nom d'usuari: %2<br>Compte: %3<br> @@ -1012,12 +1251,12 @@ This action will abort any currently running synchronization. Introduïu la contrasenya de xifratge d'extrem a extrem: <br><br>Usuari: %2<br>Compte: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Introduïu la contrasenya de xifratge d'extrem a extrem: <br><br>Nom d'usuari: %2<br>Compte: %3<br> - + Enter E2E passphrase Introduïu la contrasenya d'extrem a extrem @@ -1159,7 +1398,7 @@ This action will abort any currently running synchronization. Timeout - + Temps d'espera @@ -1182,19 +1421,19 @@ This action will abort any currently running synchronization. Error while canceling deletion of a file - + S'ha produït un error en cancel·lar la supressió d'un fitxer Error while canceling deletion of %1 - + S'ha produït un error en cancel·lar la supressió de %1 OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Error del servidor: la resposta PROPFIND no té el format XML. @@ -1202,27 +1441,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Error en obrir la carpeta %1 - + Directory not accessible on client, permission denied La carpeta no és accessible en el client; s'ha denegat el permís - + Directory not found: %1 No s'ha trobat la carpeta: %1 - + Filename encoding is not valid La codificació del nom de fitxer no és vàlida. - + Error while reading directory %1 Error en llegir la carpeta %1 @@ -1230,91 +1469,91 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - + S'ha rebut un testimoni no vàlid. - - - - - - + + + + + + Please try again. - + Torneu-ho a provar. - + Invalid file path was provided. - + S'ha proporcionat un camí de fitxer no vàlid. - + Could not find an account for local editing. - + No s'ha trobat cap compte per a l'edició local. - - + + Could not validate the request to open a file from server. - + No s'ha pogut validar la sol·licitud per a obrir un fitxer des del servidor. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - + No s'ha trobat cap fitxer per a l'edició local. Assegureu-vos que tingui un camí vàlid i que estigui sincronitzat localment. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + No s'ha trobat cap fitxer per a l'edició local. Assegureu-vos que no s'hagi exclòs mitjançant la sincronització selectiva. - + Server error: PROPFIND reply is not XML formatted! - + Error del servidor: la resposta PROPFIND no té el format XML. - + Could not find a remote file info for local editing. Make sure its path is valid. - + No s'ha trobat la informació d'un fitxer remot per a l'edició local. Assegureu-vos que tingui un camí vàlid. - + Could not open %1 - + No s’ha pogut obrir %1 - + File %1 already locked. - + El fitxer %1 ja està bloquejat. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + El bloqueig durarà %1 minuts. També podeu desbloquejar aquest fitxer manualment quan l'hàgiu acabat d'editar. - + File %1 now locked. - + El fitxer %1 ja està bloquejat. - + File %1 could not be locked. - + No s'ha pogut bloquejar el fitxer %1. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. No s'han pogut generar les metadades per al xifratge. S'està desblocant la carpeta. És possible que es tracti d'un problema amb les biblioteques de l'OpenSSL. @@ -1332,13 +1571,13 @@ This can be an issue with your OpenSSL libraries. %1 minute(s) ago minutes elapsed since file last modified - + Fa %n minutsFa %1 minuts %1 hour(s) ago hours elapsed since file last modified - + Fa %1 horesFa %n hores @@ -1443,145 +1682,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existeix. - + %1 should be a folder but is not. %1 hauria de ser una carpeta, però no ho és. - + %1 is not readable. No es pot llegir %1. - + %1 and %n other file(s) have been removed. S'han suprimit %1 i %n fitxer més.S'han suprimit %1 i %n fitxers més. - + %1 has been removed. %1 names a file. S'ha suprimit «%1». - + %1 and %n other file(s) have been added. S'han afegit %1 i %n fitxer més.S'han afegit %1 i %n fitxers més. - + %1 has been added. %1 names a file. S'ha afegit %1. - + %1 and %n other file(s) have been updated. S'han actualitzat %1 i %n fitxer més.S'han actualitzat %1 i %n fitxers més. - + %1 has been updated. %1 names a file. S'ha actualitzat %1. - + %1 has been renamed to %2 and %n other file(s) have been renamed. S'ha canviat el nom de %1 a %2 i d'%n fitxer més.S'ha canviat el nom de %1 a %2 i de %n fitxers més. - + %1 has been renamed to %2. %1 and %2 name files. S'ha canviat el nom de %1 a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. S'ha mogut %1 a %2 i %n fitxer més.S'ha mogut %1 a %2 i %n fitxers més. - + %1 has been moved to %2. S'ha mogut %1 a %2. - + %1 has and %n other file(s) have sync conflicts. %1 i %n fitxer més tenen conflictes de sincronització.%1 i %n fitxers més tenen conflictes de sincronització. - + %1 has a sync conflict. Please check the conflict file! %1 té un conflicte de sincronització. Comproveu el fitxer conflictiu. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. No s'han pogut sincronitzar %1 i %n fitxer més per errors. Consulteu el registre per a obtenir més informació.No s'han pogut sincronitzar %1 i %n fitxers més per errors. Consulteu el registre per a obtenir més informació. - + %1 could not be synced due to an error. See the log for details. No s'ha pogut sincronitzar %1 per un error. Consulteu el registre per a obtenir més informació. - + %1 and %n other file(s) are currently locked. %1 i %n fitxer més estan blocats actualment.%1 i %n fitxers més estan blocats actualment. - + %1 is currently locked. %1 està blocat actualment. - + Sync Activity Activitat de sincronització - + Could not read system exclude file No s'ha pogut llegir el fitxer d'exclusió del sistema - + A new folder larger than %1 MB has been added: %2. S'ha afegit una carpeta amb una mida superior a %1 MB: %2. - + A folder from an external storage has been added. S'ha afegit una carpeta d'una font d'emmagatzematge extern. - + Please go in the settings to select it if you wish to download it. Aneu als paràmetres per a seleccionar si voleu baixar-la. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. S'ha creat la carpeta %1 però ha estat exclosa de la sincronització anteriorment. Les dades que conté no se sincronitzaran. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. S'ha creat el fitxer %1 però ha estat exclosa de la sincronització anteriorment. No se sincronitzarà. - + 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). @@ -1590,7 +1829,7 @@ This means that the synchronization client might not upload local changes immedi No s'ha pogut fer un seguiment fiable dels canvis en les carpetes sincronitzades. Això significa que és possible que el client de sincronització no pugui carregar els canvis locals immediatament i, en canvi, només cercarà els canvis locals i els pujarà ocasionalment (per defecte, cada dues hores). %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1598,24 +1837,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Voleu suprimir tots els fitxers? - + Remove all files Suprimeix tots els fitxers - + Keep files Mantén els fitxers @@ -1651,22 +1890,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No s'ha pogut restaurar l'estat de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (còpia de seguretat) - + (backup %1) (còpia de seguretat %1) @@ -1676,27 +1915,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estat indefinit. - + Undefined state. - + Waiting to start syncing. S'està esperant per a iniciar la sincronització. - + Preparing for sync. S'està preparant la sincronització. - + Sync is running. S'està sincronitzant. - + Sync finished with unresolved conflicts. @@ -1716,62 +1955,62 @@ If this was an accident and you decide to keep your files, they will be re-synce L'usuari ho ha cancel·lat. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronització està en pausa. - + %1 (Sync is paused) %1 (la sincronització està en pausa) - + No valid folder selected! No s'ha seleccionat cap carpeta vàlida. - + The selected path does not exist! El camí seleccionat no existeix. - + The selected path is not a folder! El camí seleccionat no és una carpeta. - + You have no permission to write to the selected folder! No teniu permís per a escriure a la carpeta seleccionada. - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ja conté una carpeta utilitzada en una connexió de sincronització de carpetes. Trieu-ne una altra. - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ja forma part d'una carpeta utilitzada en una connexió de sincronització de carpetes. Trieu-ne una altra. - + There is already a sync from the server to this local folder. Please pick another local folder! Ja hi ha una sincronització entre el servidor i aquesta carpeta local. Trieu una altra carpeta local. @@ -1784,7 +2023,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Afegeix una connexió de sincronització de carpeta - + File Fitxer @@ -1792,152 +2031,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Heu d'estar connectat per a afegir una carpeta - + Click this button to add a folder to synchronize. Feu clic en aquest botó per a afegir una carpeta per a sincronitzar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. S'ha produït un error en carregar la llista de carpetes del servidor. - + Fetching folder list from server … S'està recuperant la llista de carpetes del servidor… - + There are unresolved conflicts. Click for details. Hi ha conflictes sense resoldre. Feu clic per a veure més detalls. - + Virtual file support is enabled. La compatibilitat amb els fitxers virtuals està habilitada. - + Signed out S'ha tancat la sessió - + Synchronizing VirtualFiles with local folder S'estan sincronitzant els fitxers virtuals amb la carpeta local - + Synchronizing with local folder S'està sincronitzant amb la carpeta local - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes S'estan conciliant els canvis - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" S'està sincronitzant %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) baixada a %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) pujada a %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 queden %5, %1 de %2, fitxer %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, fitxer %3 de %4 - + file %1 of %2 fitxer %1 de %2 - + Waiting … S'està esperant… - + Waiting for %n other folder(s) … S'està esperant %n carpeta més...S'estan esperant %n carpetes més... - + Preparing to sync … S'està preparant la sincronització... @@ -2168,13 +2411,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable estable - + beta beta @@ -2226,59 +2469,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Crea un arxiu de depuració - + Server notifications that require attention. Notificacions del servidor que requereixen atenció. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. No podeu inhabilitar l'inici automàtic perquè l'inici automàtic per a tot el sistema està habilitat. - + Change update channel? Voleu canviar el canal d'actualitzacions? - + 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. 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. - + Change update channel Canvia el canal d'actualització - + Cancel Cancel·la - + Zip Archives Arxius zip - + Debug Archive Created S'ha creat l'arxiu de depuració - + Debug archive is created at %1 S'ha creat l'arxiu de depuració a %1 @@ -2286,22 +2529,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Es requereix una contrasenya per a la compartició - + Please enter a password for your link share: Introduïu una contrasenya per a l'enllaç de compartició: - + Sharing error Error de compartició - + Could not retrieve or create the public link share. Error: %1 @@ -2535,6 +2778,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Tanca + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2869,60 +3117,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder Els fitxers virtuals no estan disponibles per la carpeta seleccionada - + Local Sync Folder Carpeta de sincronització local - - + + (%1) (%1) - + There isn't enough free space in the local folder! No hi ha prou espai lliure a la carpeta local. @@ -2994,7 +3242,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3026,144 +3275,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Connectat correctament a %1: %2 versió %3 (%4)</font><br/><br/> - + Invalid URL L'URL no és vàlid - + Failed to connect to %1 at %2:<br/>%3 No s'ha pogut connectar a %1 a %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. S'ha esgotat el temps d'espera en connectar-se a %1 a %2. - + Trying to connect to %1 at %2 … S'està intentant la connexió a %1 a %2... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. El servidor ha prohibit l'accés. Per a comprovar que hi teniu accés, <a href="%1">feu clic aquí</a> per a accedir al servei amb el vostre navegador. - + There was an invalid response to an authenticated WebDAV request S'ha rebut una resposta no vàlida a una sol·licitud WebDAV autenticada - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronització local %1 ja existeix; s'està configurant per a la sincronització.<br/><br/> - + Creating local sync folder %1 … S'està creant la carpeta de sincronització local %1… - + OK - + failed. s'ha produït un error. - + Could not create local folder %1 No s'ha pogut crear la carpeta local %1 - + No remote folder specified! No s'ha especificat cap carpeta remota. - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 s'està creant una carpeta al Nextcloud: %1 - + Remote folder %1 created successfully. S'ha creat la carpeta remota %1 correctament. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ja existeix. S'està connectant per a sincronitzar-la. - - + + The folder creation resulted in HTTP error code %1 La creació de la carpeta ha generat el codi d'error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> S'ha produït un error en crear la carpeta perquè les credencials proporcionades són incorrectes.<br/>Comproveu les credencials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">S'ha produït un error en crear la carpeta remota, probablement perquè les credencials proporcionades són incorrectes.</font><br/>Comproveu les credencials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. S'ha produït un error en crear la carpeta remota %1: <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. S'ha configurat una connexió de sincronització de %1 a la carpeta remota %2. - + Successfully connected to %1! S'ha establert la connexió amb %1 correctament. - + Connection to %1 could not be established. Please check again. No s'ha pogut establir la connexió amb %1. Torneu-ho a provar. - + Folder rename failed S'ha produït un error en canviar el nom de la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>S'ha creat la carpeta de sincronització %1 correctament!</b></font> @@ -3186,12 +3435,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? Voleu habilitar la característica experimental? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3202,12 +3451,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3236,162 +3485,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. No s'admet la sincronització d'enllaços simbòlics. - + File is listed on the ignore list. El fitxer és a la llista de fitxers ignorats. - + File names ending with a period are not supported on this file system. No s'admeten els noms de fitxer que finalitzen amb un punt en aquest sistema de fitxers. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character El nom del fitxer conté com a mínim un caràcter no vàlid - + The file name is a reserved name on this file system. Aquest nom de fitxer és un nom reservat en aquest sistema de fitxers. - + Filename contains trailing spaces. El nom del fitxer conté espais finals. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. El nom del fitxer és massa llarg. - + File/Folder is ignored because it's hidden. S'ignora el fitxer o la carpeta perquè està ocult. - + Stat failed. S'ha produït un error en comprovar l'estat. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflicte: s'ha baixat la versió del servidor, s'ha canviat el nom de la còpia local i no s'ha pujat. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. El nom del fitxer no es pot codificar en el vostre sistema de fitxers. - + The filename is blacklisted on the server. El nom del fitxer es troba en la llista de prohibicions del servidor. - + File has extension reserved for virtual files. El fitxer té una extensió reservada per als fitxers virtuals. - + size mida - + permission - + file id id de fitxer - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist S'ha ignorat perquè es troba a la llista de prohibicions «Trieu què voleu sincronitzar» - + Not allowed because you don't have permission to add subfolders to that folder No es permet perquè no teniu permís per a afegir subcarpetes en aquesta carpeta - + Not allowed because you don't have permission to add files in that folder No es permet perquè no teniu permís per a afegir fitxers en aquesta carpeta - + Not allowed to upload this file because it is read-only on the server, restoring No es permet carregar aquest fitxer perquè és de només lectura en el servidor; s'està restaurant - + Moved to invalid target, restoring S'ha mogut a una destinació no vàlida; s'està restaurant - + Not allowed to remove, restoring No es permet suprimir; s'està restaurant - + Error while reading the database Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3399,22 +3653,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3427,19 +3681,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El fitxer ha canviat des del descobriment - + Could not delete file record %1 from local DB @@ -3450,32 +3704,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! No es pot baixar el fitxer %1 perquè hi ha un conflicte de nom amb un fitxer local. - + The download would reduce free local disk space below the limit La baixada reduiria l'espai lliure del disc local per sota del límit - + Free space on disk is less than %1 L'espai lliure en el disc és inferior a %1 - + File was deleted from server S'ha suprimit el fitxer del servidor - + The file could not be downloaded completely. No s'ha pogut baixar el fitxer completament. - + The downloaded file is empty, but the server said it should have been %1. @@ -3485,18 +3739,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss No es pot desar el fitxer %1 perquè hi ha un conflicte de nom amb un fitxer local. - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3517,7 +3776,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no s'ha pogut suprimir el fitxer %1, error: %2 @@ -3528,16 +3787,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3545,7 +3809,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No s'ha pogut suprimir %1 perquè hi ha un conflicte amb el nom d'un fitxer local @@ -3558,46 +3822,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Error en establir l'estat d'ancoratge - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3618,7 +3887,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3631,12 +3900,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss El servidor ha retornat un codi HTTP incorrecte. S'esperava el codi 201, però s'ha rebut «%1 %2». - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3644,42 +3913,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 No s'ha pogut canviar el nom de «%1» a «%2»; error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". El servidor ha retornat un codi HTTP incorrecte. S'esperava el codi 201, però s'ha rebut «%1 %2». - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state Error en establir l'estat d'ancoratge - + Error writing metadata to the database S'ha produït un error en escriure les metadades a la base de dades @@ -3869,7 +4138,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3887,23 +4156,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Paràmetres - + %1 Settings This name refers to the application name e.g Nextcloud Paràmetres del %1 - + General General - + Network Xarxa - + Account Compte @@ -3911,17 +4180,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3997,7 +4271,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4006,132 +4280,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Compartició del menú contextual - + Select new location … Seleccioneu una ubicació nova… - + I shared something with you He compartit una cosa amb tu - - + + Share options Opcions de compartició - - + + Activity - + Copy private link to clipboard Copia l'enllaç privat al porta-retalls - + Send private link by email … Envia l'enllaç privat per correu electrònic… + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed No es permet tornar a compartir el fitxer - + Resharing this folder is not allowed No es permet tornar a compartir la carpeta - - + + Copy public link Copia l'enllaç públic - + Copy internal link Copia l'enllaç intern - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Edita - + Open in browser Obre en el navegador - + Resolve conflict … Resol el conflicte… - + Move and rename … Mou i canvia el nom... - + Move, rename and upload … Mou, canvia el nom i puja... - + Delete local changes Suprimeix els canvis locals - + Move and upload … Mou i puja... - + Delete Suprimeix @@ -4349,63 +4660,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (s'ha omès a causa d'un error anterior, torneu-ho a provar d'aquí %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 No s'han pogut actualitzar les metadades del fitxer virtual: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicte sense resoldre. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Només hi ha %1 disponibles, necessiteu com a mínim %2 per a començar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No es pot obrir o crear la base de dades de sincronització local. Assegureu-vos que teniu accés d'escriptura a la carpeta de sincronització. - + Using virtual files with suffix, but suffix is not set S'estan utilitzant fitxers virtuals amb sufix però no s'ha definit el sufix - + Unable to read the blacklist from the local database No s'ha pogut llegir la llista negra de la base de dades local. - + Unable to read from the sync journal. No s'ha pogut llegir el diari de sincronització. - + Cannot open the sync journal No es pot obrir el diari de sincronització @@ -4415,12 +4726,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Queda poc espai en el disc: s'han omès les baixades que reduirien l'espai lliure per sota de %1. - + There is insufficient space available on the server for some uploads. No hi ha prou espai en el servidor per a pujar-hi alguns fitxers. @@ -4489,59 +4800,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Afegeix un compte - + Open main dialog Obre el quadre de diàleg principal - - + + Pause sync Atura la sincronització - - + + Resume sync Reprèn la sincronització - + Settings Paràmetres - + Help - + Exit %1 Surt del %1 - + Pause sync for all Atura la sincronització de tot - + Resume sync for all Reprèn la sincronització de tot - + %1: %2 %1: %2 @@ -4549,24 +4860,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Client d'escriptori del %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versió %1. Per a obtenir més informació, feu clic <a href='%2'>aquí</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Aquesta versió ha estat proporcionada per %1</p> @@ -4574,22 +4885,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4597,30 +4908,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Torna a intentar totes les pujades + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Confirmeu la supressió del compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Segur que voleu suprimir la connexió al compte <i>%1</i>?</p><p><b>Nota:</b> això <b>no</b> suprimirà cap fitxer.</p> - + Remove connection Suprimeix la connexió - + Cancel Cancel·la @@ -4758,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4767,8 +5084,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4866,123 +5183,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version La versió del servidor no és compatible - + 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. El servidor del compte %1 utilitza la versió %2, que ha quedat obsoleta. No s'ha provat l'ús d'aquest client amb versions del servidor obsoletes i és potencialment perillós. Continueu sota la vostra responsabilitat. - + Disconnected Desconnectat - + Disconnected from some accounts Desconnectat d'alguns comptes - + Disconnected from %1 Desconnectat de %1 - + Disconnected from accounts: Desconnectat dels comptes: - + Account %1: %2 Compte %1: %2 - + Please sign in Inicieu la sessió - + Signed out S'ha tancat la sessió - + Account synchronization is disabled La sincronització del compte està inhabilitada - - + + Synchronization is paused La sincronització està en pausa - + Folder %1: %2 Carpeta %1: %2 - + Unresolved conflicts Conflictes sense resoldre - + Up to date Actualitzat - + Error during synchronization S'ha produït un error durant la sincronització - + There are no sync folders configured. No s'ha configurat cap carpeta de sincronització. - + No sync folders configured No s'ha configurat cap carpeta de sincronització - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) S'està sincronitzant %1 de %2 (queden %3) - + Syncing %1 of %2 S'està sincronitzant %1 de %2 - + Syncing %1 (%2 left) S'està sincronitzant %1 (queden %2) - + Syncing %1 S'està sincronitzant %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5134,27 +5451,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5220,30 +5537,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5259,7 +5652,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5317,6 +5710,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5380,67 +5789,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5524,24 +5933,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Quadre de diàleg principal del client d'escriptori del Nextcloud - + Current account Compte actual - - + + Resume sync for all Reprèn la sincronització de tot - - + + Pause sync for all Atura la sincronització de tot @@ -5551,22 +5960,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Afegeix un compte - + Add new account Afegeix un compte - + Settings Paràmetres - + Exit Surt @@ -5575,11 +5984,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Avatar de l'usuari actual - - - Current account avatar - - Current user status is online @@ -5591,70 +5995,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu Canvi de compte i menú de paràmetres - + Open local folder of current account Obre la carpeta local del compte actual - + Connected Connectat - + Disconnected Desconnectat - + Open Nextcloud Talk in browser Obre l'aplicació Converses del Nextcloud al navegador - + More apps Més aplicacions - + Open %1 in browser Obre %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La safata del sistema no està disponible - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5662,7 +6071,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Compilat a partir de la revisió del Git <a href="%1">%2</a> el %3 a les %4 mitjançant Qt %5, %6</small></p> @@ -5696,72 +6105,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted S'ha suprimit - + Moved to %1 S'ha mogut a %1 - + Ignored S'ha ignorat - + Filesystem access error Error d'accés al sistema de fitxers - + Error Error - + Updated local metadata S'han actualitzat les metadades locals - + Unknown Desconegut - + downloading s'està baixant - + uploading s'està pujant - + deleting s'està suprimint - + moving s'està movent - + ignoring s'està ignorant - + error error - + updating local metadata s'estan actualitzant les metadades locals diff --git a/translations/client_cs.ts b/translations/client_cs.ts index 0034c965a..26fd99428 100644 --- a/translations/client_cs.ts +++ b/translations/client_cs.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Otevřít %1 lokálně - + In %1 V %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Zobrazit další akce @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Zahodit + + + Open file details + Otevřít podrobnosti o souboru + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Seznam aktivit @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Vyčistit nabídku se stavovými zprávami @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Zahodit + + + Activity Aktivita - + Sharing Sdílení @@ -226,12 +236,12 @@ Přesouvání do KoÅ¡e není na této platformě implementováno - + Error removing "%1": %2 Chyba při odebírání „%1“: %2 - + Could not remove folder "%1" Nedaří se odstranit složku „%1“ @@ -321,7 +331,7 @@ Serverem vrácen neplatný HTTP kód. Očekáván 204, ale obdržen „%1 %2“. - + "%1 Failed to unlock encrypted folder %2". „%1 se nepodařilo odemknout zaÅ¡ifrovanou složku %2“. @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Soubor %1 už je uzamčeno %2. - + Lock operation on %1 failed with error %2 Operace uzamčení na %1 se nezdařila s chybou %2 - + Unlock operation on %1 failed with error %2 Operace odemčení na %1 se nezdařila s chybou %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Storno @@ -400,12 +410,12 @@ Zdá se, že pro tuto složku máte zapnutou funkci Virtuální soubory. V tuto chvíli není možné výslovně stahovat virtuální soubory, které jsou Å¡ifrovány mezi koncovými body. Pokud chcete, aby vám virtuální soubory a Å¡ifrování mezi koncovými body fungovalo co nejlépe, ověřte, že Å¡ifrovaná složka je označena jako „Vždy zpřístupnit lokálně“. - + End-to-end Encryption with Virtual Files Å ifrování mezi koncovými body u virtuálních souborů - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Zdá se, že pro tuto složku máte zapnutou funkci Virtuální soubory. V tuto chvíli není možné výslovně stahovat virtuální soubory, které jsou Å¡ifrovány mezi koncovými body. Pokud chcete, aby vám virtuální soubory a Å¡ifrování mezi koncovými body fungovalo co nejlépe, ověřte, že Å¡ifrovaná složka je označena jako „Vždy zpřístupnit lokálně“. @@ -415,29 +425,29 @@ NeÅ¡ifrovat složku - + Do not encrypt folder NeÅ¡ifrovat složku - + Encrypt folder ZaÅ¡ifrovat složku - + No account configured. Nenastaven žádný účet. - - Display mnemonic - Zobrazit mnemotechnickou frázi + + Disable encryption + Vypnout Å¡ifrování - End-to-end encryption has been enabled for this account - Å ifrování mezi koncovými body bylo pro tento účet zapnuto + Display mnemonic + Zobrazit mnemotechnickou frázi @@ -445,19 +455,24 @@ Zapnout Å¡ifrování - + + End-to-end encryption has been enabled for this account + Å ifrování mezi koncovými body bylo pro tento účet zapnuto + + + Warning Varování - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? Å ifrování mezi koncovými body není na tomto zařízení nastaveno. Jakmile bude nastaveno, bude možné tuto složku Å¡ifrovat. Chcete nastavit Å¡ifrování mezi koncovými body? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Není možné zaÅ¡ifrovat složku, která něco obsahuje – přesuňte soubory pryč. @@ -470,121 +485,121 @@ Počkejte na příští synchronizaci a pak složku zaÅ¡ifrujte. Tento účet podporuje Å¡ifrování mezi koncovými body - + Encryption failed Å ifrování se nezdařilo - + Could not encrypt folder because the folder does not exist anymore Složku není možné zaÅ¡ifrovat, protože už neexistuje - - + + Open folder Otevřít složku - + Encrypt Šífrovat - - + + Edit Ignored Files Upravit ignorované soubory - - + + Create new folder Vytvořit novou složku - - + + Availability Dostupnost - + Choose what to sync Vyberte co synchronizovat - + Force sync now Vynutit synchronizaci nyní - + Restart sync Restartovat synchronizaci - + Resume sync Pokračovat v synchronizaci - + Pause sync Pozastavit synchronizaci - + Remove folder sync connection Odstranit připojení synchronizace složky - + Disable virtual file support … Vypnout podporu pro virtuální soubory… - + Enable virtual file support %1 … Zapnout podporu pro virtuální soubory %1… - + (experimental) (experimentální) - + Folder creation failed Vytvoření složky se nezdařilo - + <p>Could not create local folder <i>%1</i>.</p> <p>Nedaří se vytvořit místní složku <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Potvrdit odstranění připojení synchronizace složky - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Opravdu chcete zastavit synchronizaci složky <i>%1</i>?</p><p><b>Poznámka:</b> Toto <b>neodstraní</b> žádné soubory.</p> - + Remove Folder Sync Connection Odstranit připojení synchronizace složky - + Disable virtual file support? Vypnout podporu pro virtuální soubory? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ Jediná výhoda vypnutí podpory virtuálních souborů je v tom, že bude opět Současně tato akce zruší jakoukoli právě probíhající synchronizaci. - + Disable support Vypnout podporu @@ -607,145 +622,177 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci.Mnemotechnická fráze pro Å¡ifrování mezi koncovými body - + End-to-end encryption mnemonic Mnemotechnická fráze pro Å¡ifrování mezi koncovými body - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Pro ochranu vaší kryptografické identity ji Å¡ifrujeme pomocí mnemotechnické fráze, tvořené 12 slovy ze slovníku. Poznamenejte si ji někam bezpečně. Bude potřebná pro přidání dalších zařízení k vaÅ¡emu účtu (jako je mobilní telefon či notebook). - + + Disable end-to-end encryption + Vypnout Å¡ifrování mezi koncovými body + + + + Disable end-to-end encryption for %1? + Vypnout Å¡ifrování mezi koncovými body pro %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Odebrání Å¡ifrování mezi koncovými body odebere lokálně synchronizované soubory, které jsou Å¡ifrované.<br>ZaÅ¡ifrované soubory zůstanou na serveru. + + + Sync Running Probíhá synchronizace - + The syncing operation is running.<br/>Do you want to terminate it? Právě probíhá operace synchronizace.<br/>Přejete si ji ukončit? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Využito %1 (%3%) z %2. Některé složky, včetně těch připojených ze sítě nebo sdílených, mohou mít odliÅ¡né limity. - + %1 of %2 in use Využito %1 z %2 - + Currently there is no storage usage information available. V tuto chvíli nejsou k dispozici žádné informace o využití úložiÅ¡tě. - + %1 in use %1 využito - + %1 as %2 %1 jako %2 - + The server version %1 is unsupported! Proceed at your own risk. Verze serveru %1 není podporována! Pokračujte jen na vlastní nebezpečí. - + Connected to %1. Připojeno k %1. - + Server %1 is temporarily unavailable. Server %1 je dočasně nedostupný. - + Server %1 is currently in maintenance mode. Na serveru %1 v tuto chvíli probíhá údržba. - + Signed out from %1. Odhlášeno z %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Získávání pověření z prohlížeče. <a href='%1'>Klikněte sem</a> a bude opětovně otevřen. - + Connecting to %1 … Připojování k %1… - + No connection to %1 at %2. Bez připojení k %1 na %2. - + Server configuration error: %1 at %2. Chyba nastavení serveru: %1 na %2. - + No %1 connection configured. Nenastaveno žádné připojení k %1. - + There are folders that were not synchronized because they are too big: Tyto složky nebyly synchronizovány, protože jsou příliÅ¡ velké: - + There are folders that were not synchronized because they are external storages: Tyto složky nebyly synchronizovány, protože se nacházejí na externích úložiÅ¡tích: - + There are folders that were not synchronized because they are too big or external storages: Tyto složky nebyly synchronizovány, protože jsou příliÅ¡ velké, nebo se nacházejí na externích úložiÅ¡tích: - + Confirm Account Removal Potvrdit odstranění účtu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Opravdu chcete odstranit připojení k účtu <i>%1</i>?</p><p><b>Poznámka:</b> Toto <b>neodstraní</b> žádné soubory.</p> - + Remove connection Odstranit připojení - - + This account supports end-to-end encryption Tento účet podporuje Å¡ifrování mezi koncovými body - + Set up encryption Nastavit Å¡ifrování - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - Å ifrování mezi koncovými body pro tento účet bylo zapnuté z jiného zařízení.<br>Na stávajícím zařízení je možné ho zapnout zadáním vaší mnemotechnické. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Å ifrování mezi koncovými body pro tento účet bylo zapnuté z jiného zařízení.<br>Na stávajícím zařízení je možné ho zapnout zadáním vaší mnemotechnické.<br>Toto zapne synchronizaci existujících Å¡ifrovaných složek. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Požadavek na ověření byl přesměrován na „%1“. URL je chybná, server není správně nastaven. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Přístup zamítnut serverem. Pro ověření správných přístupových práv <a href="%1">klikněte sem</a> a otevřete službu ve svém prohlížeči. + + + + There was an invalid response to an authenticated WebDAV request + PřiÅ¡la neplatná odpověď na WebDAV požadavek s ověřením se @@ -799,7 +846,7 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci. OCC::ActivityListModel - + For more activities please open the Activity app. Více z aktivit si zobrazíte otevřením aplikace Aktivity @@ -809,12 +856,12 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci.Získávání aktivit… - + Fetching activities … Získávání aktivit… - + Files from the ignore list as well as symbolic links are not synced. Soubory ze seznamu ignorovaných a symbolické odkazy nejsou synchronizovány. @@ -865,32 +912,59 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Pokračování bude znamenat <b>vymazání těchto nastavení</b>. - + Continuing will mean <b>ignoring these settings</b>. Pokračování bude znamenat <b>ignorování těchto nastavení</b>. - + 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>. Některá nastavení byla vytvořena v novejší verzi tohoto klienta a využívají funkce, které tato verze nepodporuje.<br><br>%1<br><br>Stávající soubory s nastaveními byly zazálohovány do <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Ukončit - + Continue Pokračovat - + Error accessing the configuration file Chyba při přístupu k souboru s nastaveními @@ -900,12 +974,12 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci.DoÅ¡lo k chybě při přístupu k souboru s nastaveními %1. Ověřte, že váš uživatelský účet má k souboru přístup. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. DoÅ¡lo k chybě při přístupu k souboru s nastaveními %1. Ověřte, že váš účet na systému má k souboru přístup. - + Quit %1 Ukončit %1 @@ -951,56 +1025,216 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci.Soubor %1 nemá platný čas změny. Nenahrávat na server. - + File Removed (start upload) %1 Soubor odebrán (zahájit nahrávání) %1 - + File %1 has invalid modification time. Do not upload to the server. Soubor %1 nemá platný čas změny. Nenahrávat na server. - + Local file changed during syncing. It will be resumed. Místní soubor se během synchronizace změnil. Bude zopakována. - - + + Local file changed during sync. Místní soubor byl změněn během synchronizace. - + Network error: %1 Chyba sítě: %1 - + Error updating metadata: %1 Chyba při aktualizování metadat: %1 - + The file %1 is currently in use Soubor %1 je v tuto chvíli používán jinou aplikací - + The local file was removed during sync. Místní soubor byl odstraněn během synchronizace. - + Restoration failed: %1 Obnovení se nezdařilo: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Soubor není možné přejmenovat, protože soubor se stejným názvem na serveru už existuje. Vyberte jiný název. + + + + Could not rename file. Please make sure you are connected to the server. + Přejmenovat soubor se nepodařilo. Ujistěte se, že jste připojení k serveru. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Nemáte potřebná práva k přejmenování souboru. Požádejte vlastníka souboru, aby ho přejmenoval. + + + + Failed to fetch permissions with error %1 + Nepodařilo se získat oprávnění kvůli chybě %1 + + + + Filename contains leading and trailing spaces. + Název souboru obsahuje mezery na začátku a konci. + + + + Filename contains leading spaces. + Název souboru obsahuje mezery na začátku. + + + + Filename contains trailing spaces. + Název souboru obsahuje mezery na konci. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Kolize stejných názvů lišících se jen velikostí písmen + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Soubor nemohl být synchronizován protože vytváří kolizi stejných názvů lišících se jen velikostí písmen s existujícím souborem na tomto stroji. + + + + Error + Chyba + + + + Existing file + Existující soubor + + + + file A + + + + + fileA + SouborA + + + + + today + dnes + + + + + 0 byte + 0 bajtů + + + + + Open existing file + Otevřít existující soubor + + + + Case clashing file + Soubor vyvolávající kolizi stejných názvů lišících se jen velikostí písmen + + + + file B + + + + + fileB + souborB + + + + + Open clashing file + Otevřít soubor vyvolávající kolizi stejných názvů lišících se jen velikostí písmen + + + + Please enter a new name for the clashing file: + Zadejte nový název pro soubor vyvolávající kolizi stejných názvů lišících se jen velikostí písmen: + + + + New filename + Nový název souboru + + + + Rename file + Přejmenovat soubor + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Soubor „%1“ nebylo možné synchronizovat kvůli kolizi stejných názvů lišících se jen velikostí písmen s existujícím souborem na tomto stroji. + + + + %1 does not support equal file names with only letter casing differences. + %1 nepodporuje stejné názvy souborů lišící se pouze velikostí písmen. + + + + Filename contains leading and trailing spaces. + Název souboru obsahuje mezery na začátku a konci. + + + + Filename contains leading spaces. + Název souboru obsahuje mezery na začátku. + + + + Filename contains trailing spaces. + Název souboru obsahuje mezery na konci. + + + + Use invalid name + Použít neplatný název + + + + Filename contains illegal characters: %1 + Název souboru obsahuje neplatné znaky: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Chyba zápisu metadat do databáze @@ -1018,12 +1252,12 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci.Zadejte heslovou frázi pro Å¡ifrování mezi koncovými body: <br><br>Uživatel: %2<br>Účet: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Zadejte heslovou frázi pro Å¡ifrování mezi koncovými body: <br><br>Uživatelské jméno: %2<br>Účet: %3<br> - + Enter E2E passphrase Zadejte heslovou frázi pro Å¡ifr. mezi konc. body @@ -1199,8 +1433,8 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Chyba serveru: odpověď PROPFIND není ve formátu XML! @@ -1208,27 +1442,27 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Chyba při otevírání adresáře %1 - + Directory not accessible on client, permission denied Adresář není klientem přístupný, oprávnění odepřeno - + Directory not found: %1 Adresář nenalezen: %1 - + Filename encoding is not valid Znaková sada názvu souboru není platná - + Error while reading directory %1 Chyba při načítání adresáře %1 @@ -1236,91 +1470,91 @@ Současně tato akce zruší jakoukoli právě probíhající synchronizaci. OCC::EditLocallyJob - + Invalid token received. Obdržen neplatný token. - - - - - - + + + + + + Please try again. Zkuste to znovu. - + Invalid file path was provided. Zadán neplatný popis umístění souboru. - + Could not find an account for local editing. Nedaří se nalézt účet pro lokální upravování. - - + + Could not validate the request to open a file from server. Nedaří se ověřit správnost požadavku na otevření souboru ze serveru. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Nepodařilo se nalézt soubor pro místní upravování. Ověřte, že jeho popis umístění je platný a že je synchronizovaný lokálně. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Nepodařilo se nalézt soubor pro místní upravování. Ověřte, že není vyjmutý prostřednictvím selektivní synchronizace. - + Server error: PROPFIND reply is not XML formatted! Chyba serveru: odpověď PROPFIND není ve formátu XML! - + Could not find a remote file info for local editing. Make sure its path is valid. Nepodařilo se nalézt informace o vzdáleném souboru pro upravování místně. Ověřte, že popis umístění je platný. - + Could not open %1 - + %1 se nedaří otevřít - + File %1 already locked. - + Soubor %1 už je uzamčen. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Zámek bude trvat %1 minut. Je možné tento soubor odemknout ručně, jakmile dokončíte úpravy. - + File %1 now locked. - + Soubor %1 je nyní uzamčen. - + File %1 could not be locked. - + Soubor %1 se nepodařilo uzamknout. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Nedaří se vytvořit metadata pro Å¡ifrování. Složka bude odemčena. @@ -1450,144 +1684,144 @@ Toto může být způsobeno problémem s OpenSSL knihovnami. OCC::Folder - + Local folder %1 does not exist. Místní složka %1 neexistuje. - + %1 should be a folder but is not. %1 by měla být složka, ale není. - + %1 is not readable. %1 není čitelné. - + %1 and %n other file(s) have been removed. %1 a %n další soubor bude smazán.%1 a %n další soubory budou smazány.%1 a %n dalších souborů bude smazáno.%1 a %n další soubory budou smazány. - + %1 has been removed. %1 names a file. %1 byl odebrán. - + %1 and %n other file(s) have been added. %1 byl přidán.%1 a %n další soubory byly přidány.%1 a %n dalších souborů bylo přidáno.%1 a %n další soubory byly přidány. - + %1 has been added. %1 names a file. %1 byl přidán. - + %1 and %n other file(s) have been updated. %1 a %n další soubor byl aktualizován.%1 a %n další soubory byly aktualizovány.%1 a %n dalších souborů bylo aktualizováno.%1 a %n další soubory byly aktualizovány. - + %1 has been updated. %1 names a file. %1 byl aktualizován. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 byl přejmenován na %2 a %n další soubor byl přejmenován%1 byl přejmenován na %2 a %n další soubory byly přejmenovány.%1 byl přejmenován na %2 a %n dalších souborů bylo přejmenováno.%1 byl přejmenován na %2 a %n další soubory byly přejmenovány. - + %1 has been renamed to %2. %1 and %2 name files. %1 byl přejmenován na %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 byl přesunut do %2 a %n další soubor byl přesunut.%1 byl přesunut do %2 a %n další soubory byly přesunuty.%1 byl přesunut do %2 a %n dalších souborů bylo přesunuto.%1 byl přesunut do %2 a %n další soubory byly přesunuty. - + %1 has been moved to %2. %1 byl přesunut do %2. - + %1 has and %n other file(s) have sync conflicts. %1 a %n další soubor má konflikt při synchronizací.%1 a %n další soubory mají konflikty při synchronizací.%1 a %n dalších souborů má konflikty synchronizací.%1 a %n další soubory mají konflikt se synchronizací. - + %1 has a sync conflict. Please check the conflict file! %1 má konflikt se synchronizací. Zkontrolujte soubor s konflikty. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 a %n další soubor nemůže být synchronizován kvůli chybám. Podrobnosti naleznete v záznamu událostí.%1 a %n další soubory nemohou být synchronizovány kvůli chybám. Podrobnosti naleznete v záznamu událostí.%1 a %n dalších souborů nemůže být synchronizováno kvůli chybám. Podrobnosti naleznete v záznamu událostí.%1 a %n další soubory nemohou být synchronizovány kvůli chybám. Podrobnosti naleznete v záznamu událostí. - + %1 could not be synced due to an error. See the log for details. %1 nemohl být kvůli chybě synchronizován. Podrobnosti naleznete v záznamu událostí. - + %1 and %n other file(s) are currently locked. %1 a další %n soubor je v tuto chvíli uzamčen.%1 a další %n soubory jsou v tuto chvíli uzamčeny.%1 a dalších %n souborů je v tuto chvíli uzamčených.%1 a další %n soubory jsou v tuto chvíli uzamčeny. - + %1 is currently locked. %1 je v tuto chvíli uzamčeno. - + Sync Activity Průběh synchronizace - + Could not read system exclude file Nezdařilo se přečtení systémového souboru s položkami pro vynechání - + A new folder larger than %1 MB has been added: %2. Byla přidána nová složka větší než %1 MB: %2. - + A folder from an external storage has been added. Byla přidána složka z externího úložiÅ¡tě. - + Please go in the settings to select it if you wish to download it. Pokud to chcete stáhnout, jděte do nastavení a vyberte to. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Složka %1 byla vytvořena ale byla už dříve vynechána ze synchronizace. Data, která se v ní nacházejí, nebudou synchronizována. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Soubor %1 byl vytvořen ale byl už dříve vynechán ze synchronizace. Nebude synchronizován. - + 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). @@ -1600,7 +1834,7 @@ To znamená, že se může stávat, že synchronizační klient nebude místní %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ Pokud se rozhodnete soubory ponechat, budou opět synchronizovány se serverem, Pokud se rozhodnete soubory smazat, budou vám nedostupné, pokud nejste jejich vlastníkem. - + 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. @@ -1620,17 +1854,17 @@ Opravdu chcete tyto změny provést i na serveru? Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru znovu synchronizovány. - + Remove All Files? Odebrat veÅ¡keré soubory? - + Remove all files Odebrat veÅ¡keré soubory - + Keep files Ponechat soubory @@ -1666,22 +1900,22 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn OCC::FolderMan - + Could not reset folder state Nedaří se obnovit stav složky - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Byl nalezen starý záznam synchronizace „%1“, ale nebylo možné ho odebrat. Ujistěte se, že není aktuálně používán jinou aplikací. - + (backup) (záloha) - + (backup %1) (záloha %1) @@ -1691,27 +1925,27 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn Nedefinovaný stav. - + Undefined state. Nedefinovaný stav. - + Waiting to start syncing. Čeká na spuÅ¡tění synchronizace. - + Preparing for sync. Příprava na synchronizaci. - + Sync is running. Synchronizace je spuÅ¡těná. - + Sync finished with unresolved conflicts. Synchronizace dokončena s nevyřeÅ¡enými konflikty. @@ -1731,62 +1965,62 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn ZruÅ¡eno uživatelem. - + Last sync was successful. Poslední synchronizace byla úspěšná. - + Setup error. Chyba nastavení. - + Sync request was cancelled. Požadavek na synchronizaci zruÅ¡en. - + Sync is paused. Synchronizace je pozastavena. - + %1 (Sync is paused) %1 (synchronizace je pozastavena) - + No valid folder selected! Nevybrána platná složka! - + The selected path does not exist! Vybraný popis umístění neexistuje! - + The selected path is not a folder! Vybraný popis umístění není složka! - + You have no permission to write to the selected folder! Nemáte oprávnění pro zápis do zvolené složky! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Místní složka %1 už obsahuje podsložku použitou pro synchronizaci. Zvolte jinou! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Místní složka %1 už je obsažena ve složce, použité pro synchronizaci. Zvolte jinou! - + There is already a sync from the server to this local folder. Please pick another local folder! Ze serveru se do tohoto umístění už synchronizuje. Zvolte jinou místní složku! @@ -1799,7 +2033,7 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn Přidat připojení synchronizace složky - + File Soubor @@ -1807,152 +2041,156 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn OCC::FolderStatusModel - + You need to be connected to add a folder Pro přidání složky je třeba, abyste byli připojení - + Click this button to add a folder to synchronize. Kliknutím na toto tlačítko přidáte složku k synchronizaci. - - + + Could not decrypt! + Nepodařilo se rozÅ¡ifrovat! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Chyba při načítání seznamu složek ze serveru. - + Fetching folder list from server … Načítání seznamu složek ze serveru… - + There are unresolved conflicts. Click for details. Jsou zde nevyřeÅ¡ené konflikty. Podrobnosti si zobrazíte kliknutím. - + Virtual file support is enabled. Podpora pro virtuální soubory zapnuta. - + Signed out Odhlášeno - + Synchronizing VirtualFiles with local folder Synchronizují se virtuální soubory s místní složkou - + Synchronizing with local folder Synchronizuje se s místní složkou - + Checking for changes in remote "%1" Zjišťují se změny ve vzdáleném „%1“ - + Checking for changes in local "%1" Zjišťují se změny v místním „%1“ - + Reconciling changes Slučování změn - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synchronizuje se %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) stahování %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) odesílání %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 ze %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Zbývá několik sekund, %1 z %2, soubor %3 z %4 - + %5 left, %1 of %2, file %3 of %4 %5 zbývá, %1 ze %2, soubor %3 z %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 z %2, soubor %3 z %4 - + file %1 of %2 soubor %1 z %2 - + Waiting … Čeká se… - + Waiting for %n other folder(s) … Čeká se na %n další složku…Čeká se na %n další složky…Čeká se na %n dalších složek…Čeká se na %n další složky… - + Preparing to sync … Příprava na synchronizaci… @@ -2183,13 +2421,13 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn - + stable stabilní - + beta vývojové @@ -2241,32 +2479,32 @@ Pokud to byla pouze chyba a chcete si tyto soubory ponechat, budou ze serveru zn - + Create Debug Archive Vytvořit archiv s informacemi pro ladění - + Server notifications that require attention. Upozornění ze serveru, která vyžadují pozornost. - + Show call notification dialogs. Zobrazovat dialogy upozornění na hovor. - + You cannot disable autostart because system-wide autostart is enabled. Automatické spouÅ¡tění nemůžete vypnout, protože je celosystémově zapnuté pro vÅ¡echny uživatele. - + Change update channel? Změnit kanál aktualizací? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Poznamenejme, že je možné přejít na novější verzi, ale není možné se vrátit ke starší. To znamená, že návrat z beta kanálu ke stabilnímu obvykle potrvá, protože se čeká, až bude nabídnuta stabilní verze klienta novější, než nainstalovaná vývojová verze. - + Change update channel Změnit kanál aktualizací - + Cancel Storno - + Zip Archives Zip archivy - + Debug Archive Created Archiv s informacemi pro ladění vytvořen - + Debug archive is created at %1 Archiv s ladicími informacemi je vytvořen v %1 @@ -2303,22 +2541,22 @@ Poznamenejme, že je možné přejít na novější verzi, ale není možné se OCC::GetOrCreatePublicLinkShare - + Password for share required Je vyžadováno heslo ke sdílení - + Please enter a password for your link share: Zadejte heslo pro sdílení odkazem: - + Sharing error Chyba sdílení - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Položky u kterých je umožněno mazání budou smazány, pokud brání tomu, a Close Zavřít + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Poznamenejme, že použití jakékoli volby příkazového řádku má před tí - + Use &virtual files instead of downloading content immediately %1 Použít &virtuální soubory místo okamžitého stahování obsahu %1 - + (experimental) (experimentální) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Ve Windows kořenovém adresáři oddílu disku nejsou virtuální soubory podporovány. Vyberte platný adresář v disku. - + %1 folder "%2" is synced to local folder "%3" %1 složka „%2“ je synchronizována do místní složky „%3“ - + Sync the folder "%1" Synchronizovat složku „%1“ - + Warning: The local folder is not empty. Pick a resolution! Varování: Místní složka není prázdná. Zvolte další postup! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 volného místa - + Virtual files are not available for the selected folder Pro označenou složku nejsou virtuální soubory k dispozici - + Local Sync Folder Místní synchronizovaná složka - - + + (%1) (%1) - + There isn't enough free space in the local folder! V místní složce není dostatek volného místa! @@ -3016,7 +3259,8 @@ Poznamenejme, že použití jakékoli volby příkazového řádku má před tí OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Pro soubor %1, který je v konfliktu, se nedaří zjistit čas poslední změny @@ -3048,144 +3292,144 @@ Poznamenejme, že použití jakékoli volby příkazového řádku má před tí OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Úspěšně připojeno k %1: %2 verze %3 (%4)</font><br/><br/> - + Invalid URL Neplatná URL adresa - + Failed to connect to %1 at %2:<br/>%3 Nepodařilo se spojit s %1 v %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Překročen časový limit při pokusu o připojení k %1 na %2. - + Trying to connect to %1 at %2 … Pokus o připojení k %1 na %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Požadavek na ověření byl přesměrován na „%1“. URL je chybná, server není správně nastaven. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Přístup zamítnut serverem. Pro ověření správných přístupových práv <a href="%1">klikněte sem</a> a otevřete službu ve svém prohlížeči. - + There was an invalid response to an authenticated WebDAV request PřiÅ¡la neplatná odpověď na WebDAV požadavek s ověřením se - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Místní synchronizovaná složka %1 už existuje, nastavuje se pro synchronizaci.<br/><br/> - + Creating local sync folder %1 … Vytváření místní složky pro synchronizaci %1… - + OK OK - + failed. nezdařilo se. - + Could not create local folder %1 Nedaří se vytvořit místní složku %1 - + No remote folder specified! Není nastavena žádná federovaná složka! - + Error: %1 Chyba: %1 - + creating folder on Nextcloud: %1 vytváří se složka na Nextcloud: %1 - + Remote folder %1 created successfully. Složka %1 byla na federované straně úspěšně vytvořena. - + The remote folder %1 already exists. Connecting it for syncing. Složka %1 už na federované straně existuje. Probíhá propojení synchronizace. - - + + The folder creation resulted in HTTP error code %1 Vytvoření složky se nezdařilo s HTTP chybou %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Vytvoření federované složky se nezdařilo, pravděpodobně z důvodu neplatných přihlaÅ¡ovacích údajů.<br/>VraÅ¥te se zpět a zkontrolujte je.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Vytvoření federované složky se nezdařilo, pravděpodobně z důvodu neplatných přihlaÅ¡ovacích údajů.</font><br/>VraÅ¥te se zpět a zkontrolujte je.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Vytváření federované složky %1 se nezdařilo s chybou <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Bylo nastaveno synchronizované spojení z %1 do federovaného adresáře %2. - + Successfully connected to %1! Úspěšně spojeno s %1. - + Connection to %1 could not be established. Please check again. Spojení s %1 se nedaří navázat. Znovu to zkontrolujte. - + Folder rename failed Přejmenování složky se nezdařilo - + Cannot 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. Složku není možné odstranit ani zazálohovat, protože podložka nebo soubor v něm je otevřen v jiném programu. Zavřete podsložku nebo soubor v dané aplikaci a zkuste znovu nebo celou tuto akci zruÅ¡te. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Místní synchronizovaná složka %1 byla úspěšně vytvořena!</b></font> @@ -3208,12 +3452,12 @@ Poznamenejme, že použití jakékoli volby příkazového řádku má před tí Storno - + Enable experimental feature? Zapnout experimentální funkci? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Přepnutí do tohoto režimu přeruší případné právě spuÅ¡těná synchron Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, prosíme nahlaste případné chyby, které objevíte. - + Enable experimental placeholder mode Zapnout experimentální režim výplně - + Stay safe Zůstaňte v bezpečí @@ -3264,162 +3508,167 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Synchronizace nepodporuje symbolické odkazy. - + File is listed on the ignore list. Soubor je uveden na seznamu k ignorování. - + File names ending with a period are not supported on this file system. Na tomto souborovém systému nejsou podporovány názvy souborů končící na tečku. - + File names containing the character "%1" are not supported on this file system. Názvy souborů obsahující znak „%1“ nejsou na tomto souborovém systému podporovány. - + File name contains at least one invalid character Název souboru obsahuje přinejmenším jeden neplatný znak - + The file name is a reserved name on this file system. Název souboru je na tomto souborovém systému rezervovaným názvem (nelze ho použít). - + Filename contains trailing spaces. Název souboru končí na mezery. - + Filename contains leading spaces. Název souboru začíná na mezery. - + Filename contains leading and trailing spaces. Název souboru začíná a končí mezerami. - + Filename is too long. Název souboru je příliÅ¡ dlouhý. - + File/Folder is ignored because it's hidden. Soubor/složka je ignorovaná, protože je skrytá. - + Stat failed. ZjiÅ¡tění existence (stat) se nezdařilo. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Stažena verze ze serveru, místní kopie přejmenována a nenahrána. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Kolize stejných názvů lišících se jen velikostí písmen: soubor ze serveru stažen a přejmenován, aby se zabránilo kolizi. + + + The filename cannot be encoded on your file system. Enkódování tohoto názvu souboru je mimo technické možnosti daného souborového systému. - + The filename is blacklisted on the server. Takový název souboru je na serveru zařazen na seznam nepřípustných. - + File has extension reserved for virtual files. Soubor má příponu vyhrazenou pro virtuální soubory. - + size velikost - + permission oprávnění - + file id identif. souboru - + Server reported no %1 Server nahlášen číslo %1 - + Cannot sync due to invalid modification time Není možné provést synchronizaci z důvodu neplatného času změny - + Error while deleting file record %1 from the database Chyba při mazání záznamu o souboru %1 z databáze - + Conflict when uploading a folder. It's going to get cleared! Konflikt při nahrávání složky. Bude vymazána! - + Conflict when uploading a file. It's going to get removed! Konflikt při nahrávání souboru. Bude odebrán! - + Ignored because of the "choose what to sync" blacklist Ignorováno podle nastavení „vybrat co synchronizovat“ - + Not allowed because you don't have permission to add subfolders to that folder Neumožněno, protože nemáte oprávnění přidávat podsložky do této složky - + Not allowed because you don't have permission to add files in that folder Neumožněno, protože nemáte oprávnění přidávat soubory do této složky - + Not allowed to upload this file because it is read-only on the server, restoring Není možné tento soubor nahrát, protože je na serveru povoleno pouze čtení – obnovuje se - + Moved to invalid target, restoring Přesunuto do neplatného cíle – obnovuje se - + Not allowed to remove, restoring Odstranění není umožněno – obnovuje se - + Error while reading the database Chyba při čtení databáze - + Server replied with an error while reading directory "%1" : %2 Server vrátil chybu při čtení adresáře „%1“: %2 @@ -3427,22 +3676,22 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::PropagateDirectory - + could not delete file %1 from local DB nepodařilo se smazat soubor %1 lokální databáze - + Error updating metadata due to invalid modification time Chyba při aktualizaci metadat z důvodu neplatného času změny - + Error updating metadata: %1 Chyba při aktualizování metadat: %1 - + File is currently in use Soubor je v tuto chvíli používán jinou aplikací @@ -3455,19 +3704,19 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros nepodařilo se získat soubor %1 z lokální databáze - + File %1 cannot be downloaded because encryption information is missing. Soubor %1 není možné stáhnout z důvodu chybějících informací o Å¡ifrování - - + + File has changed since discovery Soubor se mezitím změnil - + Could not delete file record %1 from local DB Nepodařilo se smazat záznam o souboru %1 z lokální databáze @@ -3478,32 +3727,32 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému! - + File %1 can not be downloaded because of a local file name clash! Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému! - + The download would reduce free local disk space below the limit Stahování by snížilo volné místo na místním disku pod nastavený limit - + Free space on disk is less than %1 Volného místa na úložiÅ¡ti je méně než %1 - + File was deleted from server Soubor byl smazán ze serveru - + The file could not be downloaded completely. Soubor nemohl být kompletně stažen. - + The downloaded file is empty, but the server said it should have been %1. Stažený soubor je prázdný, ale server sdělil, že měl mít %1. @@ -3513,18 +3762,23 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Soubor %1 nemohl být uložen z důvodu kolize názvu s místním souborem! - - + + File %1 has invalid modified time reported by server. Do not save it. Soubor %1 nemá platný čas změny, hlášený na server. Neukládat ho. - + + File %1 downloaded but it resulted in a local file name clash! + Soubor %1 stažen, ale mělo za následek kolizi stejných názvů lišících se jen velikostí písmen se souborem na stroji! + + + Error updating metadata: %1 Chyba při aktualizování metadat: %1 - + The file %1 is currently in use Soubor %1 je v tuto chvíli používán jinou aplikací @@ -3545,7 +3799,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 smazání souboru %1 se nezdařilo, chyba: %2 @@ -3556,16 +3810,21 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros + Folder %1 cannot be created because of a local file or folder name clash! + Složku %1 není možné vytvořit kvůli kolizi stejných názvů lišících se jen velikostí písmen se souborem či složkou na stroji! + + + Could not create folder %1 Nepodařilo se vytvořit složku %1 - + Error updating metadata: %1 Chyba při aktualizování metadat: %1 - + The file %1 is currently in use Soubor %1 je v tuto chvíli používán jinou aplikací @@ -3573,7 +3832,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Nelze odstranit %1 z důvodu kolize názvu s místním souborem @@ -3586,46 +3845,51 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Soubor %1 nemohl být přejmenován na %2 z důvodu kolize názvu s místním souborem - - - + + File %1 downloaded but it resulted in a local file name clash! + Soubor %1 stažen, ale mělo za následek kolizi stejných názvů lišících se jen velikostí písmen se souborem na stroji! + + + + + could not get file %1 from local DB nepodařilo se získat soubor %1 z lokální databáze - + Error setting pin state Chyba při nastavování stavu pin - - + + Error updating metadata: %1 Chyba při aktualizování metadat: %1 - + The file %1 is currently in use Soubor %1 je v tuto chvíli používán jinou aplikací - - + + Could not delete file record %1 from local DB Nepodařilo se smazat záznam ohledně souboru %1 z lokální databáze - + Failed to propagate directory rename in hierarchy Nepodařilo se zpropagovat přejmenování složky v hierarchii - + Failed to rename file Nepodařilo se přejmenovat soubor @@ -3646,7 +3910,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Serverem vrácen neplatný HTTP kód. Očekáván 204, ale obdržen „%1 %2“. @@ -3659,12 +3923,12 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Serverem vrácen neplatný HTTP kód. Očekáván 201, ale obdržen „%1 %2“. - + Error writing metadata to the database: %1 Chyba zápisu metadat do databáze: %1 - + The file %1 is currently in use Soubor %1 je v tuto chvíli používán jinou aplikací @@ -3672,42 +3936,42 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 %1 není možné přejmenovat na %2, chyba: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Serverem vrácen neplatný HTTP kód. Očekáván 201, ale obdržen „%1 %2“. - + could not get file %1 from local DB nepodařilo se získat soubor %1 z místní databáze - + Could not delete file record %1 from local DB Nepodařilo se smazat záznam o souboru %1 z místní databáze - + Error updating metadata: %1 Chyba při aktualizování metadat: %1 - + The file %1 is currently in use Soubor %1 je v tuto chvíli používán jinou aplikací - + Error setting pin state Chyba při nastavování stavu pin - + Error writing metadata to the database Chyba zápisu metadat do databáze @@ -3897,7 +4161,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::ServerNotificationHandler - + Reply Odpovědět @@ -3915,23 +4179,23 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Nastavení - + %1 Settings This name refers to the application name e.g Nextcloud Nastavení %1 - + General Obecné - + Network Síť - + Account Účet @@ -3939,17 +4203,22 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::ShareModel - + Share link Odkaz na sdílení - + Link share Odkázat na sdílení - + + Internal link + Interní odkaz + + + Enter a note for the recipient Zadejte poznámku pro příjemce @@ -4025,7 +4294,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,171 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::SocketApi - + + Failed to encrypt folder at "%1" + Nepodařilo se zaÅ¡ifrovat složku na „%1“ + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + Tento účet %1 nemá nastavené Å¡ifrování mezi koncovými body. Pokud chcete zapnout Å¡ifrování složek, nastavte toto v nastavení svého účtu. + + + + Failed to encrypt folder + Složku se nepodařilo zaÅ¡ifrovat + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Nepodařilo se zaÅ¡ifrovat následující složky: „%1“. + +Server odpověděl chybou: %2 + + + + Folder encrypted successfully + Složka úspěšně zaÅ¡ifrována + + + + The following folder was encrypted successfully: "%1" + Následující složka byla úspěšně zaÅ¡ifrována: „%1“ + + + Context menu share Sdílení kontextové nabídky - + Select new location … Vyberte nové umístění… - + I shared something with you Něco jsem vám nasdílel(a) - - + + Share options Možnosti sdílení - - + + Activity Aktivita - + Copy private link to clipboard Zkopírovat soukromý odkaz do schránky - + Send private link by email … Poslat soukromý odkaz e-mailem… + + + Expire in %1 minutes + remaining time before lock expire + Platnost skončí za %1 minutuPlatnost skončí za %1 minutyPlatnost skončí za %1 minutPlatnost skončí za %1 minuty + - + Leave this share Opustit toto sdílení - + Resharing this file is not allowed Příjemcům sdílení tohoto souboru není dovoleno ho sdílet dále dalším - + Resharing this folder is not allowed Sdílení této složky dál dalším není umožněno - - + + Copy public link Zkopírovat veřejný odkaz - + Copy internal link Zkopírovat interní odkaz - + + Encrypt + ZaÅ¡ifrovat + + + Lock file Zamknout soubor - + Unlock file Odemknout soubor - + Locked by %1 Uzamkl(a) %1 - - Expire in %1 minutes - remaining time before lock expire - Platnost skončí za %1 minutuPlatnost skončí za %1 minutyPlatnost skončí za %1 minutPlatnost skončí za %1 minuty - - - + Expires in %1 minutes remaining time before lock expires Platnost skončí za %1 minutuPlatnost skončí za %1 minutyPlatnost skončí za %1 minutPlatnost skončí za %1 minuty - + Edit Upravit - + Open in browser Otevřít v prohlížeči - + Resolve conflict … VyřeÅ¡it konflikt… - + Move and rename … Přesunout a přejmenovat… - + Move, rename and upload … Přesunout, přejmenovat a nahrát… - + Delete local changes Smazat místní změny - + Move and upload … Přesunout a nahrát… - + Delete Smazat @@ -4377,63 +4685,63 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (přeskočeno kvůli předchozí chybě, další pokus za %2) - + Could not update file: %1 Nedaří se aktualizovat soubor: %1 - + Could not update virtual file metadata: %1 Nedaří se aktualizovat metadata virtuálního souboru: %1 - + Could not update file metadata: %1 Nedaří se aktualizovat metadata souboru: %1 - + Could not set file record to local DB: %1 Nepodařilo se nastavit záznam ohledně souboru na lokální databázi: %1 - + Unresolved conflict. NevyřeÅ¡ený konflikt. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Je dostupných pouze %1, pro spuÅ¡tění je potřeba alespoň %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Nedaří se otevřít nebo vytvořit místní synchronizační databázi. Ověřte, že máte přístup k zápisu do synchronizační složky. - + Using virtual files with suffix, but suffix is not set Používají se virtuální soubory s příponou, ale přípona není nastavena - + Unable to read the blacklist from the local database Nedaří se z místní databáze načíst seznam vyloučených - + Unable to read from the sync journal. Nedaří se číst ze žurnálu synchronizace. - + Cannot open the sync journal Nedaří se otevřít synchronizační žurnál @@ -4443,12 +4751,12 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros V synchronizaci bude zakrátko navázáno. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Na disku dochází místo: Stahování které by zmenÅ¡ilo volné místo pod %1 bude přeskočeno. - + There is insufficient space available on the server for some uploads. Na serveru není pro některé z nahrávaných souborů dostatek místa. @@ -4517,59 +4825,59 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::Systray - + Download Stáhnout - + Add account Přidat účet - + Open main dialog Otevřít hlavní dialog - - + + Pause sync Pozastavit synchronizaci - - + + Resume sync Pokračovat v synchronizaci - + Settings Nastavení - + Help Nápověda - + Exit %1 Ukončit %1 - + Pause sync for all Pozastavit synchronizaci u vÅ¡eho - + Resume sync for all Pokračovat v synchronizaci u vÅ¡eho - + %1: %2 %1: %2 @@ -4577,24 +4885,24 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 klient pro počítač</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Verze %1. Další informace získáte kliknutím <a href='%2'>sem</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Používá zásuvný modul pro virtuální soubory: %1</small></p> - + <p>This release was supplied by %1</p> <p>Toto vydání bylo poskytnuto %1</p> @@ -4602,22 +4910,22 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Nepodařilo se získat seznam poskytovatelů. - + Failed to fetch search providers for '%1'. Error: %2 Nepodařilo se získat z poskytovatelů vyhledávání pro „%1“: Chyba: %2 - + Search has failed for '%2'. Hledání „%2“ se nezdařilo. - + Search has failed for '%1'. Error: %2 Hledání „%1“ se nezdařilo: chyba: %2 @@ -4625,30 +4933,36 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::User - + Retry all uploads Znovu spustit vÅ¡echna nahrávání + + + + Resolve conflict + VyřeÅ¡it konflikt + OCC::UserModel - + Confirm Account Removal Potvrďte odebrání účtu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Opravdu chcete odebrat propojení s účtem <i>%1</i>?</p><p><b>Pozn.:</b> Toto <b>nesmaže</b> žádné soubory.</p> - + Remove connection Odebrat spojení - + Cancel Storno @@ -4786,8 +5100,8 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Chyba při aktualizaci metadat z důvodu neplatného času změny @@ -4795,8 +5109,8 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Chyba při aktualizaci metadat z důvodu neplatného času změny @@ -4894,123 +5208,123 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros OCC::ownCloudGui - + Unsupported Server Version Nepodporovaná verze serveru - + 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. Server na účtu %1 používá nepodporovanou verzi %2. Používání tohoto klienta s nepodporovanými verzemi serveru není otestováno a může být nebezpečné. Pokračujte jen na vlastní nebezpečí. - + Disconnected Odpojeno - + Disconnected from some accounts Odpojeno od některých účtů - + Disconnected from %1 Odpojeno od %1 - + Disconnected from accounts: Odpojeno od účtů: - + Account %1: %2 Účet %1: %2 - + Please sign in Přihlaste se - + Signed out Odhlášeno - + Account synchronization is disabled Synchronizace účtu je vypnuta - - + + Synchronization is paused Synchronizace je pozastavena - + Folder %1: %2 Složka %1: %2 - + Unresolved conflicts NevyřeÅ¡ené konflikty - + Up to date Aktuální - + Error during synchronization Chyba při synchronizaci - + There are no sync folders configured. Nejsou nastavené žádné složky pro synchronizaci. - + No sync folders configured Nejsou nastavené žádné složky pro synchronizaci - + Checking for changes in remote "%1" Zjišťují se změny ve vzdáleném „%1“ - + Checking for changes in local "%1" Zjišťují se změny v místním „%1“ - + Syncing %1 of %2 (%3 left) Synchronizuje se %1 z %2 (zbývá %3) - + Syncing %1 of %2 Synchronizuje se %1 z %2 - + Syncing %1 (%2 left) Synchronizuje se %1 (zbývá %2) - + Syncing %1 Synchronizuje se %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5476,27 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Nová složka - + You renamed %1 Přejmenovali jste %1 - + You deleted %1 Smazali jste %1 - + You created %1 Vytvořili jste %1 - + You changed %1 Změnili jste %1 - + Synced %1 Synchronizováno %1 @@ -5248,30 +5562,106 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Označit jako přečtené + + ShareDelegate + + + Create a new share link + Vytvořit nový odkaz pro sdílení + + + + Copy share link location + Zkopírovat umístění odkazu pro sdílení + + + + Share options + Předvolby pro sdílení + + + + ShareDetailsPage + + + An error occurred setting the share password. + DoÅ¡lo k chybě při nastavování hesla ke sdílení. + + + + Edit share + Upravit sdílení + + + + Dismiss + Zahodit + + + + Share label + Å títek sdílení + + + + Allow editing + Povolit upravování + + + + Password protect + Chránit heslem + + + + Set expiration date + Nastavit datum skončení platnosti + + + + Note to recipient + Poznámka pro příjemce + + + + Unshare + Přestat sdílet + + + + Add another link + Přidat další odkaz + + + + Copy share link + Zkopírovat odkaz na sdílení + + ShareView - + Password required for new share Pro nové sdílení je zapotřebí hesla - + Share password Heslo ke sdílení - + Sharing is disabled Sdílení je vypnuto - + This item cannot be shared. Tuto položku nelze nasdílet. - + Sharing is disabled. Sdílení je vypnuto. @@ -5287,7 +5677,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros SyncJournalDb - + Failed to connect database. Nepodařilo se připojit k databázi. @@ -5345,6 +5735,22 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Načíst další výsledky + + UnifiedSearchResultNothingFound + + + No results for + Žádné výsledky pro + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Sekce %1 výsledků vyhledání + + UserLine @@ -5408,67 +5814,67 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros UserStatusSelector - + Online status Stav online - + Online Online - + Away Pryč - + Do not disturb NeruÅ¡it - + Mute all notifications Ztlumit veÅ¡kerá upozornění - + Invisible Není vidět - + Appear offline Jevit se offline - + Status message Stavová zpráva - + What is your status? Jaký je váš stav? - + Clear status message after Vyčistit stavovou zprávu po uplynutí - + Cancel Storno - + Clear status message Vyčistit stavovou zprávu - + Set status message Nastavit stavovou zprávu @@ -5552,24 +5958,24 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Window - + Nextcloud desktop main dialog Hlavní dialog Nextcloud desktop - + Current account Stávající účet - - + + Resume sync for all Pokračovat v synchronizaci u vÅ¡eho - - + + Pause sync for all Pozastavit synchronizaci u vÅ¡eho @@ -5579,22 +5985,22 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Nastavit stav uživatele - + Add account Přidat účet - + Add new account Přidat nový účet - + Settings Nastavení - + Exit Konec @@ -5603,11 +6009,6 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Current user avatar Zástupný obrázek stávajícího uživatele - - - Current account avatar - Stávající zástupný obrázek uživatele - Current user status is online @@ -5619,70 +6020,75 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros Stávající stav uživatele je neruÅ¡it - + + Current account avatar + Stávající zástupný obrázek uživatele + + + Current account status is online Stávající stav účtu je online - + Current account status is do not disturb Stávající stav účtu je neruÅ¡it - + + %1 - File activity + %1 – aktivita ohledně souboru + + + Account switcher and settings menu Přepínání účtů a nabídka nastavení - + Open local folder of current account Otevřít místní složku stávajícího účtu - + Connected Připojeno - + Disconnected Odpojeno - + Open Nextcloud Talk in browser Otevřít Nextcloud Talk v prohlížeči - + More apps Více aplikací - + Open %1 in browser Otevřít %1 v prohlížeči - + Unified search results list Seznam výsledků sjednoceného vyhledávání - - - %1 - File activity - %1 – aktivita ohledně souboru - main.cpp - + System Tray not available Není k dispozici oznamovací oblast systémového panelu - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 vyžaduje fungující oznamovací oblast systémového panelu. Pokud používáte XFCE, řiďte se <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">těmito pokyny</a>. V ostatních případech nainstalujte do svého systému aplikaci pro oznamovací oblast syst. panelu, např. „trayer“, a zkuste to znovu. @@ -5690,7 +6096,7 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Sestaveno z Git revize <a href="%1">%2</a> na %3, %4 s použitím Qt %5, %6</small></p> @@ -5724,72 +6130,77 @@ Toto je nový, experimentální režim. Pokud se jej rozhodnete používat, pros + Server version downloaded, copied changed local file into case conflict conflict file + Stažena verze ze serveru, změněný místní soubor zkopírován do konfliktního souboru kolize stejných názvů lišících se jen velikostí písmen + + + Deleted Smazáno - + Moved to %1 Přesunuto do %1 - + Ignored Ignorováno - + Filesystem access error Chyba přístupu k souborovému systému - + Error Chyba - + Updated local metadata Místní metadata aktualizována - + Unknown Neznámý - + downloading stahování - + uploading odesílání - + deleting mazání - + moving přesouvání - + ignoring ignoruje se - + error chyba - + updating local metadata aktualizují se místní metadata diff --git a/translations/client_da.ts b/translations/client_da.ts index 6b43eae8c..494d79339 100644 --- a/translations/client_da.ts +++ b/translations/client_da.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Åbn %1 lokalt - + In %1 I %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Vis flere handlinger @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Afvis + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Aktivitetsliste @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Flytning af filer til skraldespanden er ikke implementeret pÃ¥ denne platform - + Error removing "%1": %2 Fejl ved fjernelse af "%1": %2 - + Could not remove folder "%1" Kunne ikke fjerne mappen "%1" @@ -321,7 +331,7 @@ Forkert HTTP-kode blev returneret af serveren. Forventede 204, men modtog "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Det lykkedes ikke at lÃ¥se den krypterede mappe op %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Annuller @@ -400,12 +410,12 @@ Du ser ud til at have funktionen Virtual Files aktiveret i denne mappe. I øjeblikket er det ikke muligt implicit at downloade virtuelle filer, der er End-to-End-krypteret. For at fÃ¥ den bedste oplevelse med virtuelle filer og ende-til-ende-kryptering skal du sørge for, at den krypterede mappe er markeret med "Gør altid tilgængelig lokalt". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Krypter ikke mappe - + Do not encrypt folder - + Encrypt folder Krypter mappe - + No account configured. Ingen konto konfigureret. - - Display mnemonic - Vis huskeregel + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Vis huskeregel @@ -445,18 +455,23 @@ SlÃ¥ kryptering til - + + End-to-end encryption has been enabled for this account + + + + Warning Advarsel - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Du kan ikke kryptere en mappe med indhold, venligst fjern filerne. @@ -469,121 +484,121 @@ Vent pÃ¥ en ny synkronisering, og krypter herefter mappen. - + Encryption failed Kryptering fejlede - + Could not encrypt folder because the folder does not exist anymore Kunne ikke kryptere mappen da den ikke længere eksisterer - - + + Open folder Åbn mappe - + Encrypt Krypter - - + + Edit Ignored Files Rediger ignorerede filer - - + + Create new folder Opret ny mappe - - + + Availability Tilgængelighed - + Choose what to sync Vælg hvad der skal synkroniseres - + Force sync now Gennemtving synkronisering nu - + Restart sync Genstart synkronisering - + Resume sync Genoptag synkronisering - + Pause sync Sæt synk. pÃ¥ pause - + Remove folder sync connection Fjern mappesynkroniseringsforbindelse - + Disable virtual file support … Deaktiver virtuel fil-support … - + Enable virtual file support %1 … Aktiver virtuel fil-support %1 … - + (experimental) (eksperimentel) - + Folder creation failed Fejl ved oprettelse af mappe - + <p>Could not create local folder <i>%1</i>.</p> <p>Kunne ikke oprette lokal mappe <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Bekræft Fjern mappesynkroniseringsforbindelse - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ønsker du virkelig at stoppe synkronisering af mappen <i>%1</i>?</p><p><b>Note:</b>Dette sletter <b>ikke</b>nogen filer.</p> - + Remove Folder Sync Connection Fjern mappesynkroniseringsforbindelse - + Disable virtual file support? Deaktiver virtuel fil-support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Den eneste fordel ved at deaktivere understøttelse af virtuelle filer er, at fu Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. - + Disable support Deaktiver understøttelse @@ -606,144 +621,176 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Synkronisering i gang - + The syncing operation is running.<br/>Do you want to terminate it? Synkroniseringen er i gang.<br/>Ønsker du at afslutte den? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) af %2 i brug. Nogle mapper, inklusiv netværksdiske eller delte mapper, har muligvis andre begrænsninger. - + %1 of %2 in use %1 af %2 er i brug - + Currently there is no storage usage information available. Der er i øjeblikket ingen informationer om brug af lager tilgængelig. - + %1 in use %1 i brug - + %1 as %2 %1 som %2 - + The server version %1 is unsupported! Proceed at your own risk. Serverversion %1 er ikke supporteret! Fortsæt pÃ¥ egen risiko. - + Connected to %1. Forbundet til %1. - + Server %1 is temporarily unavailable. Serveren %1 er midlertidig utilgængelig. - + Server %1 is currently in maintenance mode. Serveren %1 er i vedligeholdelsestilstand. - + Signed out from %1. Logget ud fra %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Indhenter bemyndigelse fra browseren. <a href='%1'>Klik her</a> for at genÃ¥bne browseren. - + Connecting to %1 … Forbinder til %1 … - + No connection to %1 at %2. Ingen forbindelse til %1 hos %2. - + Server configuration error: %1 at %2. Serverkonfigurationsfejl: %1 pÃ¥ %2. - + No %1 connection configured. Ingen %1 forbindelse konfigureret. - + There are folders that were not synchronized because they are too big: Der er mapper som ikke blev synkroniseret fordi de er for store: - + There are folders that were not synchronized because they are external storages: Der er mapper som ikke blev synkroniseret fordi de er eksterne lagre: - + There are folders that were not synchronized because they are too big or external storages: Der er mapper som ikke blev synkroniseret fordi de er for store eller eksterne lagre: - + Confirm Account Removal Bekræft sletning af konto - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ønsker du virkelig at fjerne forbindelse til kontoen <i>%1</i>?</p><p><b>Note:</b>Dette sletter <b>ikke</b>nogen filer.</p> - + Remove connection Fjern forbindelse - - + This account supports end-to-end encryption Denne konto understøtter end-to-end kryptering - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. OCC::ActivityListModel - + For more activities please open the Activity app. For flere aktiviteter Ã¥bn Activity app'n. @@ -808,12 +855,12 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Filer fra ignorerlisten sÃ¥vel som symbolske links synkroniseres ikke. @@ -864,32 +911,59 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. OCC::Application - + Continuing will mean <b>deleting these settings</b>. At fortsætte vil betyde at <b>disse indstillinger slettes</b>. - + Continuing will mean <b>ignoring these settings</b>. At fortsætte vil betyde at <b>disse indstillinger ignoreres</b>. - + 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>. Nogle indstillinger blev konfigureret i en nyere version af denne klient og anvender funktionaliteter der ikke er tilgængelig i denne version.<br><br>%1<br><br>Den nuværende konfigurationsfil er blevet sikkerhedskopieret til <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Afslut - + Continue Fortsæt - + Error accessing the configuration file Adgang til konfigurationsfilen fejlede @@ -899,12 +973,12 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer.Der opstod en fejl, kunne ikke tilgÃ¥ konfigurations filen %1. Sørg for at filen kan tilgÃ¥s af din bruger. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Afslut %1 @@ -950,56 +1024,216 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 Netværks fejl: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Fejl ved skrivning af metadata til databasen @@ -1017,12 +1251,12 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer.Venligst indtast din end-to-end krypterings kode:<br><br>Bruger: %2<br>Konto: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Indtast E2E kodeord @@ -1196,8 +1430,8 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1205,27 +1439,27 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 Fejl ved læsning af mappen %1 @@ -1233,83 +1467,83 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1317,7 +1551,7 @@ Denne handling vil annullere alle i øjeblikket kørende synkroniseringer. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Kunne ikke generere metadata for kryptering, lÃ¥ser mappen op igen. @@ -1447,145 +1681,145 @@ Dette kan være et problem med dine OpenSSL biblioteker. OCC::Folder - + Local folder %1 does not exist. Lokal mappe %1 findes ikke. - + %1 should be a folder but is not. %1 burde være en mappe men er det ikke. - + %1 is not readable. %1 kan ikke læses. - + %1 and %n other file(s) have been removed. %1 og %n andre filer er blevet fjernet.%1 og %n andre filer er blevet fjernet. - + %1 has been removed. %1 names a file. %1 er fjernet. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. %1 er blevet tilføjet. - + %1 and %n other file(s) have been updated. %1 og %n anden fil er blevet opdateret.%1 og %n andre filer er blevet opdateret. - + %1 has been updated. %1 names a file. %1 er blevet opdateret. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 er blevet omdømt til %2 og %n anden fil er blevet omdømt.%1 er blevet omdømt til %2 og %n andre filer er blevet omdømt. - + %1 has been renamed to %2. %1 and %2 name files. %1 er blevet omdøbt til %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 er blevet flyttet til %2 og %n anden fil er blevet flyttet.%1 er blevet flyttet til %2 og %n andre filer er blevet flyttet. - + %1 has been moved to %2. %1 er blevet flyttet til %2. - + %1 has and %n other file(s) have sync conflicts. %1 og %n anden fil har synkroniserings konflikter.%1 og %n andre filer har synkroniserings konflikter. - + %1 has a sync conflict. Please check the conflict file! %1 har synkroniserings konflikt. Venligst check den konflikterende fil!. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 og %n anden fil kunne ikke synkroniseres pÃ¥ grund af fejl. Se i loggen efter detaljer.%1 og %n andre filer kunne ikke synkroniseres pÃ¥ grund af fejl. Se i loggen efter detaljer. - + %1 could not be synced due to an error. See the log for details. %1 kunne ikke synkroniseres pÃ¥ grund af fejl. Se i loggen efter detaljer. - + %1 and %n other file(s) are currently locked. %1 og %n anden fil er lÃ¥st.%1 og %n andre filer er lÃ¥st. - + %1 is currently locked. %1 er lÃ¥st - + Sync Activity Synkroniseringsaktivitet - + Could not read system exclude file Kunne ikke læse systemets udelukkelsesfil - + A new folder larger than %1 MB has been added: %2. En ny mappe med mere end %1M er blevet tilføjet : %2. - + A folder from an external storage has been added. En mappe er blevet tilføjet fra eksternt lager. - + Please go in the settings to select it if you wish to download it. GÃ¥ venligst til indstillinger for at vælge om du vil hente den. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Mappen %1 er oprettet men tidligere udelukket fra synkronisering. Data i mappen vil ikke blive synkroniseret. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Filen %1 er oprettet men tidligere udelukket fra synkronisering. Den vil ikke blive synkroniseret. - + 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). @@ -1598,7 +1832,7 @@ Dette betyder at synkroniseringsklienten muligvis ikke sender lokale ændringer %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1606,24 +1840,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Fjern alle filer? - + Remove all files Fjern alle filer - + Keep files Behold filer @@ -1659,22 +1893,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Kunne ikke nulstille oprette mappetilstand - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1684,27 +1918,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Udefineret tilstand. - + Undefined state. - + Waiting to start syncing. Venter pÃ¥ at begynde synkronisering - + Preparing for sync. Forbereder synkronisering. - + Sync is running. Synkronisering er i gang. - + Sync finished with unresolved conflicts. @@ -1724,62 +1958,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Bruger Afbrydelse. - + Last sync was successful. - + Setup error. Fejl under opsætning. - + Sync request was cancelled. - + Sync is paused. Synkronisering er pauset. - + %1 (Sync is paused) %1 (Sync er sat pÃ¥ pause) - + No valid folder selected! Ingen gyldig mappe valgt! - + The selected path does not exist! - + The selected path is not a folder! Den valgte sti er ikke en mappe! - + You have no permission to write to the selected folder! Du har ikke tilladelse til at skrive til denne mappe. - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Den lokale mappe %1 indeholder allerede en mappe opsat som sync forbindelse. Vælg venligst en anden! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Den lokale mappe %1 er allerede indeholdt i en mappe opsat som sync forbindelse. Vælg venligst en anden! - + There is already a sync from the server to this local folder. Please pick another local folder! Der er allerede sync fra serveren til denne lokale mappe. Vælg venligst en anden mappe! @@ -1792,7 +2026,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Opret mappesynkroniseringsforbindelse - + File Fil @@ -1800,152 +2034,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Du skal være forbundet for at tilføje en mappe - + Click this button to add a folder to synchronize. Klik denne knap for at tilføje en mappe at synkronisere. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Fejl under indlæsning af listen af mapper fra serveren. - + Fetching folder list from server … Henter mappelisten fra server … - + There are unresolved conflicts. Click for details. Der er uløste konflikter. Klik for flere detaljer. - + Virtual file support is enabled. - + Signed out Logget ud - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder Synkroniserer med lokal mappe - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Forener ændringer - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synkroniserer %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) hent %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) send %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 af %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 tilbage, %1 af %2, fil %3 af %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 af %2, fil %3 af %4 - + file %1 of %2 fil %1 af %2 - + Waiting … Venter … - + Waiting for %n other folder(s) … Venter pÃ¥ %n anden folder …Venter pÃ¥ %n andre mapper … - + Preparing to sync … Forbereder synkronisering … @@ -2176,13 +2414,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2234,59 +2472,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Server notifikationer der kræver opmærksomhed. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel Annullér - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2294,22 +2532,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Password til deling pÃ¥krævet - + Please enter a password for your link share: Indtast venligst et kodeord til denne linkdeling - + Sharing error Delefejl - + Could not retrieve or create the public link share. Error: %1 @@ -2547,6 +2785,11 @@ Elementer hvor sletning er tilladt vil blive slettet hvis de hindre en folder fr Close Luk + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2879,60 +3122,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Lokal Sync mappe - - + + (%1) (%1) - + There isn't enough free space in the local folder! Der er ikke nok ledig plads i den lokale mappe! @@ -3004,7 +3247,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3036,144 +3280,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Forbundet til %1: %2 version %3 (%4) med succes</font><br/><br/> - + Invalid URL Ugyldig URL - + Failed to connect to %1 at %2:<br/>%3 Fejl ved forbindelse til %1 hos %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Timeout ved forsøg pÃ¥ forbindelse til %1 hos %2. - + Trying to connect to %1 at %2 … Prøver at forbinde til %1 hos %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Adgang forbudt fra serveren. For at kontrollere din adgang, <a href="%1">Klik her</a> for tilgang til servicen fra din browser. - + There was an invalid response to an authenticated WebDAV request Modtog ugyldigt svar pÃ¥ autentificeret WebDAV forespørgsel - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Lokal sync mappe %1 findes allerede. Forbinder til synkronisering.<br/><br/> - + Creating local sync folder %1 … Opretter lokal sync mappe %1 … - + OK - + failed. mislykkedes. - + Could not create local folder %1 Kunne ikke oprette lokal mappe %1 - + No remote folder specified! Ingen afsides mappe angivet! - + Error: %1 Fejl: %1 - + creating folder on Nextcloud: %1 opretter mappe hos Nextcloud: %1 - + Remote folder %1 created successfully. Afsides mappe %1 oprettet med succes. - + The remote folder %1 already exists. Connecting it for syncing. Den afsides mappe %1 findes allerede. Forbinder til den for synkronisering. - - + + The folder creation resulted in HTTP error code %1 Mappeoprettelsen resulterede i HTTP fejlkode %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Oprettelse af den afsides mappe fejlede da brugeroplysningerne er forkerte!<br/>GÃ¥ venligst tilbage og kontroller dine brugeroplysninger.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Afsides mappe oprettelse fejlede sansynligvis pÃ¥ grund af forkert angivne brugeroplysninger.</font><br/>GÃ¥ venligst tilbage og kontroller dine brugeroplysninger.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Oprettelse af afsides mappe %1 fejlet med fejl <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. En sync forbindelse fra %1 til afsides mappe %2 blev oprettet. - + Successfully connected to %1! Forbundet til %1 med succes! - + Connection to %1 could not be established. Please check again. Forbindelse til %1 kunne ikke etableres. Kontroller venligst igen. - + Folder rename failed Fejl ved omdøbning af mappe - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Lokal sync mappe %1 oprette med succes!</b></font> @@ -3196,12 +3440,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3212,12 +3456,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3246,162 +3490,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3409,22 +3658,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3437,19 +3686,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Fil er ændret siden opdagelse - + Could not delete file record %1 from local DB @@ -3460,32 +3709,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Fil %1 kan ikke hentes pÃ¥ grund af lokal navnekonflikt! - + The download would reduce free local disk space below the limit Nedlagringen ville reducere ledig disk plads pÃ¥ lokalt lager under grænsen - + Free space on disk is less than %1 Ledig disk plads er under %1 - + File was deleted from server Fil var slettet fra server - + The file could not be downloaded completely. Filen kunne ikke hentes helt. - + The downloaded file is empty, but the server said it should have been %1. @@ -3495,18 +3744,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Fil %1 kan ikke gemmes pÃ¥ grund af lokal navnekonflikt! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3527,7 +3781,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 kunne ikke slette fil %1, fejl: %2 @@ -3538,16 +3792,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3555,7 +3814,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Kunne ikke fjerne %1 pÃ¥ grund af lokal filnavnskonflikt @@ -3568,46 +3827,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3628,7 +3892,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3641,12 +3905,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Forkert HTTP kode returneret fra server. Forventet 201, men modtog "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3654,42 +3918,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Forkert HTTP kode returneret fra server. Forventet 201, men modtog "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Fejl ved skrivning af metadata til databasen @@ -3879,7 +4143,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3897,23 +4161,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Indstillinger - + %1 Settings This name refers to the application name e.g Nextcloud - + General Generelt - + Network Netværk - + Account Konto @@ -3921,17 +4185,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4007,7 +4276,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4016,132 +4285,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Deling af kontekst menu - + Select new location … - + I shared something with you Jeg delte noget med dig - - + + Share options Dele muligheder - - + + Activity - + Copy private link to clipboard Kopier privat link til udklipsholderen - + Send private link by email … Send privat link via e-mail … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Videredeling af denne fil ikke tilladt - + Resharing this folder is not allowed - - + + Copy public link Kopier offentligt link - + Copy internal link Kopier internt link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Rediger - + Open in browser Åbn i browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Slet @@ -4359,63 +4665,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (droppet pÃ¥ grund af tidligere fejl, prøver igen om %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Uafgjort konflikt. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Kun %1 til rÃ¥dighed, behøver mindst %2 for at starte - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Ikke i stand til at oprette en lokal sync database. Verificer at du har skriveadgang til sync mappen. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Kunne ikke læse blacklist fra den lokale database - + Unable to read from the sync journal. Kunne ikke læse fra synkroniserings loggen. - + Cannot open the sync journal Kunne ikke Ã¥bne synkroniserings loggen @@ -4425,12 +4731,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Diskplads begrænset: Downloads der bringer ledig plads under %1 ignoreres. - + There is insufficient space available on the server for some uploads. Der er utilstrækkelig plads pÃ¥ serveren til visse uploads. @@ -4499,59 +4805,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Tilføj konto - + Open main dialog Åben hoved dialog - - + + Pause sync - - + + Resume sync - + Settings Indstillinger - + Help - + Exit %1 Afslut %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4559,24 +4865,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1-skrivebordsklient</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Version %1. For mere information venligst klik <a href='%2'>her</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Denne udgivelse blev leveret af %1</p> @@ -4584,22 +4890,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4607,30 +4913,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Prøv alle uploads igen + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Bekræft sletning af konto - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ønsker du virkelig at fjerne forbindelse til kontoen <i>%1</i>?</p><p><b>Note:</b>Dette sletter <b>ikke</b>nogen filer.</p> - + Remove connection Fjern forbindelse - + Cancel Annullér @@ -4768,8 +5080,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4777,8 +5089,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4876,123 +5188,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Serverversion uden support - + 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. Serveren for konto %1 kører den ikke-supporterede version %2. Brug af denne klient med en serverversion, der ikke har support er ikke testet og kan muligvis føre til alvorlige problemer. Fortsæt pÃ¥ egen risiko. - + Disconnected Frakoblet - + Disconnected from some accounts Frakoblet fra nogle konti - + Disconnected from %1 Frakoblet fra %1 - + Disconnected from accounts: Frakoblet fra konti: - + Account %1: %2 Konto %1: %2 - + Please sign in Log venligst ind - + Signed out Logget ud - + Account synchronization is disabled Kontosynkronisering er deaktiveret - - + + Synchronization is paused Synkronisering er suspenderet - + Folder %1: %2 Mappe %1: %2 - + Unresolved conflicts Uafgjorte konflikter - + Up to date Opdateret - + Error during synchronization Fejl under synkronisering - + There are no sync folders configured. Ingen synk.-mapper konfigureret. - + No sync folders configured Ingen synk.-mapper konfigureret - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Synkroniserer %1 af %2 (%3 tilbage) - + Syncing %1 of %2 Synkroniserer %1 af %2 - + Syncing %1 (%2 left) Synkroniserer %1 (%2 tilbage) - + Syncing %1 Synkroniserer %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5144,27 +5456,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ny mappe - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5230,30 +5542,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5269,7 +5657,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5327,6 +5715,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5390,67 +5794,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5534,24 +5938,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Hovedvindue for Nextcloud-skrivebordsklienten - + Current account Nuværende konto - - + + Resume sync for all Genoptag synkronisering for alle - - + + Pause sync for all Sæt alle synk. pÃ¥ pause @@ -5561,22 +5965,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Tilføj konto - + Add new account Tilføj ny konto - + Settings Indstillinger - + Exit Afslut @@ -5585,11 +5989,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Nuværende bruger-avater - - - Current account avatar - - Current user status is online @@ -5601,70 +6000,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Nuværende brugerstatus er forstyr ikke - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu Menuen til kontoskift og indstillinger - + Open local folder of current account Åbn lokal mappe for nuværende konto - + Connected Forbundet - + Disconnected Frakoblet - + Open Nextcloud Talk in browser Åbn Nextcloud Talk i browseren - + More apps Flere apps - + Open %1 in browser Åbn %1 i browser - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Systembakken er ikke tilgængelig - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 kræver en fungerende systembakke. Hvis du bruger Xfce, følg venligst <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">disse instruktioner</a>. Ellers installer venligst et program til hÃ¥ndtering af systembakken sÃ¥som "trayer" og prøv igen. @@ -5672,7 +6076,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Bygget fra Git-revision <a href="%1">%2</a> pÃ¥ %3, %4 med Qt %5, %6</small></p> @@ -5706,72 +6110,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Slettet - + Moved to %1 Flyttet til %1 - + Ignored Ignoreret - + Filesystem access error Fejl ved adgang til filsystemet - + Error Fejl - + Updated local metadata Lokale metadata sendt - + Unknown Ukendt - + downloading henter - + uploading sender - + deleting sletter - + moving flytter - + ignoring ignorerer - + error fejl - + updating local metadata opdaterer lokale metadata diff --git a/translations/client_de.ts b/translations/client_de.ts index 03373ed0e..f85dfd18d 100644 --- a/translations/client_de.ts +++ b/translations/client_de.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally %1 lokal öffnen - + In %1 In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Weitere Aktionen anzeigen @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Ablehnen + + + Open file details + Dateidetails öffnen + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Aktivitätenliste @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Statusmeldungs-Menü löschen @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Ablehnen + + + Activity Aktivität - + Sharing Teilen @@ -226,12 +236,12 @@ Verschieben in den Papierkorb ist auf dieser Plattform nicht möglich - + Error removing "%1": %2 Fehler beim Entfernen "%1": %2 - + Could not remove folder "%1" Der Ordner "%1" konnte nicht gelöscht werden @@ -321,7 +331,7 @@ Falscher HTTP-Code vom Server zurückgegeben. 204 erwartet, aber "%1 %2" erhalten. - + "%1 Failed to unlock encrypted folder %2". "%1 Der verschlüsselte Ordner %2 konnte nicht entsperrt werden". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Datei %1 ist bereits von %2 gesperrt. - + Lock operation on %1 failed with error %2 Das Sperren von %1 ist mit Fehler %2 fehlgeschlagen - + Unlock operation on %1 failed with error %2 Das Entsperren von %1 ist mit Fehler %2 fehlgeschlagen @@ -353,9 +363,9 @@ - - - + + + Cancel Abbrechen @@ -400,12 +410,12 @@ Sie scheinen die Funktion "Virtuelle Dateien" für diesen Ordner aktiviert zu haben. Im Moment ist es nicht möglich, virtuelle Dateien, die Ende-zu-Ende-verschlüsselt sind, implizit herunterzuladen. Um die beste Erfahrung mit virtuellen Dateien und Ende-zu-Ende-Verschlüsselung zu machen, stellen Sie sicher, dass der verschlüsselte Ordner mit "Immer lokal verfügbar machen" markiert ist. - + End-to-end Encryption with Virtual Files Ende-zu-Ende-Verschlüsselung mit virtuellen Dateien - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Sie scheinen die Funktion "Virtuelle Dateien" für diesen Ordner aktiviert zu haben. Im Moment ist es nicht möglich, virtuelle Dateien, die Ende-zu-Ende-verschlüsselt sind, implizit herunterzuladen. Um die beste Erfahrung mit virtuellen Dateien und Ende-zu-Ende-Verschlüsselung zu machen, stellen Sie sicher, dass der verschlüsselte Ordner mit "Immer lokal verfügbar machen" markiert ist. @@ -415,29 +425,29 @@ Ordner nicht verschlüsseln - + Do not encrypt folder Ordner nicht verschlüsseln - + Encrypt folder Ordner verschlüsseln - + No account configured. Kein Konto konfiguriert. - - Display mnemonic - Gedächtnisstütze anzeigen + + Disable encryption + Verschlüsselung deaktivieren - End-to-end encryption has been enabled for this account - Für dieses Konto wurde die Ende-zu-Ende-Verschlüsselung aktiviert + Display mnemonic + Gedächtnisstütze anzeigen @@ -445,18 +455,23 @@ Verschlüsselung aktivieren - + + End-to-end encryption has been enabled for this account + Für dieses Konto wurde die Ende-zu-Ende-Verschlüsselung aktiviert + + + Warning Warnung - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - Auf diesem Gerät ist keine Ende-zu-Ende-Verschlüsselung konfiguriert. Sobald sie konfiguriert ist, können Sie diesen Ordner verschlüsseln. Möchten Sie die Ende-zu-Ende-Verschlüsselung einrichten? + Auf diesem Gerät ist keine Ende-zu-Ende-Verschlüsselung konfiguriert. Sobald sie konfiguriert ist, kann dieser Ordner verschlüsselt werden. Soll die Ende-zu-Ende-Verschlüsselung eingerichtet werden? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Sie können einen Ordner nicht mit Inhalten verschlüsseln, bitte Dateien entfernen. @@ -469,121 +484,121 @@ Warten Sie auf die neue Synchronisierung und verschlüsseln Sie sie dann.Dieses Konto unterstützt Ende-zu-Ende-Verschlüsselung - + Encryption failed Verschlüsselung fehlgeschlagen - + Could not encrypt folder because the folder does not exist anymore Der Ordner konnte nicht verschlüsselt werden, da er nicht mehr existiert - - + + Open folder Ordner öffnen - + Encrypt Verschlüsseln - - + + Edit Ignored Files Ignorierte Dateien bearbeiten - - + + Create new folder Neuen Ordner erstellen - - + + Availability Verfügbarkeit - + Choose what to sync Zu synchronisierende Elemente auswählen - + Force sync now Synchronisierung jetzt erzwingen - + Restart sync Synchronisierung neustarten - + Resume sync Synchronisierung fortsetzen - + Pause sync Synchronisierung pausieren - + Remove folder sync connection Ordner-Synchronisierung entfernen - + Disable virtual file support … Unterstützung für virtuelle Dateien deaktivieren - + Enable virtual file support %1 … Unterstützung für virtuelle Dateien aktivieren %1 … - + (experimental) (experimentell) - + Folder creation failed Anlegen des Ordners fehlgeschlagen - + <p>Could not create local folder <i>%1</i>.</p> <p>Konnte lokalen Ordner <i>%1</i> nicht anle‏gen.‎</p> - + Confirm Folder Sync Connection Removal Bestätigen Sie die Löschung der Ordner-Synchronisierung - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Möchten Sie den Ordner <i>%1</i> nicht mehr synchronisieren?</p><p><b>Anmerkung:</b> Dies wird <b>keine</b> Dateien löschen.</p> - + Remove Folder Sync Connection Ordner-Synchronisierung entfernen - + Disable virtual file support? Unterstützung für virtuelle Dateien deaktivieren? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Der einzige Vorteil der Deaktivierung der Unterstützung für virtuelle Dateien Diese Aktion bricht jede derzeit laufende Synchronisierung ab. - + Disable support Unterstützung deaktivieren @@ -606,145 +621,177 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. Gedächtnisstütze für Ende-zu-Ende Verschlüsselung - + End-to-end encryption mnemonic Gedächtnisstütze für Ende-zu-Ende Verschlüsselung - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Um Ihre kryptografische Identität zu schützen, verschlüsseln wir sie mit einer Gedächtnisstütze von 12 Wörterbuchwörtern. Bitte notieren Sie sich diese und bewahren Sie sie auf. Sie werden benötigt, um Ihrem Konto weitere Geräte hinzuzufügen (z. B. Ihr Mobiltelefon oder Laptop). - + + Disable end-to-end encryption + Ende-zu-Ende-Verschlüsselung deaktivieren + + + + Disable end-to-end encryption for %1? + Ende-zu-Ende-Verschlüsselung für %1 deaktivieren? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Durch das Entfernen der Ende-zu-Ende-Verschlüsselung werden lokal synchronisierte Dateien entfernt, die verschlüsselt sind.<br>Verschlüsselte Dateien verbleiben auf dem Server. + + + Sync Running Synchronisierung läuft - + The syncing operation is running.<br/>Do you want to terminate it? Die Synchronisierung läuft gerade.<br/>Wollen Sie diese beenden? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) von %2 Serverkapazität verwendet. Einige Ordner, einschließlich über das Netzwerk verbundene oder geteilte Ordner, können unterschiedliche Beschränkungen aufweisen. - + %1 of %2 in use %1 von %2 Serverkapazität verwendet - + Currently there is no storage usage information available. Derzeit sind keine Speichernutzungsinformationen verfügbar. - + %1 in use %1 wird verwendet - + %1 as %2 %1 als %2 - + The server version %1 is unsupported! Proceed at your own risk. Die Serverversion %1 wird nicht unterstützt! Fortfahren auf eigenes Risiko. - + Connected to %1. Verbunden mit %1. - + Server %1 is temporarily unavailable. Server %1 ist derzeit nicht verfügbar. - + Server %1 is currently in maintenance mode. Server %1 befindet sich im Wartungsmodus. - + Signed out from %1. Abgemeldet von %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Berechtigung vom Browser einholen. <a href='%1'> Klicken Sie hier </a>, um den Browser erneut zu öffnen. - + Connecting to %1 … Verbinde zu %1 … - + No connection to %1 at %2. Keine Verbindung zu %1 auf %2 - + Server configuration error: %1 at %2. Konfigurationsfehler des Servers: %1 auf %2. - + No %1 connection configured. Keine %1-Verbindung konfiguriert. - + There are folders that were not synchronized because they are too big: Einige Ordner konnten nicht synchronisiert werden, da sie zu groß sind: - + There are folders that were not synchronized because they are external storages: Es gibt Ordner, die nicht synchronisiert werden konnten, da sie externe Speicher sind: - + There are folders that were not synchronized because they are too big or external storages: Es gibt Ordner, die nicht synchronisiert werden konnten, da sie zu groß oder externe Speicher sind: - + Confirm Account Removal Kontenentfernung bestätigen - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Möchten Sie wirklich die Verbindung zum Konto <i>%1</i> lösen?</p><p><b>Anmerkung:</b> Dieser Vorgang wird <b>keine</b> Dateien löschen.</p> - + Remove connection Verbindung entfernen - - + This account supports end-to-end encryption Dieses Konto unterstützt Ende-zu-Ende-Verschlüsselung - + Set up encryption Verschlüsselung einrichten - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - Die Ende-zu-Ende-Verschlüsselung wurde für dieses Konto mit einem anderen Gerät aktiviert. <br>Sie kann auf diesem Gerät durch Eingabe Ihrer Mnemonik aktiviert werden. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Die Ende-zu-Ende-Verschlüsselung wurde auf diesem Konto mit einem anderen Gerät aktiviert.<br>Sie kann auf diesem Gerät durch Eingabe Ihrer Mnemonik aktiviert werden.<br>Dadurch wird die Synchronisierung vorhandener verschlüsselter Ordner aktiviert. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Die genehmigte Anfrage an den Server wurde an „%1“ umgeleitet. Die URL ist fehlerhaft, der Server ist falsch konfiguriert. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Zugriff durch Server verboten. Um zu überprüfen, ob Sie über den richtigen Zugriff verfügen, <a href="%1">klicken Sie hier</a>, um mit Ihrem Browser auf den Dienst zuzugreifen. + + + + There was an invalid response to an authenticated WebDAV request + Es gab eine ungültige Antwort auf eine authentifizierte WebDAV-Anfrage @@ -798,7 +845,7 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. OCC::ActivityListModel - + For more activities please open the Activity app. Um weitere Aktivitäten anzusehen bitte die Activity-App öffnen. @@ -808,12 +855,12 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. Aktivitäten abrufen… - + Fetching activities … Aktivitäten abrufen… - + Files from the ignore list as well as symbolic links are not synced. Dateien aus der Ignorierliste sowie symbolische Links werden nicht synchronisiert. @@ -864,32 +911,59 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Wenn Sie fortfahren, werden <b>diese Einstellungen gelöscht</b>. - + Continuing will mean <b>ignoring these settings</b>. Wenn Sie fortfahren, werden <b>diese Einstellungen ignoriert</b>. - + 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>. Einige Einstellungen wurden in neueren Versionen dieses Clients konfiguriert und verwenden Funktionen, die in dieser Version nicht verfügbar sind.<br><br>%1<br><br>Die aktuelle Konfigurationsdatei wurde bereits auf <i>%2</i> gesichert. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Beenden - + Continue Fortsetzen - + Error accessing the configuration file Fehler beim Zugriff auf die Konfigurationsdatei @@ -899,12 +973,12 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. Beim Zugriff auf die Konfigurationsdatei bei %1 ist ein Fehler aufgetreten. Stellen Sie sicher, dass Ihr Benutzer auf die Datei zugreifen kann. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Beim Zugriff auf die Konfigurationsdatei unter %1 ist ein Fehler aufgetreten. Stellen Sie sicher, dass Ihr Systemkonto auf die Datei zugreifen kann. - + Quit %1 Beende %1 @@ -950,56 +1024,216 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. Die Datei %1 hat eine ungültige Änderungszeit. Nicht auf den Server hochladen. - + File Removed (start upload) %1 Datei entfernt (starte das Hochladen) %1 - + File %1 has invalid modification time. Do not upload to the server. Die Datei %1 hat eine ungültige Änderungszeit. Nicht auf den Server hochladen. - + Local file changed during syncing. It will be resumed. Lokale Datei hat sich während der Synchronisierung geändert. Die Synchronisierung wird wieder aufgenommen. - - + + Local file changed during sync. Lokale Datei wurde während der Synchronisierung geändert. - + Network error: %1 Netzwerkfehler: %1 - + Error updating metadata: %1 Fehler beim Aktualisieren der Metadaten: %1 - + The file %1 is currently in use Die Datei %1 wird aktuell verwendet - + The local file was removed during sync. Die lokale Datei wurde während der Synchronisierung gelöscht. - + Restoration failed: %1 Wiederherstellung fehlgeschlagen: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Die Datei kann nicht umbenannt werden, da eine Datei mit selben Namen bereits auf dem Server existiert. Bitte einen anderen Namen wählen. + + + + Could not rename file. Please make sure you are connected to the server. + Datei konnte nicht umbenannt werden. Bitte stellen Sie sicher, dass Sie mit dem Server verbunden sind. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Sie haben nicht die Berechtigung, diese Datei umzubenennen. Bitte wenden Sie sich zum Umbenennen der Datei an dereren Ersteller. + + + + Failed to fetch permissions with error %1 + Fehler beim Abrufen der Berechtigungen. Fehler %1 + + + + Filename contains leading and trailing spaces. + Dateiname enthält Leerzeichen am Anfang und am Ende. + + + + Filename contains leading spaces. + Dateiname enthält Leerzeichen am Anfang. + + + + Filename contains trailing spaces. + Dateiname enthält Leerzeichen am Ende. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Konflikt mit der Groß- und Kleinschreibung + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Die Datei konnte nicht synchronisiert werden, da diese einen Konflikt bezüglich Groß- und Kleinschreibung mit einer vorhandenen Datei auf diesem System erzeugt. + + + + Error + Fehler + + + + Existing file + Vorhandene Datei + + + + file A + Datei A + + + + fileA + Datei A + + + + + today + Heute + + + + + 0 byte + 0 Byte + + + + + Open existing file + Existierende Datei öffnen + + + + Case clashing file + Datei mit dem Problem der Groß- und Kleinschreibung + + + + file B + Datei B + + + + fileB + Datei B + + + + + Open clashing file + Datei mit dem Problem der Groß- und Kleinschreibung öffnen + + + + Please enter a new name for the clashing file: + Bitte einen neuen Namen für die Datei mit dem Problem der Groß- und Kleinschreibung eingeben: + + + + New filename + Neuer Dateiname + + + + Rename file + Datei umbenennen + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Die Datei "%1" konnte aufgrund eines Fallkonflikts mit einer vorhandenen Datei auf diesem System nicht synchronisiert werden. + + + + %1 does not support equal file names with only letter casing differences. + %1 unterstützt keine gleichen Dateinamen mit Unterschieden nur in der Groß- und Kleinschreibung. + + + + Filename contains leading and trailing spaces. + Dateiname enthält Leerzeichen am Anfang und am Ende. + + + + Filename contains leading spaces. + Dateiname enthält Leerzeichen am Anfang. + + + + Filename contains trailing spaces. + Dateiname enthält Leerzeichen am Ende. + + + + Use invalid name + Ungültigen Namen verwenden + + + + Filename contains illegal characters: %1 + Dateiname enthält unzulässige Zeichen: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Fehler beim Schreiben der Metadaten in die Datenbank @@ -1017,12 +1251,12 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. Geben Sie Ihre Passphrase für Ende-zu-Ende-Verschlüsselung ein:<br><br>Benutzer: %2<br>Konto: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Geben Sie Ihre Passphrase für Ende-zu-Ende-Verschlüsselung ein:<br><br>Benutzername: %2<br>Konto: %3<br> - + Enter E2E passphrase E2E-Passphrase eingeben @@ -1198,8 +1432,8 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Serverantwort: PROPFIND-Antwort ist nicht im XML-Format! @@ -1207,27 +1441,27 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Fehler beim Öffnen des Ordners %1 - + Directory not accessible on client, permission denied Verzeichnis auf dem Client nicht zugreifbar, Berechtigung verweigert - + Directory not found: %1 Ordner nicht gefunden: %1 - + Filename encoding is not valid Dateinamenkodierung ist ungültig - + Error while reading directory %1 Fehler beim Lesen des Ordners %1 @@ -1235,91 +1469,91 @@ Diese Aktion bricht jede derzeit laufende Synchronisierung ab. OCC::EditLocallyJob - + Invalid token received. Ungültiges Token empfangen. - - - - - - + + + + + + Please try again. Bitte erneut versuchen. - + Invalid file path was provided. Ungültiger Dateipfad wurde angegeben. - + Could not find an account for local editing. Es konnte kein Konto für die lokale Bearbeitung gefunden werden. - - + + Could not validate the request to open a file from server. Die Anforderung zum Öffnen einer Datei vom Server konnte nicht validiert werden. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Datei zur lokalen Bearbeitung konnte nicht gefunden werden. Stellen Sie sicher, dass der Pfad gültig ist und lokal synchronisiert wird. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Datei zur lokalen Bearbeitung konnte nicht gefunden werden. Stellen Sie sicher, dass sie nicht durch die selektive Synchronisierung ausgeschlossen wird. - + Server error: PROPFIND reply is not XML formatted! Serverantwort: PROPFIND-Antwort ist nicht im XML-Format! - + Could not find a remote file info for local editing. Make sure its path is valid. Remote-Dateiinformationen für die lokale Bearbeitung konnten nicht gefunden werden. Stellen Sie sicher, dass der Pfad gültig ist. - + Could not open %1 - + %1 konnte nicht geöffnet werden - + File %1 already locked. - + Datei %1 bereits gesperrt. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Die Sperre dauert noch %1 Minuten. Sie können diese Datei auch manuell entsperren, sobald Sie mit der Bearbeitung fertig sind. - + File %1 now locked. - + Datei %1 ist jetzt gesperrt. - + File %1 could not be locked. - + Datei %1 konnte nicht gesperrt werden. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Die Metadaten für die Verschlüsselung konnten nicht generiert werden. Entsperren des Ordners. @@ -1449,145 +1683,145 @@ Dies kann ein Problem mit Ihren OpenSSL-Bibliotheken sein. OCC::Folder - + Local folder %1 does not exist. Lokaler Ordner %1 existiert nicht. - + %1 should be a folder but is not. %1 sollte ein Ordner sein, ist es aber nicht. - + %1 is not readable. %1 ist nicht lesbar. - + %1 and %n other file(s) have been removed. %1 und %n andere Datei wurde gelöscht.%1 und %n andere Dateien wurden gelöscht. - + %1 has been removed. %1 names a file. %1 wurde gelöscht. - + %1 and %n other file(s) have been added. %1 und %n andere Datei wurden hinzugefügt.%1 und %n andere Dateien wurden hinzugefügt. - + %1 has been added. %1 names a file. %1 wurde hinzugefügt. - + %1 and %n other file(s) have been updated. %1 und %n andere Datei wurde aktualisiert.%1 und %n andere Dateien wurden aktualisiert. - + %1 has been updated. %1 names a file. %1 wurde aktualisiert. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 wurde in %2 umbenannt und %n andere Datei wurde umbenannt.%1 wurde in %2 umbenannt und %n andere Dateien wurden umbenannt. - + %1 has been renamed to %2. %1 and %2 name files. %1 wurde in %2 umbenannt. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 wurde in %2 verschoben und %n andere Datei wurde verschoben.%1 wurde in %2 verschoben und %n andere Dateien wurden verschoben. - + %1 has been moved to %2. %1 wurde in %2 verschoben. - + %1 has and %n other file(s) have sync conflicts. %1 und %n andere Datei haben Konflikte beim Abgleichen.%1 und %n andere Dateien haben Konflikte beim Abgleichen. - + %1 has a sync conflict. Please check the conflict file! Es gab einen Konflikt bei der Synchronisierung von %1. Bitte prüfen Sie die Konfliktdatei! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 und %n weitere Datei konnten aufgrund von Fehlern nicht synchronisiert werden. Schauen Sie in das Protokoll für Details.%1 und %n weitere Dateien konnten aufgrund von Fehlern nicht synchronisiert werden. Details finden Sie im Protokoll. - + %1 could not be synced due to an error. See the log for details. %1 konnte aufgrund eines Fehlers nicht synchronisiert werden. Details finden Sie im Protokoll. - + %1 and %n other file(s) are currently locked. %1 und %n andere Datei sind aktuell gesperrt.%1 und %n andere Dateien sind aktuell gesperrt. - + %1 is currently locked. %1 ist aktuell gesperrt. - + Sync Activity Synchronisierungsaktivität - + Could not read system exclude file Systemeigene Ausschlussdatei kann nicht gelesen werden - + A new folder larger than %1 MB has been added: %2. Ein neuer Ordner größer als %1 MB wurde hinzugefügt: %2. - + A folder from an external storage has been added. Ein Ordner von einem externen Speicher wurde hinzugefügt. - + Please go in the settings to select it if you wish to download it. Bitte wechseln Sie zu den Einstellungen, falls Sie den Ordner herunterladen möchten. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Der Ordner %1 wurde erstellt, wurde jedoch zuvor von der Synchronisierung ausgeschlossen. Die darin enthaltenen Daten werden nicht synchronisiert. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Die Datei % 1 wurde erstellt, jedoch bereits zuvor von der Synchronisierung ausgeschlossen. Sie wird nicht synchronisiert werden. - + 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). @@ -1600,7 +1834,7 @@ Dies bedeutet, dass der Synchronisierungs-Client lokale Änderungen möglicherwe %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ Wenn Sie sich entscheiden, die Dateien wiederherzustellen, werden sie erneut mit Wenn Sie sich entscheiden, die Dateien zu löschen, sind sie für Sie nicht mehr verfügbar, es sei denn, Sie sind der Eigentümer. - + 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. @@ -1620,17 +1854,17 @@ 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. - + Remove All Files? Alle Dateien löschen? - + Remove all files Alle Dateien entfernen - + Keep files Dateien behalten @@ -1666,22 +1900,22 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide OCC::FolderMan - + Could not reset folder state Konnte Ordner-Zustand nicht zurücksetzen - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Ein altes Synchronisierungsprotokoll "%1" wurde gefunden, konnte jedoch nicht entfernt werden. Bitte stellen Sie sicher, dass keine Anwendung es verwendet. - + (backup) (Sicherung) - + (backup %1) (Sicherung %1) @@ -1691,27 +1925,27 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide Undefinierter Zustand. - + Undefined state. Undefinierter Zustand. - + Waiting to start syncing. Wartet auf Beginn der Synchronisierung. - + Preparing for sync. Synchronisierung wird vorbereitet. - + Sync is running. Synchronisierung läuft. - + Sync finished with unresolved conflicts. Synchronisierung mit ungelösten Konflikten beendet. @@ -1731,62 +1965,62 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide Benutzerabbruch. - + Last sync was successful. Die letzte Synchronisierung war erfolgreich. - + Setup error. Einrichtungsfehler. - + Sync request was cancelled. Synchronisierungsanfrage wurde abgebrochen. - + Sync is paused. Synchronisierung ist pausiert. - + %1 (Sync is paused) %1 (Synchronisierung ist pausiert) - + No valid folder selected! Kein gültiger Ordner gewählt! - + The selected path does not exist! Der gewählte Pfad existiert nicht! - + The selected path is not a folder! Der gewählte Pfad ist kein Ordner! - + You have no permission to write to the selected folder! Sie haben keine Schreibberechtigung für den ausgewählten Ordner! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Der lokale Ordner %1 liegt innerhalb eines synchronisierten Ordners. Bitte wählen Sie einen anderen aus! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Der lokale Ordner %1 liegt in einem Ordner, der bereits synchronisiert wird. Bitte wählen Sie einen anderen aus! - + There is already a sync from the server to this local folder. Please pick another local folder! Es existiert bereits eine Synchronisierung vom Server zu diesem lokalen Ordner. Bitte wählen Sie einen anderen lokalen Ordner! @@ -1799,7 +2033,7 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide Ordner-Synchronisierung hinzufügen - + File Datei @@ -1807,152 +2041,156 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide OCC::FolderStatusModel - + You need to be connected to add a folder Sie müssen verbunden sein, um einen Ordner hinzuzufügen - + Click this button to add a folder to synchronize. Wählen Sie diese Schaltfläche, um einen zu synchronisierenden Ordner hinzuzufügen. - - + + Could not decrypt! + Konnte nicht entschlüsseln! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Fehler beim Empfang der Ordnerliste vom Server. - + Fetching folder list from server … Rufe Ordnerliste vom Server ab … - + There are unresolved conflicts. Click for details. Es existieren ungelöste Konflikte. Für Details klicken. - + Virtual file support is enabled. Unterstützung für virtuelle Dateien ist aktiviert. - + Signed out Abgemeldet - + Synchronizing VirtualFiles with local folder Synchronisiere VirtualFiles mit lokalem Ordner - + Synchronizing with local folder Synchronisiere mit lokalem Ordner - + Checking for changes in remote "%1" Nach Änderungen in entfernten "%1" suchen - + Checking for changes in local "%1" Nach Änderungen in lokalem "%1" suchen - + Reconciling changes Änderungen zusammenführen - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synchronisiere %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) Download %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) Upload %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 von %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Noch ein paar Sekunden, %1 von %2, Datei %3 von %4 - + %5 left, %1 of %2, file %3 of %4 %5 übrig, %1 von %2, Datei %3 von %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 of %2, Datei %3 von %4 - + file %1 of %2 Datei %1 von %2 - + Waiting … Warte … - + Waiting for %n other folder(s) … Warte auf %n anderen Ordner …Warte auf %n andere Ordner … - + Preparing to sync … Synchronisierung wird vorbereitet … @@ -2183,13 +2421,13 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide - + stable Stabil - + beta Beta @@ -2241,32 +2479,32 @@ Falls dies ein Missgeschick war und Sie sich zum Behalten der Dateien entscheide - + Create Debug Archive Debug-Archiv erstellen - + Server notifications that require attention. Server-Benachrichtigungen, die Aufmerksamkeit erfordern. - + Show call notification dialogs. Dialog zu Anrufbenachrichtigungen anzeigen - + You cannot disable autostart because system-wide autostart is enabled. Sie können den Autostart nicht deaktivieren, da der systemweite Autostart aktiviert ist. - + Change update channel? Update-Kanal ändern? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Beachten Sie bitte, dass hierdurch nur ausgewählt wird, aus welchem Pool Upgrades heruntergeladen werden und dass Downgrades nicht möglich sind. Die Rückkehr vom Beta- zum stabilen Kanal kann daher zumeist nicht sofort erfolgen, sondern es muss auf eine neue stabile Version gewartet werden, die neuer als die aktuell installierte Beta ist. - + Change update channel Update-Kanal ändern - + Cancel Abbrechen - + Zip Archives Zip-Archive - + Debug Archive Created Debug-Archiv erstellt - + Debug archive is created at %1 Debug-Archiv erstellt in %1 @@ -2303,22 +2541,22 @@ Beachten Sie bitte, dass hierdurch nur ausgewählt wird, aus welchem Pool Upgrad OCC::GetOrCreatePublicLinkShare - + Password for share required Passwort für die Freigabe erforderlich - + Please enter a password for your link share: Bitte Passwort für die Link-Freigabe eingeben: - + Sharing error Fehler beim Teilen - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Objekte, bei denen Löschen erlaubt ist, werden gelöscht, wenn diese das Lösch Close Schliessen + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Beachten Sie, dass die Verwendung von Befehlszeilenoptionen für die Protokollie - + Use &virtual files instead of downloading content immediately %1 &Virtuelle Dateien verwenden, anstatt den Inhalt sofort herunterzuladen %1 - + (experimental) (experimentell) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Virtuelle Dateien werden für die Wurzel von Windows-Partitionen als lokaler Ordner nicht unterstützt. Bitte wählen Sie einen gültigen Unterordner unter dem Laufwerksbuchstaben. - + %1 folder "%2" is synced to local folder "%3" %1 Ordner "%2" wird mit dem lokalen Ordner "%3" synchronisiert - + Sync the folder "%1" Ordner "%1" synchronisieren - + Warning: The local folder is not empty. Pick a resolution! Achtung: Der lokale Ordner ist nicht leer. Bitte wählen Sie eine entsprechende Lösung! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 freier Platz - + Virtual files are not available for the selected folder Virtuelle Dateien sind für den ausgewählten Ordner nicht verfügbar - + Local Sync Folder Lokaler Ordner für die Synchronisierung - - + + (%1) (%1) - + There isn't enough free space in the local folder! Nicht genug freier Platz im lokalen Ordner vorhanden! @@ -3016,7 +3259,8 @@ Beachten Sie, dass die Verwendung von Befehlszeilenoptionen für die Protokollie OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Es ist nicht möglich, die Änderungszeit für die in Konflikt stehende Datei abzurufen %1 @@ -3048,144 +3292,144 @@ Beachten Sie, dass die Verwendung von Befehlszeilenoptionen für die Protokollie OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Erfolgreich mit %1 verbunden: %2 Version %3 (%4)</font><br/><br/> - + Invalid URL Ungültige URL - + Failed to connect to %1 at %2:<br/>%3 Die Verbindung zu %1 auf %2 konnte nicht hergestellt werden: <br/>%3 - + Timeout while trying to connect to %1 at %2. Zeitüberschreitung beim Verbindungsversuch mit %1 unter %2. - + Trying to connect to %1 at %2 … Verbindungsversuch mit %1 unter %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Die Authentifizierungs-Anfrage an den Server wurde weitergeleitet an "%1". Diese Adresse ist ungültig, der Server ist falsch konfiguriert. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Zugang vom Server nicht erlaubt. <a href="%1">Klicken Sie hier</a> zum Zugriff auf den Dienst mithilfe Ihres Browsers, so dass Sie sicherstellen können, dass Ihr Zugang ordnungsgemäß funktioniert. - + There was an invalid response to an authenticated WebDAV request Ungültige Antwort auf eine WebDAV-Authentifizeriungs-Anfrage - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Lokaler Sync-Ordner %1 existiert bereits, aktiviere Synchronistation.<br/><br/> - + Creating local sync folder %1 … Lokaler Ordner %1 für die Synchronisierung wird erstellt … - + OK OK - + failed. fehlgeschlagen. - + Could not create local folder %1 Der lokale Ordner %1 konnte nicht erstellt werden - + No remote folder specified! Kein entfernter Ordner angegeben! - + Error: %1 Fehler: %1 - + creating folder on Nextcloud: %1 Erstelle Ordner auf Nextcloud: %1 - + Remote folder %1 created successfully. Entfernter Ordner %1 erfolgreich erstellt. - + The remote folder %1 already exists. Connecting it for syncing. Der Ordner %1 ist auf dem Server bereits vorhanden. Verbinde zur Synchronisierung. - - + + The folder creation resulted in HTTP error code %1 Das Erstellen des Ordners erzeugte den HTTP-Fehler-Code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Die Erstellung des entfernten Ordners ist fehlgeschlagen, weil die angegebenen Zugangsdaten falsch sind. <br/>Bitte gehen Sie zurück und überprüfen Sie die Zugangsdaten.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Die Erstellung des entfernten Ordners ist fehlgeschlagen, vermutlich sind die angegebenen Zugangsdaten falsch.</font><br/>Bitte gehen Sie zurück und überprüfen Sie Ihre Zugangsdaten.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Entfernter Ordner %1 konnte mit folgendem Fehler nicht erstellt werden: <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Eine Synchronisierungsverbindung für Ordner %1 zum entfernten Ordner %2 wurde eingerichtet. - + Successfully connected to %1! Erfolgreich verbunden mit %1! - + Connection to %1 could not be established. Please check again. Die Verbindung zu %1 konnte nicht hergestellt werden. Bitte prüfen Sie die Einstellungen erneut. - + Folder rename failed Ordner umbenennen fehlgeschlagen. - + Cannot 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. 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 und versuchen Sie es erneut oder beenden Sie die Installation. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Lokaler Sync-Ordner %1 erfolgreich erstellt!</b></font> @@ -3208,12 +3452,12 @@ Beachten Sie, dass die Verwendung von Befehlszeilenoptionen für die Protokollie Abbrechen - + Enable experimental feature? Experimentelle Funktion aktivieren? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Wenn Sie in diesen Modus wechseln, wird eine aktuell laufende Synchronisierung a Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu verwenden, melden Sie bitte alle auftretenden Probleme. - + Enable experimental placeholder mode Experimentellen Platzhaltermodus aktivieren - + Stay safe Bleiben Sie sicher @@ -3264,162 +3508,167 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Symbolische Verknüpfungen werden bei der Synchronisierung nicht unterstützt. - + File is listed on the ignore list. Die Datei ist in der Ignorierliste aufgeführt. - + File names ending with a period are not supported on this file system. Dateinamen, die mit einem Punkt enden, werden von diesem Dateisystem nicht unterstützt. - + File names containing the character "%1" are not supported on this file system. Dateinamen, welche das Zeichen "%1" enthalten, werden von diesem Dateisystem nicht unterstützt. - + File name contains at least one invalid character Der Dateiname enthält mindestens ein ungültiges Zeichen - + The file name is a reserved name on this file system. Der Dateiname ist ein reservierter Name in diesem Dateisystem. - + Filename contains trailing spaces. Dateiname enthält Leerzeichen am Ende. - + Filename contains leading spaces. Dateiname enthält Leerzeichen am Anfang. - + Filename contains leading and trailing spaces. Dateiname enthält Leerzeichen am Anfang und am Ende. - + Filename is too long. Der Dateiname ist zu lang. - + File/Folder is ignored because it's hidden. Datei/Ordner wird ignoriert, weil sie unsichtbar ist. - + Stat failed. Stat fehlgeschlagen. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Serverversion heruntergeladen, lokale Kopie umbenannt und nicht hochgeladen. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Problem der Groß- und Kleinschreibung: Serverdatei heruntergeladen und umbenannt, um Konflikte zu vermeiden. + + + The filename cannot be encoded on your file system. Der Dateiname kann auf Ihrem Dateisystem nicht entschlüsselt werden. - + The filename is blacklisted on the server. Der Dateiname steht auf dem Server auf einer schwarzen Liste. - + File has extension reserved for virtual files. Die Endung der Datei ist für virtuelle Dateien reserviert. - + size Größe - + permission Berechtigung - + file id Datei-ID - + Server reported no %1 Server meldet keine %1 - + Cannot sync due to invalid modification time Synchronisierung wegen ungültiger Änderungszeit nicht möglich - + Error while deleting file record %1 from the database Fehler beim Löschen des Dateisatzes %1 aus der Datenbank - + Conflict when uploading a folder. It's going to get cleared! Konflikt beim Hochladen eines Ordners. Er wird gelöscht! - + Conflict when uploading a file. It's going to get removed! Konflikt beim Hochladen einer Datei. Sie wird entfernt! - + Ignored because of the "choose what to sync" blacklist Ignoriert wegen der "Choose what to sync"-Blacklist - + Not allowed because you don't have permission to add subfolders to that folder Nicht erlaubt, da Sie nicht die Berechtigung haben, Unterordner zu diesem Ordner hinzuzufügen. - + Not allowed because you don't have permission to add files in that folder Nicht erlaubt, da Sie keine Berechtigung zum Hinzufügen von Dateien in diesen Ordner haben. - + Not allowed to upload this file because it is read-only on the server, restoring Das Hochladen dieser Datei ist nicht erlaubt, da die Datei auf dem Server schreibgeschützt ist. Wiederherstellen. - + Moved to invalid target, restoring Auf ungültiges Ziel verschoben, wiederherstellen. - + Not allowed to remove, restoring Entfernen nicht erlaubt, wiederherstellen. - + Error while reading the database Fehler beim Lesen der Datenbank - + Server replied with an error while reading directory "%1" : %2 Der Server hat während des Lesens des Verzeichnisses "%1" mit einem Fehler geantwortet: %2 @@ -3427,22 +3676,22 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::PropagateDirectory - + could not delete file %1 from local DB Datei %1 konnte nicht aus lokaler Datenbank gelöscht werden - + Error updating metadata due to invalid modification time Fehler beim Aktualisieren der Metadaten aufgrund einer ungültigen Änderungszeit - + Error updating metadata: %1 Fehler beim Aktualisieren der Metadaten: %1 - + File is currently in use Datei ist aktuell in Benutzung @@ -3455,19 +3704,19 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Datei %1 konnte nicht aus der lokalen Datenbank abgerufen werden - + File %1 cannot be downloaded because encryption information is missing. Die Datei %1 kann nicht heruntergeladen werden, da die Verschlüsselungsinformationen fehlen. - - + + File has changed since discovery Datei ist seit der Entdeckung geändert worden - + Could not delete file record %1 from local DB Der Dateidatensatz %1 konnte nicht aus der lokalen Datenbank gelöscht werden @@ -3478,32 +3727,32 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht heruntergeladen werden! - + File %1 can not be downloaded because of a local file name clash! Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht herunter geladen werden! - + The download would reduce free local disk space below the limit Das Herunterladen würde den lokalen freien Speicherplatz unter die Grenze reduzieren - + Free space on disk is less than %1 Der freie Speicher auf der Festplatte ist weniger als %1 - + File was deleted from server Die Datei wurde vom Server gelöscht - + The file could not be downloaded completely. Die Datei konnte nicht vollständig heruntergeladen werden. - + The downloaded file is empty, but the server said it should have been %1. Die heruntergeladene Datei ist leer, obwohl der Server %1 als Größe übermittelt hat. @@ -3513,18 +3762,23 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Die Datei %1 kann aufgrund eines Konflikts mit dem lokalen Dateinamen nicht gespeichert geladen werden! - - + + File %1 has invalid modified time reported by server. Do not save it. Datei %1 hat eine ungültige Änderungszeit, die vom Server gemeldet wurde. Speichern Sie sie nicht. - + + File %1 downloaded but it resulted in a local file name clash! + Datei %1 heruntergeladen, aber dies führte zu einem lokalen Dateinamenskonflikt! + + + Error updating metadata: %1 Fehler beim Aktualisieren der Metadaten: %1 - + The file %1 is currently in use Die Datei %1 ist aktuell in Benutzung @@ -3545,7 +3799,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 Konnte Datei %1 nicht löschen. Fehler: %2 @@ -3556,16 +3810,21 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver + Folder %1 cannot be created because of a local file or folder name clash! + Ordner %1 kann aufgrund einer lokalen Datei- oder Ordnernamenskollision nicht erstellt werden! + + + Could not create folder %1 Ordner %1 konnte nicht erstellt werden - + Error updating metadata: %1 Fehler beim Aktualisieren der Metadaten: %1 - + The file %1 is currently in use Die Datei %1 ist aktuell in Benutzung @@ -3573,7 +3832,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht gelöscht werden @@ -3586,46 +3845,51 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Die Datei %1 kann aufgrund eines Konfliktes mit einem lokalen Dateinamen nicht in %2 umbenannt werden - - - + + File %1 downloaded but it resulted in a local file name clash! + Datei %1 heruntergeladen, aber dies führte zu einem lokalen Dateinamenskonflikt! + + + + + could not get file %1 from local DB Datei %1 konnte nicht aus der lokalen Datenbank abgerufen werden - + Error setting pin state Fehler beim Setzen des PIN-Status - - + + Error updating metadata: %1 Fehler beim Aktualisieren der Metadaten: %1 - + The file %1 is currently in use Die Datei %1 ist aktuell in Benutzung - - + + Could not delete file record %1 from local DB Der Dateidatensatz %1 konnte nicht aus der lokalen Datenbank gelöscht werden - + Failed to propagate directory rename in hierarchy Die Umbenennung des Verzeichnisses in der Hierarchie konnte nicht weitergegeben werden - + Failed to rename file Konnte Datei nicht umbenennen @@ -3646,7 +3910,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Falscher HTTP-Code vom Server zurückgegeben. 204 erwartet, aber "%1 %2" erhalten. @@ -3659,12 +3923,12 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Es wurde ein falscher HTTP-Status-Code vom Server gesendet. Erwartet wurde 201, aber gesendet wurde "%1 %2". - + Error writing metadata to the database: %1 Fehler beim Schreiben der Metadaten in die Datenbank: %1 - + The file %1 is currently in use Die Datei %1 ist aktuell in Benutzung @@ -3672,42 +3936,42 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Konnte %1 nicht nach %2 umbenennen. Fehler: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Es wurde ein falscher HTTP-Status-Code vom Server gesendet. Erwartet wurde 201, aber gesendet wurde "%1 %2". - + could not get file %1 from local DB Datei %1 konnte nicht aus der lokalen Datenbank abgerufen werden - + Could not delete file record %1 from local DB Der Dateidatensatz %1 konnte nicht aus der lokalen Datenbank gelöscht werden - + Error updating metadata: %1 Fehler beim Aktualisieren der Metadaten: %1 - + The file %1 is currently in use Die Datei %1 ist aktuell in Benutzung - + Error setting pin state Fehler beim Setzen des PIN-Status - + Error writing metadata to the database Fehler beim Schreiben der Metadaten in die Datenbank @@ -3897,7 +4161,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::ServerNotificationHandler - + Reply Antworten @@ -3915,23 +4179,23 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Einstellungen - + %1 Settings This name refers to the application name e.g Nextcloud %1-Einstellungen - + General Allgemein - + Network Netzwerk - + Account Benutzerkonto @@ -3939,17 +4203,22 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::ShareModel - + Share link Freigabe-Link - + Link share Link teilen - + + Internal link + Interner Link + + + Enter a note for the recipient Geben Sie eine Notiz für den Empfänger ein @@ -4025,7 +4294,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,171 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::SocketApi - + + Failed to encrypt folder at "%1" + Fehler beim Verschlüsseln des Ordners unter "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + Für das Konto %1 ist keine Ende-zu-Ende-Verschlüsselung konfiguriert. Bitte konfigurieren Sie diese in Ihren Kontoeinstellungen, um die Ordnerverschlüsselung zu aktivieren. + + + + Failed to encrypt folder + Ordner konnte nicht verschlüsselt werden + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Der folgende Ordner konnte nicht verschlüsselt werden: "%1". + +Server antwortete mit folgendem Fehler: %2 + + + + Folder encrypted successfully + Ordner erfolgreich verschlüsselt + + + + The following folder was encrypted successfully: "%1" + Der folgende Ordner wurde erfolgreich verschlüsselt: "%1" + + + Context menu share Kontextmenü Freigabe - + Select new location … Neuen Ort auswählen … - + I shared something with you Ich habe etwas mit Ihnen geteilt - - + + Share options Freigabeoptionen - - + + Activity Aktivität - + Copy private link to clipboard Privater Link in die Zwischenablage kopiert - + Send private link by email … Privaten Link als E-Mail verschicken … + + + Expire in %1 minutes + remaining time before lock expire + Läuft ab in %1 MinuteLäuft ab in %1 Minuten + - + Leave this share Freigabe verlassen - + Resharing this file is not allowed Weiterteilen dieser Datei ist nicht erlaubt - + Resharing this folder is not allowed Weiterteilen dieses Ordners ist nicht erlaubt - - + + Copy public link Öffentlichen Link kopieren - + Copy internal link Internen Link kopieren - + + Encrypt + Verschlüsseln + + + Lock file Datei sperren - + Unlock file Datei entsperren - + Locked by %1 Gesperrt von %1 - - Expire in %1 minutes - remaining time before lock expire - Läuft ab in %1 MinuteLäuft ab in %1 Minuten - - - + Expires in %1 minutes remaining time before lock expires Läuft ab in %1 MinuteLäuft ab in %1 Minuten - + Edit Bearbeiten - + Open in browser Im Browser öffnen - + Resolve conflict … Konflikt lösen… - + Move and rename … Verschieben und umbenennen … - + Move, rename and upload … Verschieben, umbenennen und hochladen … - + Delete local changes Lokale Änderungen löschen - + Move and upload … Verschieben und hochladen … - + Delete Löschen @@ -4377,63 +4685,63 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (übersprungen aufgrund des früheren Fehlers, erneuter Versuch in %2) - + Could not update file: %1 Datei konnte nicht aktualisiert werden: %1 - + Could not update virtual file metadata: %1 Metadaten der virtuellen Datei konnten nicht aktualisiert werden: %1 - + Could not update file metadata: %1 Die Metadaten der Datei konnten nicht aktualisiert werden: %1 - + Could not set file record to local DB: %1 Dateidatensatz konnte nicht auf lokale DB gesetzt werden: %1 - + Unresolved conflict. Ungelöster Konflikt. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Nur %1 sind verfügbar. Zum Beginnen werden mindestens %2 benötigt. - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Öffnen oder erstellen der Sync-Datenbank nicht möglich. Bitte sicherstellen, dass Schreibrechte für den zu synchronisierenden Ordner existieren. - + Using virtual files with suffix, but suffix is not set Virtuelle Dateien mit Endung verwenden, aber Endung ist nicht gesetzt. - + Unable to read the blacklist from the local database Fehler beim Einlesen der Blacklist aus der lokalen Datenbank - + Unable to read from the sync journal. Fehler beim Einlesen des Synchronisierungsprotokolls. - + Cannot open the sync journal Synchronisierungsprotokoll kann nicht geöffnet werden @@ -4443,12 +4751,12 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Die Synchronisierung wird in Kürze fortgesetzt. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Der freie Speicherplatz wird knapp: Downloads, die den freien Speicher unter %1 reduzieren, wurden ausgelassen. - + There is insufficient space available on the server for some uploads. Auf dem Server ist für einige Dateien zum Hochladen nicht genug Platz. @@ -4517,59 +4825,59 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::Systray - + Download Herunterladen - + Add account Konto hinzufügen - + Open main dialog Hauptfenster öffnen - - + + Pause sync Synchronisierung pausieren - - + + Resume sync Synchronisierung fortsetzen - + Settings Einstellungen - + Help Hilfe - + Exit %1 %1 beenden - + Pause sync for all Synchronisierung für alle pausieren - + Resume sync for all Synchronisierung für alle fortsetzen - + %1: %2 %1: %2 @@ -4577,24 +4885,24 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Desktop-Client</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Version %1. Für weitere Informationen klicken Sie bitte <a href='%2'>hier</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Plugin für virtuelle Dateien: %1</small></p> - + <p>This release was supplied by %1</p> <p>Diese Version wird von %1 bereitgestellt</p> @@ -4602,22 +4910,22 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Anbieter konnten nicht abgerufen werden. - + Failed to fetch search providers for '%1'. Error: %2 Konnte Suchanbieter für '%1' nicht abrufen. Fehler: %2 - + Search has failed for '%2'. Suche nach '%2' fehlgeschlagen. - + Search has failed for '%1'. Error: %2 Suche nach '%1' fehlgeschlagen. Fehler: %2 @@ -4625,30 +4933,36 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::User - + Retry all uploads Alle Uploads neu starten + + + + Resolve conflict + Konflikt lösen + OCC::UserModel - + Confirm Account Removal Kontenentfernung bestätigen - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Möchten Sie wirklich die Verbindung zum Konto <i>%1</i> entfernen?</p><p><b>Hinweis:</b> Es werden <b>keine</b> Dateien gelöscht.</p> - + Remove connection Verbindung entfernen - + Cancel Abbrechen @@ -4786,8 +5100,8 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Fehler beim Aktualisieren der Metadaten aufgrund einer ungültigen Änderungszeit @@ -4795,8 +5109,8 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Fehler beim Aktualisieren der Metadaten aufgrund einer ungültigen Änderungszeit @@ -4894,123 +5208,123 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver OCC::ownCloudGui - + Unsupported Server Version Nicht unterstütze Server-Version - + 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. Der Server auf Konto %1 verwendet die nicht unterstützte Version %2. Die Verwendung dieses Clients mit nicht unterstützten Serverversionen ist ungetestet und potenziell gefährlich. Die Verwendung erfolgt auf eigene Gefahr. - + Disconnected Getrennt - + Disconnected from some accounts Verbindungen zu einigen Konten getrennt - + Disconnected from %1 Von %1 getrennt - + Disconnected from accounts: Verbindungen zu Konten getrennt: - + Account %1: %2 Konto %1: %2 - + Please sign in Bitte melden Sie sich an - + Signed out Abgemeldet - + Account synchronization is disabled Konto-Synchronisierung ist deaktiviert - - + + Synchronization is paused Synchronisierung ist pausiert - + Folder %1: %2 Ordner %1: %2 - + Unresolved conflicts Ungelöste Konflikte - + Up to date Aktuell - + Error during synchronization Fehler bei der Synchronisierung - + There are no sync folders configured. Es wurden keine Synchronisierungsordner konfiguriert. - + No sync folders configured Keine Ordner zur Synchronisierung konfiguriert - + Checking for changes in remote "%1" Nach Änderungen in entfernten "%1" suchen - + Checking for changes in local "%1" Nach Änderungen in lokalem "%1" suchen - + Syncing %1 of %2 (%3 left) Synchronisiere %1 von %2 (%3 übrig) - + Syncing %1 of %2 Synchronisiere %1 von %2 - + Syncing %1 (%2 left) Synchronisiere %1 (%2 übrig) - + Syncing %1 Synchronisiere %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5476,27 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Neuer Ordner - + You renamed %1 Sie haben %1 umbenannt - + You deleted %1 Sie haben %1 gelöscht - + You created %1 Sie haben %1 erstellt - + You changed %1 Sie haben %1 geändert - + Synced %1 %1 synchronisiert @@ -5248,30 +5562,106 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Als gelesen markieren + + ShareDelegate + + + Create a new share link + Neuen Freigabe-Link erstellen + + + + Copy share link location + Standort des Freigabelinks kopieren + + + + Share options + Freigabeoptionen + + + + ShareDetailsPage + + + An error occurred setting the share password. + Beim Festlegen des Freigabekennworts ist ein Fehler aufgetreten. + + + + Edit share + Freigabe bearbeiten + + + + Dismiss + Ablehnen + + + + Share label + Freigabe-Label + + + + Allow editing + Bearbeitung erlauben + + + + Password protect + Passwortschutz + + + + Set expiration date + Ablaufdatum setzen + + + + Note to recipient + Notiz an Empfänger + + + + Unshare + Freigabe aufheben + + + + Add another link + Weiteren Link hinzufügen + + + + Copy share link + Freigabe-Link kopieren + + ShareView - + Password required for new share Passwort für neue Freigabe erforderlich - + Share password Freigabe-Passwort - + Sharing is disabled Teilen ist deaktiviert - + This item cannot be shared. Dieses Element kann nicht geteilt werden - + Sharing is disabled. Teilen ist deaktiviert. @@ -5287,7 +5677,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver SyncJournalDb - + Failed to connect database. Fehler beim Verbinden mit der Datenbank. @@ -5345,6 +5735,22 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Weitere Ergebnisse laden + + UnifiedSearchResultNothingFound + + + No results for + Keine Ergebnisse für + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Suchergebnisse Abschnitt %1 + + UserLine @@ -5408,67 +5814,67 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver UserStatusSelector - + Online status Online-Status - + Online Online - + Away Abwesend - + Do not disturb Nicht stören - + Mute all notifications Alle Benachrichtigungen stummschalten - + Invisible Unsichtbar - + Appear offline Offline erscheinen - + Status message Statusnachricht - + What is your status? Wie ist Ihr Status? - + Clear status message after Statusnachricht löschen nach - + Cancel Abbrechen - + Clear status message Statusnachricht löschen - + Set status message Statusnachricht setzen @@ -5552,24 +5958,24 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Window - + Nextcloud desktop main dialog Nextcloud Desktop-Hauptdialog - + Current account Aktuelles Konto - - + + Resume sync for all Synchronisierung für alle fortsetzen - - + + Pause sync for all Synchronisierung für alle pausieren @@ -5579,22 +5985,22 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Benutzerstatus setzen - + Add account Konto hinzufügen - + Add new account Neues Konto hinzufügen - + Settings Einstellungen - + Exit Beenden @@ -5603,11 +6009,6 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Current user avatar Avatar des aktuellen Benutzers - - - Current account avatar - Avatar des aktuellen Kontos - Current user status is online @@ -5619,70 +6020,75 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver Aktueller Benutzerstatus ist Nicht stören - + + Current account avatar + Avatar des aktuellen Kontos + + + Current account status is online Aktueller Kontostatus ist online - + Current account status is do not disturb Aktueller Kontostatus ist "Nicht stören" - + + %1 - File activity + %1 - Dateiaktivitäten + + + Account switcher and settings menu Konto-Umschalter und Einstellungsmenü - + Open local folder of current account Lokalen Ordner des aktuellen Kontos öffnen - + Connected Verbunden - + Disconnected Getrennt - + Open Nextcloud Talk in browser Nextcloud Talk im Browser öffnen - + More apps Weitere Apps - + Open %1 in browser %1 im Browser öffnen - + Unified search results list Einheitliche Suchergebnisliste - - - %1 - File activity - %1 - Dateiaktivitäten - main.cpp - + System Tray not available Benachrichtigungsfeld (Taskleiste) ist nicht verfügbar. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 benötigt ein funktionierendes Benachrichtigungsfeld. Falls Sie XFCE einsetzen, dann folgen Sie bitte <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">diesen Anweisungen</a>. Andernfalls installieren Sie bitte ein Benachrichtigungsfeld wie zum Beispiel "Trayer“ und versuchen es nochmal. @@ -5690,7 +6096,7 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Gebaut von der git-Revision <a href="%1">%2</a> auf %3, %4 verwendet Qt %5, %6</small></p> @@ -5724,72 +6130,77 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver + Server version downloaded, copied changed local file into case conflict conflict file + Serverversion heruntergeladen, geänderte lokale Datei in Fallkonflikt-Konfliktdatei kopiert + + + Deleted Gelöscht - + Moved to %1 Verschoben nach %1 - + Ignored Ignoriert - + Filesystem access error Zugriffsfehler im Dateisystem - + Error Fehler - + Updated local metadata Lokale Metadaten aktualisiert - + Unknown Unbekannt - + downloading Herunterladen - + uploading Lade hoch - + deleting Lösche - + moving Verschiebe - + ignoring ignoriere - + error Fehler - + updating local metadata Aktualisiere lokale Metadaten diff --git a/translations/client_el.ts b/translations/client_el.ts index 38962bc9f..89ac5d7bf 100644 --- a/translations/client_el.ts +++ b/translations/client_el.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Ανοίξτε το %1 τοπικά - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Η μετακίνηση στον κάδο δεν εφαρμόζεται σε αυτήν την πλατφόρμα - + Error removing "%1": %2 Σφάλμα αφαίρεσης «%1»: %2 - + Could not remove folder "%1" Αδυναμία αφαίρεσης φακέλου «%1» @@ -321,7 +331,7 @@ Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 204, αλλά ελήφθη "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Το ξεκλείδωμα του κρυπτογραφημένου φακέλου απέτυχε %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Άκυρο @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Φαίνεται ότι έχετε ενεργοποιημένη τη δυνατότητα εικονικών αρχείων σε αυτόν τον φάκελο. Προς το παρόν, δεν είναι δυνατή η σιωπηρή λήψη εικονικών αρχείων που είναι κρυπτογραφημένα από άκρο σε άκρο. Για να έχετε την καλύτερη εμπειρία με εικονικά αρχεία και κρυπτογράφηση από άκρο σε άκρο, βεβαιωθείτε ότι ο κρυπτογραφημένος φάκελος έχει την ένδειξη "Να είναι πάντα διαθέσιμος τοπικά". @@ -415,29 +425,29 @@ Να μην κρυπτογραφηθεί ο φάκελος - + Do not encrypt folder - + Encrypt folder Κρυπτογράφηση φακέλου - + No account configured. Δεν ρυθμίστηκε λογαριασμός. - - Display mnemonic - Εμφάνιση μνήμης + + Disable encryption + Απενεργοποίηση κρυπτογράφησης - End-to-end encryption has been enabled for this account - + Display mnemonic + Εμφάνιση μνήμης @@ -445,18 +455,23 @@ Ενεργοποίηση κρυπτογράφησης - + + End-to-end encryption has been enabled for this account + + + + Warning Προειδοποίηση - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Δεν μπορείτε να κρυπτογραφήσετε ένα φάκελο με περιεχόμενο, παρακαλούμε καταργήστε τα αρχεία. @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed Αποτυχία κρυπτογράφησης - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Άνοιγμα φακέλου - + Encrypt Κρυπτογράφηση - - + + Edit Ignored Files Έλεγχος εξαιρούμενων - - + + Create new folder Δημιουργία νέου φακέλου - - + + Availability Διαθεσιμότητα - + Choose what to sync Επιλέξτε τι θα συγχρονιστεί - + Force sync now Συγχρονισμός τώρα - + Restart sync Επανεκκίνηση συγχρονισμού - + Resume sync Συνέχιση συγχρονισμού - + Pause sync Παύση συγχρονισμού - + Remove folder sync connection Αφαίρεση συγχρονισμού φακέλου - + Disable virtual file support … Απενεργοποίηση εικονικής υποστήριξης αρχείων… - + Enable virtual file support %1 … - + (experimental) (πειραματικό) - + Folder creation failed Αποτυχία δημιουργίας φακέλου - + <p>Could not create local folder <i>%1</i>.</p> <p>Αδυναμία δημιουργίας τοπικού φακέλου <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Επιβεβαίωση αφαίρεσης συγχρονισμού - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Θέλετε πραγματικά να σταματήσετε το συγχρονισμό του φακέλου <i>%1</i>;</p><p><b>Σημείωση:</b> Αυτό <b>δεν</b> θα διαγράψει κανένα αρχείο.</p> - + Remove Folder Sync Connection Αφαίρεση συγχρονισμού - + Disable virtual file support? Απενεργοποίηση εικονικής υποστήριξης αρχείων; - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -592,7 +607,7 @@ This action will abort any currently running synchronization. - + Disable support Απενεργοποίηση υποστήριξης @@ -602,144 +617,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + Απενεργοποίηση κρυπτογράφησης από άκρο σε άκρο + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Εκτελείται Συγχρονισμός - + The syncing operation is running.<br/>Do you want to terminate it? Η λειτουργία συγχρονισμού εκτελείται.<br/> Θέλετε να την τερματίσετε; - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) από %2 σε χρήση. Μερικοί φάκελοι, συμπεριλαμβανομένων των δικτυακών ή των κοινόχρηστων μπορεί να έχουν διαφορετικά όρια. - + %1 of %2 in use %1 από %2 σε χρήση - + Currently there is no storage usage information available. Προς το παρόν δεν υπάρχουν πληροφορίες χρήσης χώρου αποθήκευσης διαθέσιμες. - + %1 in use %1 σε χρήση - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. Η έκδοση %1 του διακομιστή δεν υποστηρίζεται! Συνεχίστε με δική σας ευθύνη. - + Connected to %1. Συνδεδεμένο με %1. - + Server %1 is temporarily unavailable. Ο διακομιστής %1 δεν είναι διαθέσιμος προσωρινά. - + Server %1 is currently in maintenance mode. Ο διακομιστής %1 βρίσκεται τώρα σε κατάσταση συντήρησης. - + Signed out from %1. Αποσυνδέθηκε από %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Γίνεται λήψη της εξουσιοδότησης από το πρόγραμμα περιήγησης. Κάντε κλικ <a href='%1'>εδώ</a> για να ανοίξετε πάλι το πρόγραμμα περιήγησης. - + Connecting to %1 … Σύνδεση σε %1 '...' - + No connection to %1 at %2. Δεν υπάρχει σύνδεση με το %1 στο %2. - + Server configuration error: %1 at %2. Σφάλμα ρυθμίσεων διακομιστή: %1 σε %2. - + No %1 connection configured. Δεν έχει ρυθμιστεί σύνδεση με το %1. - + There are folders that were not synchronized because they are too big: Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι πολύ μεγάλοι: - + There are folders that were not synchronized because they are external storages: Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι εξωτερικοί αποθηκευτικοί χώροι: - + There are folders that were not synchronized because they are too big or external storages: Υπάρχουν φάκελοι που δεν συγχρονίστηκαν επειδή είναι πολύ μεγάλοι ή αποθηκευτικοί χώροι: - + Confirm Account Removal Επιβεβαίωση Αφαίρεσης Λογαριασμού - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Θέλετε πραγματικά να αφαιρέσετε τη σύνδεση με το λογαριασμό <i>%1</i>;</p><p><b>Σημείωση:</b> Αυτό <b>δεν</b> θα διαγράψει κανένα αρχείο.</p> - + Remove connection Αφαίρεση σύνδεσης - - + This account supports end-to-end encryption Ο λογαριασμός υποστηρίζει κρυπτογράφηση από άκρη σε άκρη - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -794,7 +841,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. Για εμφάνιση περισσότερων δραστηριοτήτων παρακαλώ ανοίξτε την εφαρμογή Activity. @@ -804,12 +851,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Τα αρχεία από τη λίστα παράβλεψης καθώς και οι συμβολικοί σύνδεσμοι δεν συγχρονίζονται. @@ -860,32 +907,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Η συνέχιση θα σημαίνει διαγραφή αυτών των ρυθμίσεων. - + Continuing will mean <b>ignoring these settings</b>. Η συνέχιση θα σημαίνει διαγραφή αυτών των ρυθμίσεων. - + 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>. Ορισμένες ρυθμίσεις διαμορφώθηκαν σε νεότερες εκδόσεις αυτού του πελάτη και χρησιμοποιούν λειτουργίες που δεν είναι διαθέσιμες σε αυτήν την έκδοση.<br><br>%1 <br><br>Το τρέχον αρχείο διαμόρφωσης έχει ήδη μπει σε διαδικασία δημιουργίας αντιγράφων ασφαλείας έως <i> 2%</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Έξοδος - + Continue Συνέχεια - + Error accessing the configuration file Σφάλμα πρόσβασης στο αρχείο ρυθμίσεων @@ -895,12 +969,12 @@ This action will abort any currently running synchronization. Υπήρξε σφάλμα κατά την πρόσβαση του αρχείου ρυθμίσεων στο %1. Παρακαλώ επαληθεύστε αν μπορείτε να προσπελάσετε το αρχείο. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Κλείσιμο %1 @@ -946,56 +1020,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων @@ -1013,12 +1247,12 @@ This action will abort any currently running synchronization. Παρακαλώ εισάγετε τον απο άκρη σε άκρη κρυπτογραφημένο κωδικό σας: <br><br> Χρήστης:%2<br>Λογαριασμός: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Εισάγετε κωδικό E2E @@ -1194,8 +1428,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Σφάλμα διακομιστή: Η απάντηση PROPFIND δεν έχει μορφοποίηση XML! @@ -1203,27 +1437,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Σφάλμα κατά το άνοιγμα του καταλόγου %1 - + Directory not accessible on client, permission denied Ο κατάλογος δεν είναι προσβάσιμος στον πελάτη, απορρίπτεται η άδεια - + Directory not found: %1 Ο κατάλογος δεν βρέθηκε: %1 - + Filename encoding is not valid Η κωδικοποίηση του ονόματος αρχείου δεν είναι έγκυρη - + Error while reading directory %1 Σφάλμα κατά την ανάγνωση του καταλόγου %1 @@ -1231,83 +1465,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1315,7 +1549,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Δεν ήταν δυνατή η δημιουργία μεταδεδομένων για κρυπτογράφηση, γίνετε ξεκλείδωμα του φακέλου. @@ -1445,145 +1679,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Δεν υπάρχει ο τοπικός φάκελος %1. - + %1 should be a folder but is not. Το %1 θα έπρεπε να είναι φάκελος αλλά δεν είναι. - + %1 is not readable. Το %1 δεν είναι αναγνώσιμο. - + %1 and %n other file(s) have been removed. %1 και%n άλλo αρχείo(α) έχουν καταργηθεί.%1 και%n άλλo αρχείo(α) έχουν καταργηθεί. - + %1 has been removed. %1 names a file. Το %1 αφαιρέθηκε. - + %1 and %n other file(s) have been added. Έχουν προστεθεί %1 και %n άλλα αρχείο(α).Έχουν προστεθεί %1 και %n άλλα αρχείο(α). - + %1 has been added. %1 names a file. %1 έχει προστεθεί. - + %1 and %n other file(s) have been updated. %1 και%n άλλο αρχείο(α) έχουν ενημερωθεί.%1 και%n άλλο αρχείο(α) έχουν ενημερωθεί. - + %1 has been updated. %1 names a file. Το %1 έχει ενημερωθεί. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 μετονομάστηκε σε %2 και %n άλλο αρχείο(α) έχουν μετονομαστεί.%1 μετονομάστηκε σε %2 και %n άλλο αρχείο(α) έχουν μετονομαστεί. - + %1 has been renamed to %2. %1 and %2 name files. Το %1 έχει μετονομαστεί σε %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 έχει μετακινηθεί σε %2 και %n άλλo αρχείο(α) έχουν μετακινηθεί.%1 έχει μετακινηθεί σε %2 και %n άλλo αρχείο(α) έχουν μετακινηθεί. - + %1 has been moved to %2. Το %1 έχει μετακινηθεί στο %2. - + %1 has and %n other file(s) have sync conflicts. %1 έχει και %n άλλο αρχείο(α) έχουν διένεξη συγχρονισμού.%1 έχει και %n άλλο αρχείο(α) έχουν διένεξη συγχρονισμού. - + %1 has a sync conflict. Please check the conflict file! %1 έχει μια διένεξη συγχρονισμού. Παρακαλώ ελέγξτε τη διένεξη του αρχείου! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 και %n άλλο(α) αρχείο(α) δεν μπορούν να συγχρονιστούν λόγω σφαλμάτων. Δείτε το ιστορικό για λεπτομέρειες%1 και %n άλλο αρχείο(α) δεν μπορούν να συγχρονιστούν λόγω σφαλμάτων. Δείτε το ημερολόγιο για λεπτομέρειες. - + %1 could not be synced due to an error. See the log for details. %1 δεν ήταν δυνατό να συγχρονιστεί εξαιτίας ενός σφάλματος. Δείτε το αρχείο καταγραφής για λεπτομέρειες. - + %1 and %n other file(s) are currently locked. %1 και %n άλλo αρχείo(α) έχουν κλειδωθεί.%1 και %n άλλo αρχείo(α) έχουν κλειδωθεί. - + %1 is currently locked. Το %1 είναι κλειδωμένο. - + Sync Activity Δραστηριότητα Συγχρονισμού - + Could not read system exclude file Αδυναμία ανάγνωσης αρχείου αποκλεισμού συστήματος - + A new folder larger than %1 MB has been added: %2. Προστέθηκε ένας νέος φάκελος μεγαλύτερος από %1 MB: %2 - + A folder from an external storage has been added. Προστέθηκε ένας φάκελος από εξωτερικό αποθηκευτικό χώρο. - + Please go in the settings to select it if you wish to download it. Μεταβείτε στις ρυθμίσεις για να το επιλέξετε εάν επιθυμείτε να το κατεβάσετε. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Ο φάκελος %1 που δημιουργήθηκε έχει εξαιρεθεί απο τον συγχρονισμό. Τα δεδομένα του δεν θα συγχρονιστούν. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Το αρχείο %1 που δημιουργήθηκε έχει εξαιρεθεί απο τον συγχρονισμό. Δεν θα συγχρονιστή. - + 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). @@ -1594,7 +1828,7 @@ This means that the synchronization client might not upload local changes immedi Αυτό σημαίνει ότι η εφαρμογή δεν θα ανεβάσει τις τοπικές αλλαγές άμεσα, θα ελέγξει μόνο τις τοπικές αλλαγές και θα τις ανεβάσει περιοδικά (κάθε δύο ώρες από προεπιλογή). - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1605,7 +1839,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a Εφόσον επιλέξετε να διαγράψετε τα αρχεία, δε θα είναι διαθέσιμα σε εσάς, εκτός εάν είστε ο κάτοχος. - + 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. @@ -1614,17 +1848,17 @@ If this was an accident and you decide to keep your files, they will be re-synce Εάν έγινε λάθος και αποφασίσετε να διατηρήσετε τα αρχεία σας, θα συγχρονιστούν ξανά από το διακομιστή. - + Remove All Files? Κατάργηση όλων των αρχείων; - + Remove all files Κατάργηση όλων των αρχείων. - + Keep files Κράτησε τα αρχεία @@ -1660,22 +1894,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Δεν ήταν δυνατό να επαναφερθεί η κατάσταση του φακέλου - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Βρέθηκε ένα παλαιότερο αρχείο συγχρονισμού "%1", αλλά δεν μπόρεσε να αφαιρεθεί. Παρακαλούμε βεβαιωθείτε ότι καμία εφαρμογή δεν το χρησιμοποιεί αυτή τη στιγμή. - + (backup) (αντίγραφο ασφαλείας) - + (backup %1) (αντίγραοφ ασφαλέιας %1) @@ -1685,27 +1919,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Απροσδιόριστη Κατάσταση. - + Undefined state. - + Waiting to start syncing. Αναμονή έναρξης συγχρονισμού. - + Preparing for sync. Προετοιμασία για συγχρονισμό. - + Sync is running. Ο συγχρονισμός εκτελείται. - + Sync finished with unresolved conflicts. @@ -1725,62 +1959,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Ματαίωση από Χρήστη. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Παύση συγχρονισμού. - + %1 (Sync is paused) %1 (Παύση συγχρονισμού) - + No valid folder selected! Δεν επιλέχθηκε έγκυρος φάκελος! - + The selected path does not exist! Η επιλεγμένη διαδρομή δεν υπάρχει! - + The selected path is not a folder! Η επιλεγμένη διαδρομή δεν είναι φάκελος! - + You have no permission to write to the selected folder! Δεν έχετε δικαιώματα εγγραφής στον επιλεγμένο φάκελο! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Ο τοπικός φάκελος %1 περιέχει ήδη ένα φάκελο που χρησιμοποιείται σε μια σύνδεση συγχρονισμού φακέλου. Παρακαλώ επιλέξτε άλλον! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Ο τοπικός φάκελος %1 περιέχεται ήδη σε φάκελο που χρησιμοποιείται σε μια σύνδεση συγχρονισμού. Παρακαλώ επιλέξτε άλλον! - + There is already a sync from the server to this local folder. Please pick another local folder! Υπάρχει ήδη συγχρονισμός από το διακομιστή σε αυτόν τον τοπικό φάκελο. Επιλέξτε έναν άλλο τοπικό φάκελο! @@ -1793,7 +2027,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Προσθήκη σύνδεσης συγχρονισμού φακέλου - + File Αρχείο @@ -1801,152 +2035,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Πρέπει να έχετε συνδεθεί για να προσθέσετε φάκελο - + Click this button to add a folder to synchronize. Κάντε κλικ σε αυτό το κουμπί για να προσθέσετε ένα φάκελο προς συγχρονισμό. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Σφάλμα κατά τη φόρτωση της λίστας φακέλων από το διακομιστή. - + Fetching folder list from server … Λήψη λίστας φακέλων διακομιστή '...' - + There are unresolved conflicts. Click for details. Υπάρχουν μη επιλύσιμες συγκρούσεις. Πατήστε εδώ για λεπτομέρειες. - + Virtual file support is enabled. Η εικονική υποστήριξη αρχείων είναι ενεργοποιημένη. - + Signed out Αποσύνδεση - + Synchronizing VirtualFiles with local folder Συγχρονισμός των VirtualFiles με τον τοπικό φάκελο. - + Synchronizing with local folder Συγχρονισμός με τον τοπικό φάκελο. - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Συνδυασμός αλλαγών - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Συγχρονισμός %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) λήψη %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) μεταφόρτωση %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 από %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Απομένει %5, %1 από %2, αρχείο %3 από %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 από %2, αρχείο %3 από %4 - + file %1 of %2 αρχείο %1 από %2 - + Waiting … Αναμονή ΄...' - + Waiting for %n other folder(s) … Αναμονή για %n φακέλου(ς)Αναμονή για %n φακέλου(ς) - + Preparing to sync … Προετοιμασία για συγχρονισμό '...' @@ -2177,13 +2415,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable σταθερός - + beta έκδοση beta @@ -2235,32 +2473,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Δημιουργία αρχείου εντοπισμού σφαλμάτων. - + Server notifications that require attention. Ειδοποιήσεις από τον διακομιστή που απαιτούν την προσοχή σας. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. Δεν μπορείτε να απενεργοποιήσετε την αυτόματη εκκίνηση επειδή είναι ενεργοποιημένη η αυτόματη εκκίνηση σε όλο το σύστημα. - + Change update channel? Αλλαγή καναλιού ενημέρωσης; - + 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. 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. @@ -2268,27 +2506,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Λάβετε υπόψη ότι αυτό επιλέγει μόνο από τη δεξαμενήαπό την οποία προέρχονται οι αναβαθμίσεις της ομάδας και ότι δεν υπάρχουν υποβαθμίσεις: Επομένως, η επιστροφή από το κανάλι beta στο σταθερό κανάλι συνήθως δεν μπορεί να γίνει αμέσως και σημαίνει αναμονή για μια σταθερή έκδοση που είναι νεότερη από την τρέχουσα εγκατεστημένη έκδοση beta. - + Change update channel Αλλαγή καναλιού ενημέρωσης. - + Cancel Ακύρωση - + Zip Archives Αρχεία zip. - + Debug Archive Created Δημιουργήθηκε αρείο εντοπισμού σφαλμάτων. - + Debug archive is created at %1 Το αρχείο εντοπισμού σφαλμάτων δημιουργείται στο % 1. @@ -2296,22 +2534,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Απαιτείται κωδικός πρόσβασης για το κοινόχρηστο - + Please enter a password for your link share: Παρακαλώ εισάγετε κωδικό πρόσβασης για το κοινόχρηστο σύνδεσμο: - + Sharing error Σφάλμα διαμοιρασμού - + Could not retrieve or create the public link share. Error: %1 @@ -2549,6 +2787,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Κλείσιμο + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2882,60 +3125,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (πειραματικό) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" Συγχρονισμός του φακέλου «%1» - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 ελεύθερος χώρος - + Virtual files are not available for the selected folder Τα εικονικά αρχεία δεν είναι διαθέσιμα για τον επιλεγμένο φάκελο. - + Local Sync Folder Τοπικός Φάκελος Συγχρονισμού - - + + (%1) (%1) - + There isn't enough free space in the local folder! Δεν υπάρχει αρκετός ελεύθερος χώρος στον τοπικό φάκελο! @@ -3007,7 +3250,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3039,144 +3283,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Επιτυχής σύνδεση στο %1: %2 έκδοση %3 (%4)</font><br/><br/> - + Invalid URL Μη έγκυρη URL - + Failed to connect to %1 at %2:<br/>%3 Αποτυχία σύνδεσης με το %1 στο %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Λήξη χρονικού ορίου κατά τη σύνδεση σε %1 σε %2. - + Trying to connect to %1 at %2 … Προσπάθεια σύνδεσης στο %1 για %2 '...' - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Απαγόρευση πρόσβασης από τον διακομιστή. Για να επιβεβαιώσετε ότι έχετε δικαιώματα πρόσβασης, <a href="%1">πατήστε εδώ</a> για να προσπελάσετε την υπηρεσία με το πρόγραμμα πλοήγησής σας. - + There was an invalid response to an authenticated WebDAV request Υπήρξε μη έγκυρη απάντηση σε πιστοποιημένη αίτηση WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Ο τοπικός φάκελος συγχρονισμού %1 υπάρχει ήδη, ρύθμιση για συγχρονισμό.<br/><br/> - + Creating local sync folder %1 … Δημιουργία τοπικού φακέλου συγχρονισμού %1 '...' - + OK Εντάξει - + failed. απέτυχε. - + Could not create local folder %1 Αδυναμία δημιουργίας τοπικού φακέλου %1 - + No remote folder specified! Δεν προσδιορίστηκε κανένας απομακρυσμένος φάκελος! - + Error: %1 Σφάλμα: %1 - + creating folder on Nextcloud: %1 δημιουργία φακέλου στο Nextcloud: %1 - + Remote folder %1 created successfully. Ο απομακρυσμένος φάκελος %1 δημιουργήθηκε με επιτυχία. - + The remote folder %1 already exists. Connecting it for syncing. Ο απομακρυσμένος φάκελος %1 υπάρχει ήδη. Θα συνδεθεί για συγχρονισμό. - - + + The folder creation resulted in HTTP error code %1 Η δημιουργία φακέλου είχε ως αποτέλεσμα τον κωδικό σφάλματος HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Η δημιουργία απομακρυσμένου φακέλλου απέτυχε επειδή τα διαπιστευτήρια είναι λάθος!<br/>Παρακαλώ επιστρέψετε και ελέγξετε τα διαπιστευτήριά σας.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Η δημιουργία απομακρυσμένου φακέλου απέτυχε, πιθανώς επειδή τα διαπιστευτήρια που δόθηκαν είναι λάθος.</font><br/>Παρακαλώ επιστρέψτε πίσω και ελέγξτε τα διαπιστευτήρια σας.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Η δημιουργία απομακρυσμένου φακέλου %1 απέτυχε με σφάλμα <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Μια σύνδεση συγχρονισμού από τον απομακρυσμένο κατάλογο %1 σε %2 έχει ρυθμιστεί. - + Successfully connected to %1! Επιτυχής σύνδεση με %1! - + Connection to %1 could not be established. Please check again. Αδυναμία σύνδεσης στον %1. Παρακαλώ ελέξτε ξανά. - + Folder rename failed Αποτυχία μετονομασίας φακέλου - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Επιτυχής δημιουργία τοπικού φακέλου %1 για συγχρονισμό!</b></font> @@ -3199,12 +3443,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? Ενεργοποίηση πειραματικής λειτουργίας; - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3215,12 +3459,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Όταν είναι ενεργοποιημένη η λειτουργία "εικονικά αρχεία", κανένα αρχείο δε θα ληφθεί αρχικά. Αντ 'αυτού, θα δημιουργηθεί ένα μικρό "% 1" αρχείο για κάθε αρχείο που υπάρχει στο διακομιστή. Μπορείτε να κατεβάσετε τα περιεχόμενα εκτελώντας αυτά τα αρχεία ή χρησιμοποιώντας το μενού περιβάλλοντος. Η λειτουργία εικονικών αρχείων είναι αμοιβαία αποκλειστική με επιλεκτικό συγχρονισμό. Πρόσφατα μη επιλεγμένοι φάκελοι θα μεταφράζονται σε μόνο- διαδικτυακούς φακέλους και οι επιλεγμένες ρυθμίσει συγχρονισμού θα επαναφέρονται. Η μετάβαση σε αυτήν τη λειτουργία θα ακυρώσει οποιονδήποτε τρέχοντα συγχρονισμό. Πρόκειται για μια νέα, πειραματική λειτουργία. Εάν αποφασίσετε να τη χρησιμοποιήσετε, παρακαλώ όπως αναφέρετε τυχόν προβλήματα που προκύψουν. - + Enable experimental placeholder mode Ενεργοποίηση πειραματικής λειτουργίας κράτησης θέσης. - + Stay safe Μείνετε ασφαλής. @@ -3249,162 +3493,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Οι συμβολικοί σύνδεσμοι δεν υποστηρίζονται κατά το συγχρονισμό. - + File is listed on the ignore list. Το αρχείο παρατίθεται στη λίστα προς αγνόηση. - + File names ending with a period are not supported on this file system. Τα ονόματα αρχείων που τελειώνουν με τελεία δεν υποστηρίζονται σε αυτό το σύστημα αρχείων. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character Το όνομα αρχείου περιέχει τουλάχιστον έναν μη έγκυρο χαρακτήρα. - + The file name is a reserved name on this file system. Το όνομα αρχείου είναι ένα δεσμευμένο όνομα σε αυτό το σύστημα αρχείων. - + Filename contains trailing spaces. Το όνομα αρχείου περιέχει κενά διαστήματα. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Το όνομα αρχείου είναι πολύ μακρύ. - + File/Folder is ignored because it's hidden. Το αρχείο / φάκελος αγνοείται επειδή είναι κρυμμένο. - + Stat failed. Το Stat απέτυχε. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Διένεξη: Λήψη έκδοσης διακομιστή, μετονομασία τοπικού αντιγράφου και μη μεταφόρτωση. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Το όνομα αρχείου δεν μπορεί να κωδικοποιηθεί στο σύστημα αρχείων σας. - + The filename is blacklisted on the server. Το όνομα αρχείου είναι στη μαύρη λίστα στον διακομιστή. - + File has extension reserved for virtual files. Το αρχείο έχει επέκταση που προορίζεται για εικονικά αρχεία. - + size μέγεθος - + permission - + file id αναγνωριστκό αρχείου (id) - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist Αγνοήθηκε λόγω της μαύρης λίστας "επιλέξτε τι να συγχρονίσετε". - + Not allowed because you don't have permission to add subfolders to that folder Δεν επιτρέπεται επειδή δεν έχετε άδεια να προσθέσετε υποφακέλους σε αυτόν το φάκελο. - + Not allowed because you don't have permission to add files in that folder Δεν επιτρέπεται επειδή δεν έχετε άδεια να προσθέσετε φακέλους σε αυτόν το φάκελο. - + Not allowed to upload this file because it is read-only on the server, restoring Δεν επιτρέπεται η μεταφόρτωση αυτού του αρχείου επειδή είναι μόνο για ανάγνωση στον διακομιστή, γίνεται επαναφορά. - + Moved to invalid target, restoring Μετακινήθηκε σε μη έγκυρο στόχο, επαναφορά. - + Not allowed to remove, restoring Δεν επιτρέπεται η κατάργηση, επαναφορά. - + Error while reading the database Σφάλμα κατά την ανάγνωση της βάσης δεδομένων. - + Server replied with an error while reading directory "%1" : %2 @@ -3412,22 +3661,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use Το αρχείο χρησιμοποιείται αυτήν τη στιγμή @@ -3440,19 +3689,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Το αρχείο έχει αλλάξει από όταν ανακαλύφθηκε - + Could not delete file record %1 from local DB @@ -3463,32 +3712,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Το αρχείο %1 δεν είναι δυνατό να ληφθεί λόγω διένεξης με το όνομα ενός τοπικού αρχείου! - + The download would reduce free local disk space below the limit Η λήψη θα μειώση τον ελεύθερο τοπικό χώρο αποθήκευσης κάτω από το όριο. - + Free space on disk is less than %1 Ο διαθέσιμος χώρος στο δίσκο είναι λιγότερος από %1 - + File was deleted from server Το αρχείο διαγράφηκε από τον διακομιστή - + The file could not be downloaded completely. Η λήψη του αρχείου δεν ολοκληρώθηκε. - + The downloaded file is empty, but the server said it should have been %1. @@ -3498,18 +3747,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Το αρχείο %1 δεν είναι δυνατό να αποθηκευτεί λόγω διένεξης με το όνομα ενός τοπικού ονόματος αρχείου! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use Το αρχείο %1 χρησιμοποιείται αυτήν τη στιγμή @@ -3530,7 +3784,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 αδυναμία διαγραφής αρχείου %1, σφάλμα: %2 @@ -3541,16 +3795,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Αδυναμία δημιουργίας φακέλου: %1 - + Error updating metadata: %1 Σφάλμα ενημέρωσης μεταδεδομένων: %1 - + The file %1 is currently in use Το αρχείο %1 χρησιμοποιείται αυτήν τη στιγμή @@ -3558,7 +3817,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Δεν ήταν δυνατή η αφαίρεση του %1 λόγω διένεξης με το όνομα ενός τοπικού αρχείου @@ -3571,46 +3830,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Σφάλμα ρύθμισης της κατάστασης pin - - + + Error updating metadata: %1 Σφάλμα ενημέρωσης μεταδεδομένων: %1 - + The file %1 is currently in use Το αρχείο %1 χρησιμοποιείται αυτήν τη στιγμή - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Αποτυχία μετονομασίας αρχείου @@ -3631,7 +3895,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 204, αλλά ελήφθη "%1 %2". @@ -3644,12 +3908,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 201, αλλά ελήφθη "%1 %2". - + Error writing metadata to the database: %1 Σφάλμα εγγραφής μεταδεδομένων στη βάση δεδομένων: %1 - + The file %1 is currently in use Το αρχείο %1 χρησιμοποιείται αυτήν τη στιγμή @@ -3657,42 +3921,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Δεν ήταν δυνατή η μετονομασία % 1 σε %2, σφάλμα: %3. - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Ο διακομιστής επέστρεψε εσφαλμένο κωδικό HTTP. Αναμενόταν 201, αλλά ελήφθη "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Σφάλμα ενημέρωσης μεταδεδομένων: %1 - + The file %1 is currently in use Το αρχείο %1 χρησιμοποιείται αυτήν τη στιγμή - + Error setting pin state Σφάλμα ρύθμισης της κατάστασης pin - + Error writing metadata to the database Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων @@ -3702,7 +3966,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Failed to upload encrypted file. - + Η μεταμόρφωση του κρυπτογραφημένου αρχείου απέτυχε. @@ -3882,7 +4146,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3900,23 +4164,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ρυθμίσεις - + %1 Settings This name refers to the application name e.g Nextcloud %1 Ρυθμίσεις - + General Γενικά - + Network Δίκτυο - + Account Λογαριασμός @@ -3924,17 +4188,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4010,7 +4279,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4019,132 +4288,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Διαμοιρασμός καταλόγου μενού - + Select new location … Επιλέξτε νέα τοποθεσία… - + I shared something with you Μοιράστηκα κάτι μαζί σου - - + + Share options Επιλογές κοινής χρήσης - - + + Activity - + Copy private link to clipboard Αντιγραφή ιδιωτικού συνδέσμου στο πρόχειρο - + Send private link by email … Αποστολή ιδιωτικού συνδέσμου με αλληλογραφία... + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Δεν επιτρέπεται ο επαναδιαμοιρασμός - + Resharing this folder is not allowed Δεν επιτρέπεται η αναδημοσίευση αυτού του φακέλου. - - + + Copy public link Αντιγραφή δημόσιου συνδέσμου - + Copy internal link Αντιγραφή εσωτερικού συνδέσμου - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Επεξεργασία - + Open in browser Άνοιγμα στον περιηγητή - + Resolve conflict … Επίλυση διένεξης… - + Move and rename … Μετακίνηση και μετονομασία... - + Move, rename and upload … Μετακίνηση, μετονομασία και μεταφόρτωση ... - + Delete local changes Διαγραφή τοπικών αλλαγών - + Move and upload … Μετακίνηση και μεταφόρτωση ... - + Delete Διαγραφή @@ -4362,63 +4668,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (παράλειψη λόγω προηγούμενου λάθους, επόμενη προσπάθεια σε %2) - + Could not update file: %1 Αδυναμία ενημέρωσης αρχείου: %1. - + Could not update virtual file metadata: %1 Δεν ήταν δυνατή η ενημέρωση των εικονικών μεταδεδομένων αρχείων: %1. - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Άλυτες διενέξεις - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Μόνο %1 είναι διαθέσιμα, απαιτούνται τουλάχιστον %2 για την εκκίνηση - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Ανικανότητα στο άνοιγμα ή στη δημιουργία της τοπικής βάσης δεδομένων. Εξετάστε αν έχετε δικαιώματα εγγραφής στο φάκελο συγχρονισμού. - + Using virtual files with suffix, but suffix is not set Χρήση εικονικών αρχείων με κατάληξη, αλλά η κατάληξη δεν έχει οριστεί. - + Unable to read the blacklist from the local database Αδυναμία ανάγνωσης της μαύρης λίστας από την τοπική βάση δεδομένων - + Unable to read from the sync journal. Αδυναμία ανάγνωσης από το ημερολόγιο συγχρονισμού. - + Cannot open the sync journal Αδυναμία ανοίγματος του αρχείου συγχρονισμού @@ -4428,12 +4734,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Ο χώρος δίσκου είναι χαμηλός: Οι λήψεις που θα μειώσουν τον ελέυθερο χώρο κάτω από %1 θα αγνοηθούν. - + There is insufficient space available on the server for some uploads. Μη αρκετός διαθέσιμος χώρος στον διακομιστή για μερικές μεταφορτώσεις. @@ -4502,59 +4808,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Προσθήκη λογαριασμού - + Open main dialog Άνοιγμα κύριου διαλόγου - - + + Pause sync Παύση συγχρονισμού - - + + Resume sync Συνέχιση συγχρονισμού - + Settings Ρυθμίσεις - + Help - + Exit %1 Έξοδος %1 - + Pause sync for all Παύση συγχρονισμού για όλους - + Resume sync for all Συνέχιση συγχρονισμού για όλους - + %1: %2 %1: %2 @@ -4562,24 +4868,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Εφαρμογή Υπολογιστή %1 </p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Έκδοση %1. Για περισσότερες πληροφορίες δείτε <a href='%2'>εδώ</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Η έκδοση παρέχεται από %1</p> @@ -4587,22 +4893,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4610,30 +4916,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Επανάληψη όλων των μεταφορτώσεων + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Επιβεβαίωση Αφαίρεσης Λογαριασμού - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Θέλετε πραγματικά να αφαιρέσετε τη σύνδεση με το λογαριασμό <i>%1</i>;</p><p><b>Σημείωση:</b> Αυτό <b>δεν</b> θα διαγράψει κανένα αρχείο.</p> - + Remove connection Αφαίρεση σύνδεσης - + Cancel Ακύρωση @@ -4771,8 +5083,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4780,8 +5092,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4879,123 +5191,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Μη υποστηριζόμενη έκδοση διακομιστή - + 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. Ο διακομιστής στο λογαριασμό %1 εκτελεί μια μη υποστηριζόμενη έκδοση % 2. Η χρήση αυτού του προγράμματος-πελάτη με μη υποστηριζόμενες εκδόσεις διακομιστή δεν έχει δοκιμαστεί και είναι δυνητικά επικίνδυνη. Προχωρήστε με δική σας ευθύνη. - + Disconnected Αποσυνδεδεμένο - + Disconnected from some accounts Έγινε αποσύνδεση από μερικούς λογαριασμούς - + Disconnected from %1 Αποσυνδέθηκε από %1 - + Disconnected from accounts: Αποσυνδέθηκε από τους λογαριασμούς: - + Account %1: %2 Λογαριασμός %1: %2 - + Please sign in Παρκαλώ συνδεθείτε - + Signed out Αποσύνδεση - + Account synchronization is disabled Ο λογαριασμός συγχρονισμού έχει απενεργοποιηθεί - - + + Synchronization is paused Παύθηκε ο συγχρονισμός - + Folder %1: %2 Φάκελος %1: %2 - + Unresolved conflicts Άλυτες διενέξεις - + Up to date Ενημερωμένο - + Error during synchronization Σφάλμα κατά τον συγχρονισμό - + There are no sync folders configured. Δεν έχουν ρυθμιστεί φάκελοι συγχρονισμού. - + No sync folders configured Δεν ρυθμίστηκαν φάκελοι συγχρονισμού - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Συγχρονισμός %1 από %2 (%3 απομένουν) - + Syncing %1 of %2 Συγχρονισμός %1 από %2 - + Syncing %1 (%2 left) Συγχρονισμός %1 (%2 απομένουν) - + Syncing %1 Συγχρονισμός %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5147,27 +5459,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Νέος φάκελος - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5233,30 +5545,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5272,7 +5660,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Αποτυχία σύνδεσης με βάση δεδομένων. @@ -5330,6 +5718,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + Δεν υπάρχουν αποτελέσματα για + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5393,67 +5797,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Κατάσταση σε σύνδεση - + Online Σε σύνδεση - + Away - + Do not disturb Μην ενοχλείτε - + Mute all notifications - + Invisible Αόρατος - + Appear offline - + Status message Μήνυμα κατάστασης - + What is your status? Ποια είναι η κατάστασή σας; - + Clear status message after Εκκαθάριση μηνύματος κατάστασης μετά από - + Cancel - + Clear status message Εκκαθάριση μηνύματος κατάστασης - + Set status message Ορισμός μηνύματος κατάστασης @@ -5537,24 +5941,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Κύριος διάλογος της επιφάνειας εργασίας Nextcloud. - + Current account Τρέχον λογαριασμός - - + + Resume sync for all Συνέχιση όλων των συγχρονισμών - - + + Pause sync for all Παύση όλων των συγχρονισμών @@ -5564,22 +5968,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ορισμός κατάστασης χρήστη - + Add account Προσθήκη λογαριασμού - + Add new account Προσθήκη νέου λογαριασμού - + Settings Ρυθμίσεις - + Exit Έξοδος @@ -5588,11 +5992,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Τρέχων avatar χρήστη - - - Current account avatar - - Current user status is online @@ -5604,70 +6003,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Η τρέχουσα κατάσταση χρήστη είναι μην ενοχλείτε - + + Current account avatar + Άβαταρ τρέχοντος λογαριασμού + + + Current account status is online - + Current account status is do not disturb Η τρέχουσα κατάσταση λογαριασμού είναι μην ενοχλείτε - + + %1 - File activity + + + + Account switcher and settings menu Μενού εναλλαγής λογαριασμού και ρυθμίσεων. - + Open local folder of current account Άνοιγμα τοπικού φακέλου του τρέχων λογαριασμού - + Connected Συνδεδεμένο - + Disconnected Αποσυνδεδεμένο - + Open Nextcloud Talk in browser Άνοιγμα του Nextcloud Talk με το πρόγραμμα περιήγησης. - + More apps Περισσότερες εφαρμογές - + Open %1 in browser Άνοιγμα %1 στον περιηγητή - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Μπάρα Συστήματος μη-διαθέσιμη - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5675,7 +6079,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Δημιουργήθηκε από την διασκευή Git <a href="%1">%2</a> στο %3, %4 χρησιμοποιώντας Qt %5, %6</small></p> @@ -5709,72 +6113,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Διεγράφη - + Moved to %1 Μετακινήθηκαν στο %1 - + Ignored Αγνοήθηκε - + Filesystem access error Σφάλμα πρόσβασης στο σύστημα αρχείων - + Error Σφάλμα - + Updated local metadata Ενημερωμένα τοπικά μεταδεδομένα - + Unknown Άγνωστο - + downloading λήψη - + uploading μεταφόρτωση - + deleting διαγραφή - + moving μετακίνηση - + ignoring αγνοείται - + error σφάλμα - + updating local metadata γίνεται ενημέρωση μεταδεδομένων diff --git a/translations/client_en_GB.ts b/translations/client_en_GB.ts index 1553d5a07..9c1d0b707 100644 --- a/translations/client_en_GB.ts +++ b/translations/client_en_GB.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Open %1 locally - + In %1 In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostrar mais ações @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Dismiss + + + Open file details + Open file details + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Dismiss + + + Activity Activity - + Sharing Sharing @@ -226,12 +236,12 @@ Moving to the trash is not implemented on this platform - + Error removing "%1": %2 Error removing "%1": %2 - + Could not remove folder "%1" Could not remove folder "%1" @@ -321,7 +331,7 @@ Wrong HTTP code returned by server. Expected 204, but received "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancel @@ -400,12 +410,12 @@ You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are End-to-End encrypted. To get the best experience with Virtual Files and End-to-End Encryption, make sure the encrypted folder is marked with "Make always available locally". - + End-to-end Encryption with Virtual Files End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Don't encrypt folder - + Do not encrypt folder Do not encrypt folder - + Encrypt folder Encrypt folder - + No account configured. No account configured. - - Display mnemonic - Display mnemonic + + Disable encryption + Disable encryption - End-to-end encryption has been enabled for this account - End-to-end encryption has been enabled for this account + Display mnemonic + Display mnemonic @@ -445,19 +455,24 @@ Enable encryption - + + End-to-end encryption has been enabled for this account + End-to-end encryption has been enabled for this account + + + Warning Warning - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. You cannot encrypt a folder with contents, please remove the files. @@ -470,121 +485,121 @@ Wait for the new sync, then encrypt it. This account supports End-to-End encryption - + Encryption failed Encryption failed - + Could not encrypt folder because the folder does not exist anymore Could not encrypt folder because the folder does not exist anymore - - + + Open folder Open folder - + Encrypt Encrypt - - + + Edit Ignored Files Edit Ignored Files - - + + Create new folder Create new folder - - + + Availability Availability - + Choose what to sync Choose what to sync - + Force sync now Force sync now - + Restart sync Restart sync - + Resume sync Resume sync - + Pause sync Pause sync - + Remove folder sync connection Remove folder sync connection - + Disable virtual file support … Disable virtual file support … - + Enable virtual file support %1 … Enable virtual file support %1 … - + (experimental) (experimental) - + Folder creation failed Folder creation failed - + <p>Could not create local folder <i>%1</i>.</p> <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirm Folder Sync Connection Removal - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove Folder Sync Connection Remove Folder Sync Connection - + Disable virtual file support? Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ The only advantage of disabling virtual file support is that the selective sync This action will abort any currently running synchronization. - + Disable support Disable support @@ -607,145 +622,177 @@ This action will abort any currently running synchronization. End-to-End encryption mnemonic - + End-to-end encryption mnemonic End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + Disable end-to-end encryption + + + + Disable end-to-end encryption for %1? + Disable end-to-end encryption for %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + Sync Running Sync Running - + The syncing operation is running.<br/>Do you want to terminate it? The syncing operation is running.<br/>Do you want to terminate it? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use %1 of %2 in use - + Currently there is no storage usage information available. Currently there is no storage usage information available. - + %1 in use %1 in use - + %1 as %2 %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Connected to %1. - + Server %1 is temporarily unavailable. Server %1 is temporarily unavailable. - + Server %1 is currently in maintenance mode. Server %1 is currently in maintenance mode. - + Signed out from %1. Signed out from %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obtaining authorisation from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1 … Connecting to %1 … - + No connection to %1 at %2. No connection to %1 at %2. - + Server configuration error: %1 at %2. Server configuration error: %1 at %2. - + No %1 connection configured. No %1 connection configured. - + There are folders that were not synchronized because they are too big: There are folders that were not synchronised because they are too big: - + There are folders that were not synchronized because they are external storages: There are folders that were not synchronised because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: There are folders that were not synchronised because they are too big or external storages: - + Confirm Account Removal Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Remove connection - - + This account supports end-to-end encryption This account supports end-to-end encryption - + Set up encryption Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - End-to-end encryption has been enabled for this account on another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + There was an invalid response to an authenticated WebDAV request + There was an invalid response to an authenticated WebDAV request @@ -799,7 +846,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. For more activities please open the Activity app. @@ -809,12 +856,12 @@ This action will abort any currently running synchronization. Fetching activities… - + Fetching activities … Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Files from the ignore list as well as symbolic links are not synced. @@ -865,32 +912,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. Continuing will mean <b>ignoring these settings</b>. - + 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>. 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Quit - + Continue Continue - + Error accessing the configuration file Error accessing the configuration file @@ -900,12 +974,12 @@ This action will abort any currently running synchronization. There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your user. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Quit %1 @@ -951,56 +1025,216 @@ This action will abort any currently running synchronization. File %1 has invalid modified time. Do not upload to the server. - + File Removed (start upload) %1 File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. Local file changed during sync. - + Network error: %1 Network error: %1 - + Error updating metadata: %1 Error updating metadata: %1 - + The file %1 is currently in use The file %1 is currently in use - + The local file was removed during sync. The local file was removed during sync. - + Restoration failed: %1 Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Cannot rename file because a file with the same name already exists on the server. Please pick another name. + + + + Could not rename file. Please make sure you are connected to the server. + Could not rename file. Please make sure you are connected to the server. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + Failed to fetch permissions with error %1 + Failed to fetch permissions with error %1 + + + + Filename contains leading and trailing spaces. + Filename contains leading and trailing spaces. + + + + Filename contains leading spaces. + Filename contains leading spaces. + + + + Filename contains trailing spaces. + Filename contains trailing spaces. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Case Clash Conflict + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + Error + Error + + + + Existing file + Existing file + + + + file A + file A + + + + fileA + fileA + + + + + today + today + + + + + 0 byte + 0 byte + + + + + Open existing file + Open existing file + + + + Case clashing file + Case clashing file + + + + file B + file B + + + + fileB + fileB + + + + + Open clashing file + Open clashing file + + + + Please enter a new name for the clashing file: + Please enter a new name for the clashing file: + + + + New filename + New filename + + + + Rename file + Rename file + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + %1 does not support equal file names with only letter casing differences. + %1 does not support equal file names with only letter casing differences. + + + + Filename contains leading and trailing spaces. + Filename contains leading and trailing spaces. + + + + Filename contains leading spaces. + Filename contains leading spaces. + + + + Filename contains trailing spaces. + Filename contains trailing spaces. + + + + Use invalid name + Use invalid name + + + + Filename contains illegal characters: %1 + Filename contains illegal characters: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Error writing metadata to the database @@ -1018,12 +1252,12 @@ This action will abort any currently running synchronization. Please enter your end to end encryption passphrase:<br><br>User: %2<br>Account: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Enter E2E passphrase @@ -1199,8 +1433,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Server error: PROPFIND reply is not XML formatted! @@ -1208,27 +1442,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Error while opening directory %1 - + Directory not accessible on client, permission denied Directory not accessible on client, permission denied - + Directory not found: %1 Directory not found: %1 - + Filename encoding is not valid Filename encoding is not valid - + Error while reading directory %1 Error while reading directory %1 @@ -1236,91 +1470,91 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. Invalid token received. - - - - - - + + + + + + Please try again. Please try again. - + Invalid file path was provided. Invalid file path was provided. - + Could not find an account for local editing. Could not find an account for local editing. - - + + Could not validate the request to open a file from server. Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + Could not open %1 - + File %1 already locked. - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 now locked. - + File %1 could not be locked. - + File %1 could not be locked. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Could not generate the metadata for encryption, Unlocking the folder. @@ -1450,145 +1684,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Local folder %1 does not exist. - + %1 should be a folder but is not. %1 should be a folder but is not. - + %1 is not readable. %1 is not readable. - + %1 and %n other file(s) have been removed. %1 and %n other file have been removed.%1 and %n other files have been removed. - + %1 has been removed. %1 names a file. %1 has been removed. - + %1 and %n other file(s) have been added. %1 and %n other file(s) have been added.%1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. %1 has been added. - + %1 and %n other file(s) have been updated. %1 and %n other file have been updated.%1 and %n other files have been updated. - + %1 has been updated. %1 names a file. %1 has been updated. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 has been renamed to %2 and %n other file have been renamed.%1 has been renamed to %2 and %n other files have been renamed. - + %1 has been renamed to %2. %1 and %2 name files. %1 has been renamed to %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 has been moved to %2 and %n other file have been moved.%1 has been moved to %2 and %n other files have been moved. - + %1 has been moved to %2. %1 has been moved to %2. - + %1 has and %n other file(s) have sync conflicts. %1 has and %n other file have sync conflicts.%1 has and %n other files have sync conflicts. - + %1 has a sync conflict. Please check the conflict file! %1 has a sync conflict. Please check the conflict file! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 and %n other file could not be synced due to errors. See the log for details.%1 and %n other files could not be synced due to errors. See the log for details. - + %1 could not be synced due to an error. See the log for details. %1 could not be synced due to an error. See the log for details. - + %1 and %n other file(s) are currently locked. %1 and %n other file(s) are currently locked.%1 and %n other file(s) are currently locked. - + %1 is currently locked. %1 is currently locked. - + Sync Activity Sync Activity - + Could not read system exclude file Could not read system exclude file - + A new folder larger than %1 MB has been added: %2. A new folder larger than %1 MB has been added: %2. - + A folder from an external storage has been added. A folder from an external storage has been added. - + Please go in the settings to select it if you wish to download it. Please go in the settings to select it if you wish to download it. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1601,7 +1835,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ If you decide to restore the files, they will be re-synced with the server if yo If you decide to delete the files, they will be unavailable to you, unless you are the owner. - + 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. @@ -1621,17 +1855,17 @@ 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. - + Remove All Files? Remove All Files? - + Remove all files Remove all files - + Keep files Keep files @@ -1667,22 +1901,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Could not reset folder state - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1692,27 +1926,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Undefined State. - + Undefined state. Undefined state. - + Waiting to start syncing. Waiting to start syncing. - + Preparing for sync. Preparing for sync. - + Sync is running. Sync is running. - + Sync finished with unresolved conflicts. Sync finished with unresolved conflicts. @@ -1732,62 +1966,62 @@ If this was an accident and you decide to keep your files, they will be re-synce User Abort. - + Last sync was successful. Last sync was successful. - + Setup error. Setup error. - + Sync request was cancelled. Sync request was cancelled. - + Sync is paused. Sync is paused. - + %1 (Sync is paused) %1 (Sync is paused) - + No valid folder selected! No valid folder selected! - + The selected path does not exist! The selected path does not exist! - + The selected path is not a folder! The selected path is not a folder! - + You have no permission to write to the selected folder! You have no permission to write to the selected folder! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! There is already a sync from the server to this local folder. Please pick another local folder! @@ -1800,7 +2034,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Add Folder Sync Connection - + File File @@ -1808,152 +2042,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder You need to be connected to add a folder - + Click this button to add a folder to synchronize. Click this button to add a folder to synchronise. - - + + Could not decrypt! + Could not decrypt! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Error while loading the list of folders from the server. - + Fetching folder list from server … Fetching folder list from server … - + There are unresolved conflicts. Click for details. There are unresolved conflicts. Click for details. - + Virtual file support is enabled. Virtual file support is enabled. - + Signed out Signed out - + Synchronizing VirtualFiles with local folder Synchronizing VirtualFiles with local folder - + Synchronizing with local folder Synchronizing with local folder - + Checking for changes in remote "%1" Checking for changes in remote "%1" - + Checking for changes in local "%1" Checking for changes in local "%1" - + Reconciling changes Reconciling changes - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Syncing %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) download %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) upload %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 of %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" A few seconds left, %1 of %2, file %3 of %4 - + %5 left, %1 of %2, file %3 of %4 %5 left, %1 of %2, file %3 of %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 of %2, file %3 of %4 - + file %1 of %2 file %1 of %2 - + Waiting … Waiting … - + Waiting for %n other folder(s) … Waiting for %n other folder(s) …Waiting for %n other folder(s) … - + Preparing to sync … Preparing to sync … @@ -2184,13 +2422,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable stable - + beta beta @@ -2242,32 +2480,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Create Debug Archive - + Server notifications that require attention. Server notifications that require attention. - + Show call notification dialogs. Show call notification dialogues. - + You cannot disable autostart because system-wide autostart is enabled. You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? Change update channel? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar 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. - + Change update channel Change update channel - + Cancel Cancel - + Zip Archives Zip Archives - + Debug Archive Created Debug Archive Created - + Debug archive is created at %1 Debug archive is created at %1 @@ -2304,22 +2542,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Password for share required - + Please enter a password for your link share: Please enter a password for your link share: - + Sharing error Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2557,6 +2795,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2892,60 +3135,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 Use &virtual files instead of downloading content immediately %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 free space - + Virtual files are not available for the selected folder Virtual files are not available for the selected folder - + Local Sync Folder Local Sync Folder - - + + (%1) (%1) - + There isn't enough free space in the local folder! There isn't enough free space in the local folder! @@ -3017,7 +3260,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Impossible to get modification time for file in conflict %1 @@ -3049,144 +3293,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font colour="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> - + Invalid URL Invalid URL - + Failed to connect to %1 at %2:<br/>%3 Failed to connect to %1 at %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Timeout while trying to connect to %1 at %2. - + Trying to connect to %1 at %2 … Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Local sync folder %1 already exists, setting it up for sync.<br/><br/> - + Creating local sync folder %1 … Creating local sync folder %1 … - + OK OK - + failed. failed. - + Could not create local folder %1 Could not create local folder %1 - + No remote folder specified! No remote folder specified! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. Remote folder %1 created successfully. - + The remote folder %1 already exists. Connecting it for syncing. The remote folder %1 already exists. Connecting it for syncing. - - + + The folder creation resulted in HTTP error code %1 The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font colour="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Remote folder %1 creation failed with error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! Successfully connected to %1! - + Connection to %1 could not be established. Please check again. Connection to %1 could not be established. Please check again. - + Folder rename failed Folder rename failed - + Cannot 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. Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font colour="green"><b>Local sync folder %1 successfully created!</b></font> @@ -3209,12 +3453,12 @@ Note that using any logging command line options will override this setting.Cancel - + Enable experimental feature? Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3231,12 +3475,12 @@ Switching to this mode will abort any currently running synchronization. This is a new, experimental mode. If you decide to use it, please report any issues that come up. - + Enable experimental placeholder mode Enable experimental placeholder mode - + Stay safe Stay safe @@ -3265,162 +3509,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Symbolic links are not supported in syncing. - + File is listed on the ignore list. File is listed on the ignore list. - + File names ending with a period are not supported on this file system. File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character File name contains at least one invalid character - + The file name is a reserved name on this file system. The file name is a reserved name on this file system. - + Filename contains trailing spaces. Filename contains trailing spaces. - + Filename contains leading spaces. Filename contains leading spaces. - + Filename contains leading and trailing spaces. Filename contains leading and trailing spaces. - + Filename is too long. Filename is too long. - + File/Folder is ignored because it's hidden. File/Folder is ignored because it's hidden. - + Stat failed. Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + The filename cannot be encoded on your file system. The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. The filename is blacklisted on the server. - + File has extension reserved for virtual files. File has extension reserved for virtual files. - + size size - + permission permission - + file id file id - + Server reported no %1 Server reported no %1 - + Cannot sync due to invalid modification time Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring Moved to invalid target, restoring - + Not allowed to remove, restoring Not allowed to remove, restoring - + Error while reading the database Error while reading the database - + Server replied with an error while reading directory "%1" : %2 Server replied with an error while reading directory "%1" : %2 @@ -3428,22 +3677,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB could not delete file %1 from local DB - + Error updating metadata due to invalid modification time Error updating metadata due to invalid modification time - + Error updating metadata: %1 Error updating metadata: %1 - + File is currently in use File is currently in use @@ -3456,19 +3705,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss could not get file %1 from local DB - + File %1 cannot be downloaded because encryption information is missing. File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery File has changed since discovery - + Could not delete file record %1 from local DB Could not delete file record %1 from local DB @@ -3479,32 +3728,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss File %1 cannot be downloaded because of a local file name clash! - + File %1 can not be downloaded because of a local file name clash! File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit The download would reduce free local disk space below the limit - + Free space on disk is less than %1 Free space on disk is less than %1 - + File was deleted from server File was deleted from server - + The file could not be downloaded completely. The file could not be downloaded completely. - + The downloaded file is empty, but the server said it should have been %1. The downloaded file is empty, but the server said it should have been %1. @@ -3514,18 +3763,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss File %1 cannot be saved because of a local file name clash! - - + + File %1 has invalid modified time reported by server. Do not save it. File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + File %1 downloaded but it resulted in a local file name clash! + + + Error updating metadata: %1 Error updating metadata: %1 - + The file %1 is currently in use The file %1 is currently in use @@ -3546,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 could not delete file %1, error: %2 @@ -3557,16 +3811,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + Folder %1 cannot be created because of a local file or folder name clash! + + + Could not create folder %1 Could not create folder %1 - + Error updating metadata: %1 Error updating metadata: %1 - + The file %1 is currently in use The file %1 is currently in use @@ -3574,7 +3833,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Could not remove %1 because of a local file name clash @@ -3587,46 +3846,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + File %1 downloaded but it resulted in a local file name clash! + + + + + could not get file %1 from local DB could not get file %1 from local DB - + Error setting pin state Error setting pin state - - + + Error updating metadata: %1 Error updating metadata: %1 - + The file %1 is currently in use The file %1 is currently in use - - + + Could not delete file record %1 from local DB Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy Failed to propagate directory rename in hierarchy - + Failed to rename file Failed to rename file @@ -3647,7 +3911,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3660,12 +3924,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - + Error writing metadata to the database: %1 Error writing metadata to the database: %1 - + The file %1 is currently in use The file %1 is currently in use @@ -3673,42 +3937,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - + could not get file %1 from local DB could not get file %1 from local DB - + Could not delete file record %1 from local DB Could not delete file record %1 from local DB - + Error updating metadata: %1 Error updating metadata: %1 - + The file %1 is currently in use The file %1 is currently in use - + Error setting pin state Error setting pin state - + Error writing metadata to the database Error writing metadata to the database @@ -3898,7 +4162,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Reply @@ -3916,23 +4180,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Settings - + %1 Settings This name refers to the application name e.g Nextcloud %1 Settings - + General General - + Network Network - + Account Account @@ -3940,17 +4204,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link Share link - + Link share Link share - + + Internal link + Internal link + + + Enter a note for the recipient Enter a note for the recipient @@ -4026,7 +4295,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4035,132 +4304,171 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + Failed to encrypt folder at "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + Failed to encrypt folder + Failed to encrypt folder + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + Folder encrypted successfully + Folder encrypted successfully + + + + The following folder was encrypted successfully: "%1" + The following folder was encrypted successfully: "%1" + + + Context menu share Context menu share - + Select new location … Select new location … - + I shared something with you I shared something with you - - + + Share options Share options - - + + Activity Activity - + Copy private link to clipboard Copy private link to clipboard - + Send private link by email … Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + Expire in %1 minutesExpire in %1 minutes + - + Leave this share Leave this share - + Resharing this file is not allowed Resharing this file is not allowed - + Resharing this folder is not allowed Resharing this folder is not allowed - - + + Copy public link Copy public link - + Copy internal link Copy internal link - + + Encrypt + Encrypt + + + Lock file Lock file - + Unlock file Unlock file - + Locked by %1 Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - Expire in %1 minutesExpire in %1 minutes - - - + Expires in %1 minutes remaining time before lock expires Expires in %1 minutesExpires in %1 minutes - + Edit Edit - + Open in browser Open in browser - + Resolve conflict … Resolve conflict … - + Move and rename … Move and rename … - + Move, rename and upload … Move, rename and upload … - + Delete local changes Delete local changes - + Move and upload … Move and upload … - + Delete Delete @@ -4378,63 +4686,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 Could not update file: %1 - + Could not update virtual file metadata: %1 Could not update virtual file metadata: %1 - + Could not update file metadata: %1 Could not update file metadata: %1 - + Could not set file record to local DB: %1 Could not set file record to local DB: %1 - + Unresolved conflict. Unresolved conflict. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Only %1 are available, need at least %2 to start - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Unable to read the blacklist from the local database - + Unable to read from the sync journal. Unable to read from the sync journal. - + Cannot open the sync journal Cannot open the sync journal @@ -4444,12 +4752,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Synchronization will resume shortly. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. There is insufficient space available on the server for some uploads. @@ -4518,59 +4826,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Download - + Add account Add account - + Open main dialog Open main dialogue - - + + Pause sync Pause sync - - + + Resume sync Resume sync - + Settings Settings - + Help Help - + Exit %1 Exit %1 - + Pause sync for all Pause sync for all - + Resume sync for all Resume sync for all - + %1: %2 %1: %2 @@ -4578,24 +4886,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Desktop Client</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>This release was supplied by %1</p> @@ -4603,22 +4911,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 Search has failed for '%1'. Error: %2 @@ -4626,30 +4934,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Retry all uploads + + + + Resolve conflict + Resolve conflict + OCC::UserModel - + Confirm Account Removal Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Remove connection - + Cancel Cancel @@ -4787,8 +5101,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Error updating metadata due to invalid modification time @@ -4796,8 +5110,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Error updating metadata due to invalid modification time @@ -4895,123 +5209,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Unsupported Server Version - + 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. 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. - + Disconnected Disconnected - + Disconnected from some accounts Disconnected from some accounts - + Disconnected from %1 Disconnected from %1 - + Disconnected from accounts: Disconnected from accounts: - + Account %1: %2 Account %1: %2 - + Please sign in Please sign in - + Signed out Signed out - + Account synchronization is disabled Account synchronisation is disabled - - + + Synchronization is paused Synchronisation is paused - + Folder %1: %2 Folder %1: %2 - + Unresolved conflicts Unresolved conflicts - + Up to date Up to date - + Error during synchronization Error during synchronisation - + There are no sync folders configured. There are no sync folders configured. - + No sync folders configured No sync folders configured - + Checking for changes in remote "%1" Checking for changes in remote "%1" - + Checking for changes in local "%1" Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Syncing %1 of %2 - + Syncing %1 (%2 left) Syncing %1 (%2 left) - + Syncing %1 Syncing %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5163,27 +5477,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss New folder - + You renamed %1 You renamed %1 - + You deleted %1 You deleted %1 - + You created %1 You created %1 - + You changed %1 You changed %1 - + Synced %1 Synced %1 @@ -5249,30 +5563,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Mark as read + + ShareDelegate + + + Create a new share link + Create a new share link + + + + Copy share link location + Copy share link location + + + + Share options + Share options + + + + ShareDetailsPage + + + An error occurred setting the share password. + An error occurred setting the share password. + + + + Edit share + Edit share + + + + Dismiss + Dismiss + + + + Share label + Share label + + + + Allow editing + Allow editing + + + + Password protect + Password protect + + + + Set expiration date + Set expiration date + + + + Note to recipient + Note to recipient + + + + Unshare + Unshare + + + + Add another link + Add another link + + + + Copy share link + Copy share link + + ShareView - + Password required for new share Password required for new share - + Share password Share password - + Sharing is disabled Sharing is disabled - + This item cannot be shared. This item cannot be shared. - + Sharing is disabled. Sharing is disabled. @@ -5288,7 +5678,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Failed to connect database. @@ -5346,6 +5736,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Load more results + + UnifiedSearchResultNothingFound + + + No results for + No results for + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Search results section %1 + + UserLine @@ -5409,67 +5815,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Online status - + Online Online - + Away Away - + Do not disturb Do not disturb - + Mute all notifications Mute all notifications - + Invisible Invisible - + Appear offline Appear offline - + Status message Status message - + What is your status? What is your status? - + Clear status message after Clear status message after - + Cancel Cancel - + Clear status message Clear status message - + Set status message Set status message @@ -5553,24 +5959,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloud desktop main dialogue - + Current account Current account - - + + Resume sync for all Resume sync for all - - + + Pause sync for all Pause sync for all @@ -5580,22 +5986,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Set user status - + Add account Add account - + Add new account Add new account - + Settings Settings - + Exit Exit @@ -5604,11 +6010,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Current user avatar - - - Current account avatar - Current account avatar - Current user status is online @@ -5620,70 +6021,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user status is do not disturb - + + Current account avatar + Current account avatar + + + Current account status is online Current account status is online - + Current account status is do not disturb Current account status is do not disturb - + + %1 - File activity + %1 - File activity + + + Account switcher and settings menu Account switcher and settings menu - + Open local folder of current account Open local folder of current account - + Connected Connected - + Disconnected Disconnected - + Open Nextcloud Talk in browser Open Nextcloud Talk in browser - + More apps More apps - + Open %1 in browser Open %1 in browser - + Unified search results list Unified search results list - - - %1 - File activity - %1 - File activity - main.cpp - + System Tray not available System Tray not available - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5691,7 +6097,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5725,72 +6131,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + Server version downloaded, copied changed local file into case conflict conflict file + + + Deleted Deleted - + Moved to %1 Moved to %1 - + Ignored Ignored - + Filesystem access error Filesystem access error - + Error Error - + Updated local metadata Updated local metadata - + Unknown Unknown - + downloading downloading - + uploading uploading - + deleting deleting - + moving moving - + ignoring ignoring - + error error - + updating local metadata updating local metadata diff --git a/translations/client_eo.ts b/translations/client_eo.ts index 65d7dac50..dc5c275a0 100644 --- a/translations/client_eo.ts +++ b/translations/client_eo.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Malfermi %1 loke - + In %1 En %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Listo de aktiveco @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity Aktiveco - + Sharing @@ -226,12 +236,12 @@ Movi rubujen ankoraŭ ne estas realigita ĉe tiu sistemo - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Nuligi @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ Ne ĉifri dosierujon - + Do not encrypt folder Ne ĉifri dosierujon - + Encrypt folder Ĉifri dosierujon - + No account configured. Neniu konto agordita. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Ebligi ĉifradon - + + End-to-end encryption has been enabled for this account + + + + Warning Averto - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed Ĉifrado malsukcesis - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Malfermi dosierujon - + Encrypt Ĉifri - - + + Edit Ignored Files Redakti ignoritajn dosierojn - - + + Create new folder Krei novan dosierujon - - + + Availability Havebleco - + Choose what to sync Elekti tion, kion sinkronigi - + Force sync now Sinkronigi nun - + Restart sync Rekomenci sinkronigon - + Resume sync Daŭrigi sinkronigon - + Pause sync Paŭzigi sinkronigon - + Remove folder sync connection Ne plu sinkronigi tiun dosierujon - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) (eksperimenta) - + Folder creation failed Kreo de dosierujo malsukcesis - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Konfirmu la forigadon de la sinkronigo de tiu dosierujo - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ĉu vi vere volas ĉesi sinkronigi la dosierujon <i>%1</i>?</p><p><b>Notu:</b> Tio <b>ne</b> forigos la dosierojn.</p> - + Remove Folder Sync Connection Ne plu sinkronigi tiun dosierujon - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sinkronigo ruliĝanta - + The syncing operation is running.<br/>Do you want to terminate it? Sinkronigo estas ruliĝanta.<br/>Ĉu vi volas fini ĝin? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) el %2 uzataj. Certaj dosierujoj, inkluzive de rete muntitaj aŭ kunhavigitaj dosierujoj, eble havas aliajn limigojn. - + %1 of %2 in use %1 el %2 uzitaj - + Currently there is no storage usage information available. Ĉi-momente estas neniu informo pri konservejospaco. - + %1 in use %1 uzata(j) - + %1 as %2 %1 kiel %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Konektita al %1. - + Server %1 is temporarily unavailable. Servilo %1 dumtempe ne disponeblas - + Server %1 is currently in maintenance mode. La servilo %1 estas en reĝimo de prizorgado - + Signed out from %1. Elsalutita de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Atendante rajtigon el la retumilo. <a href='%1'>Alklaku ĉi tie</a> por remalfermi la retumilon. - + Connecting to %1 … Konektante al %1… - + No connection to %1 at %2. Neniu konekto al servilo %1 je la adreso %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. Neniu konekto al %1 agordita. - + There are folders that were not synchronized because they are too big: Kelkaj dosierujoj ne sinkroniĝis, ĉar ili estas tro grandaj: - + There are folders that were not synchronized because they are external storages: Kelkaj dosierujoj ne sinkroniĝis, ĉar ili estas konservataj en ekstera konservejo: - + There are folders that were not synchronized because they are too big or external storages: Kelkaj dosierujoj ne sinkroniĝis, ĉar ili estas tro grandaj âù konservataj en ekstera konservejo: - + Confirm Account Removal Konfirmi forigadon de la konto - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ĉu vi vere volas forigi konekton al la konto <i>%1</i>?</p><p><b>Notu:</b> Tio <b>ne</b> forigos la dosierojn.</p> - + Remove connection Forigi konekton - - + This account supports end-to-end encryption Tiu konto subtenas tutvojan ĉifradon - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Forlasi - + Continue Daŭrigi - + Error accessing the configuration file Eraro dum aliro al la dosiero de agordoj @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. Okazis eraro dum aliro al la agorda dosiero en %1. Bv. certigi, ke la dosiero estas alirebla de via uzanto. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Fini %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 Reta eraro: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 Restaŭrado malsukcesis: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Eraro dum konservado de pridatumoj en la datumbazo @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. Bv. entajpi vian pasfrazon de tutvoja ĉifrado:<br><br>Uzanto: %2<br>Konto: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Entajpu E2E (tutvoja) pasfrazon @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 Dosierujo ne troviĝis: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. Bonvolu reprovi. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Loka dosierujo %1 ne ekzistas. - + %1 should be a folder but is not. %1 devus esti dosierujo, sed ĝi ne estas tiel. - + %1 is not readable. %1 ne estas legebla. - + %1 and %n other file(s) have been removed. %1 estis forigita.%1 kaj %n plia(j) dosiero(j) estis forigitaj. - + %1 has been removed. %1 names a file. %1 estis forigita. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 ĝisdatiĝis.%1 kaj %n plia(j) dosiero(j) ĝisdatiĝis. - + %1 has been updated. %1 names a file. %1 estis ĝisdatigita. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 estis alinomita al %2.%1 estis alinomita al %2, kaj %n plia(j) dosiero(j) estis alinomitaj. - + %1 has been renamed to %2. %1 and %2 name files. %1 estis alinomita al %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 estis movita al %2.%1 estis movita al %2, kaj %n plia(j) dosiero(j) estis movitaj. - + %1 has been moved to %2. %1 estis movita al %2. - + %1 has and %n other file(s) have sync conflicts. %1 havas sinkronigajn konfliktojn.%1 kaj %n plia(j) dosiero(j) havas sinkronigajn konfliktojn. - + %1 has a sync conflict. Please check the conflict file! %1 havas sinkronigan konflikton. Bv. kontroli la dosieron pri konfliktoj! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 ne estis sinkronigita pro eraroj. Vidu la protokolon por detaloj.%1 kaj %n plia(j) dosiero(j) ne estis sinkronigitaj pro eraroj. Vidu la protokolon por detaloj. - + %1 could not be synced due to an error. See the log for details. %1 ne estis sinkronigita pro eraro. Vidu la protokolon por detaloj. - + %1 and %n other file(s) are currently locked. %1 kaj %n plia(j) dosiero(j) estas ŝlosataj.%1 kaj %n plia(j) dosiero(j) estas ŝlosataj. - + %1 is currently locked. %1 estas ŝlosata. - + Sync Activity Sinkronigaj aktivaĵoj - + Could not read system exclude file Ne eblis legi la sisteman dosieron pri esceptoj - + A new folder larger than %1 MB has been added: %2. Nova dosierujo pli granda ol %1 MB estis aldonita: %2. - + A folder from an external storage has been added. Dosierujo el ekstera konservejo estis aldonita. - + Please go in the settings to select it if you wish to download it. Bv. iri al la agordoj por elekti, ĉu vi volas elŝuti ĝin. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. La dosierujo %1 estis kreita sed estis eksigita el sinkronigo antaŭe. Datumoj ene de ĝi ne estos sinkronigitaj. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. La dosiero %1 estis kreita sed estis eksigita el sinkronigo antaŭe. Ĝi ne estos sinkronigita. - + 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). @@ -1592,7 +1826,7 @@ Tio signifas, ke la sinkroniga kliento eble ne alŝutas tuj lokajn ŝanĝojn kaj %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1600,24 +1834,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Ĉu forigi ĉiujn dosierojn? - + Remove all files Forigi ĉiujn dosierojn - + Keep files Teni dosierojn @@ -1653,22 +1887,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Ne eblis restarigi la staton de la dosierujo - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (savkopio) - + (backup %1) (savkopio %1) @@ -1678,27 +1912,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Nedifinita stato. - + Undefined state. Nedifinita stato. - + Waiting to start syncing. Atendo de eksinkronigo. - + Preparing for sync. Pretigado de la sinkronigo. - + Sync is running. Sinkronigo ruliĝanta. - + Sync finished with unresolved conflicts. @@ -1718,62 +1952,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Haltigita de la uzanto. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sinkronigo estas paŭzigita. - + %1 (Sync is paused) %1 (Sinkronigo estas paŭzigita) - + No valid folder selected! Nevalida dosierujo elektita! - + The selected path does not exist! - + The selected path is not a folder! La elektita vojo ne estas dosierujo! - + You have no permission to write to the selected folder! Vi ne rajtas skribi en la elektitan dosierujon! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La loka dosierujo %1 jam enhavas dosierujon uzitan en alia dosieruja sinkronigo. Bv. elekti alian dosierujon! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La loka dosierujo %1 jam troviĝas en dosierujo uzita en alia dosieruja sinkronigo. Bv. elekti alian dosierujon! - + There is already a sync from the server to this local folder. Please pick another local folder! Jam ekzistas sinkronigo el la servilo al tiu ĉi loka dosierujo. Bv. elekti alian lokan dosierujon! @@ -1786,7 +2020,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Aldoni dosierujan sinkronigon - + File Dosiero @@ -1794,152 +2028,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Vi devas esti konektita por aldoni dosierujon - + Click this button to add a folder to synchronize. Alklaku tiun butonon por aldoni dosierujon sinkronigotan - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Eraro dum ŝargado de la listo de dosierujoj el la servilo. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Estas nesolvitaj konfliktoj. Alklaku por detaloj. - + Virtual file support is enabled. - + Signed out Elsalutita - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Komparo de ŝanĝoj - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sinkronigo de %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) elŝuto %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) alŝuto %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 el %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 restas, %1 el %2, dosiero %3 el %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 el %2, dosiero %3 el %4 - + file %1 of %2 dosiero %1 el %2 - + Waiting … Atendante… - + Waiting for %n other folder(s) … - + Preparing to sync … Pretigante sinkronigon… @@ -2170,13 +2408,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable stabila - + beta beta @@ -2228,59 +2466,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Servilaj sciigoj, kiu bezonas atenton. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel Nuligi - + Zip Archives ZIP-arkivoj - + Debug Archive Created - + Debug archive is created at %1 @@ -2288,22 +2526,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error Eraro de kunhavigo - + Could not retrieve or create the public link share. Error: %1 @@ -2541,6 +2779,11 @@ Elementoj, kies forigo estas permesita, estos forigitaj, se ili malhelpas forigo Close Fermi + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2873,60 +3116,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (eksperimenta) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" Sinkronigi la dosierujon «%1» - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 da libera spaco - + Virtual files are not available for the selected folder - + Local Sync Folder Loka sinkroniga dosierujo - - + + (%1) (%1) - + There isn't enough free space in the local folder! Ne estas sufiĉe da libera spaco en la loka dosierujo! @@ -2998,7 +3241,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3030,144 +3274,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Sukcese konektita al %1: %2 je versio %3 (%4)</font><br/><br/> - + Invalid URL Nevalida retadreso - + Failed to connect to %1 at %2:<br/>%3 Malsukcesis konekti al %1 ĉe %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Eltempiĝo dum konekto al %1 ĉe %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Aliro nepermesata de la servilo. Por kontroli, ĉu vi rajtas pri aliro, <a href="%1">alklaku ĉi tie</a> por iri al la servo pere de via retumilo. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Sinkroniga dosierujo loka %1 jam ekzistas, agordante ĝin por la sinkronigo.<br/><br/> - + Creating local sync folder %1 … - + OK Bone - + failed. malsukcesis. - + Could not create local folder %1 Ne eblis krei lokan dosierujon %1 - + No remote folder specified! Neniu fora dosierujo specifita! - + Error: %1 Eraro: %1 - + creating folder on Nextcloud: %1 kreado de dosierujo ĉe Nextcloud: %1 - + Remote folder %1 created successfully. Fora dosierujo %1 sukcese kreita - + The remote folder %1 already exists. Connecting it for syncing. La fora dosierujo %1 jam ekzistas. Konektado. - - + + The folder creation resulted in HTTP error code %1 Dosieruja kreado ricevis HTTP-eraran kodon %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Kreo de fora dosierujo malsukcesis, ĉar la akreditiloj ne ĝustas!<br/>Bv. antaŭeniri kaj kontroli viajn akreditilojn.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Kreado de fora dosierujo malsukcesis, eble ĉar la akreditiloj ne ĝustas.</font><br/>Bv. antaŭeniri kaj kontroli viajn akreditilojn.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Kreado de fora dosierujo %1 malsukcesis kun eraro <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Sinkroniga konekto el %1 al fora dosierujo %2 agordiĝis. - + Successfully connected to %1! Sukcese konektita al %1! - + Connection to %1 could not be established. Please check again. Konekto al %1 ne eblis. Bv. rekontroli. - + Folder rename failed Dosieruja alinomado malsukcesis. - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Loka sinkroniga dosierujo %1 sukcese kreita!</b></font> @@ -3190,12 +3434,12 @@ Note that using any logging command line options will override this setting.Nuligi - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3206,12 +3450,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe Resti sekura @@ -3240,162 +3484,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Dosiernomo tro longas. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size grando - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3403,22 +3652,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3431,19 +3680,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Dosiero ŝanĝiĝis ekde sia malkovro - + Could not delete file record %1 from local DB @@ -3454,32 +3703,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Dosiero %1 ne elŝuteblis, ĉar estas konflikto kun loka dosiernomo! - + The download would reduce free local disk space below the limit Tiu elŝuto malpligrandigus la liberan lokan diskospacon. - + Free space on disk is less than %1 Libera diskospaco estas malpli ol %1 - + File was deleted from server Dosiero estis forigita el la servilo - + The file could not be downloaded completely. La dosiero ne estis elŝutita plene. - + The downloaded file is empty, but the server said it should have been %1. @@ -3489,18 +3738,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Dosiero %1 ne eblis esti konservita pro konflikto kun loka dosiernomo! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3521,7 +3775,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ne eblis forigi dosieron %1, eraro: %2 @@ -3532,16 +3786,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3549,7 +3808,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Ne eblis forigi %1 pro konflikto kun loka dosiernomo @@ -3562,46 +3821,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Ne eblis ŝanĝi nomon de dosiero @@ -3622,7 +3886,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3635,12 +3899,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Neĝusta HTTP-kodo ricevita de servilo. Atendita: 201, ricevita: „%1 %2“. - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3648,42 +3912,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Neĝusta HTTP-kodo ricevita de servilo. Atendita: 201, ricevita: „%1 %2“. - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Eraro dum konservado de pridatumoj en la datumbazo @@ -3873,7 +4137,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Respondi @@ -3891,23 +4155,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Agordoj - + %1 Settings This name refers to the application name e.g Nextcloud Agordoj de %1 - + General Ĝenerala - + Network Reto - + Account Konto @@ -3915,17 +4179,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4001,7 +4270,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4010,132 +4279,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Menuo pri kunhavigo - + Select new location … - + I shared something with you Mi kunhavigis ion kun vi - - + + Share options Opcioj pri kunhavigo - - + + Activity Aktiveco - + Copy private link to clipboard Kopii privatan ligilon al tondujo - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Re-kunhavigi ne estas permesata - + Resharing this folder is not allowed - - + + Copy public link Kopii publikan ligilon - + Copy internal link Kopii internan ligilon - + + Encrypt + + + + Lock file Ŝlosi dosieron - + Unlock file Malŝlosi dosieron - + Locked by %1 Ŝlosita de %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Redakti - + Open in browser Malfermi per retumilo - + Resolve conflict … Solvi konflikton… - + Move and rename … Movi kaj ŝanĝi nomon… - + Move, rename and upload … - + Delete local changes Forviŝi lokajn ŝanĝojn - + Move and upload … - + Delete Forigi @@ -4352,63 +4658,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (preterpasita pro antaŭa eraro, reprovo je %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Nesolvita konflikto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Nur disponeblas %1, bezono de almenaŭ %2 por eki - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Ne eblas malfermi aŭ krei lokan sinkronigan datumbazon. Certigu, ke vi rajtas aliri al la sinkroniga dosierujo. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Ne eblas legi la nigran liston el la loka datumbazo - + Unable to read from the sync journal. Ne eblas legi el la sinkroniga protokolo. - + Cannot open the sync journal Ne eblas malfermi la sinkronigan protokolon @@ -4418,12 +4724,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Diskospaco ne sufiĉas: elŝutoj, kiuj reduktos liberan spacon sub %1, ne okazis. - + There is insufficient space available on the server for some uploads. La servilo ne plu havas sufiĉan spacon por iuj alŝutoj. @@ -4492,59 +4798,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Elŝuti - + Add account Aldoni konton - + Open main dialog Malfermi ĉefdialogon - - + + Pause sync Paŭzigi sinkronigon - - + + Resume sync Daŭrigi sinkronigon - + Settings Agordoj - + Help Helpo - + Exit %1 Forlasi %1 - + Pause sync for all Ĉezigi sinkronigadon por ĉio - + Resume sync for all Daŭrigi sinkronigon por ĉio - + %1: %2 %1: %2 @@ -4552,24 +4858,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Labortabla Kliento %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versio %1. Por pli da informoj, alklaku <a href='%2'>ĉi tie</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Tiu eldono estis liverita de %1</p> @@ -4577,22 +4883,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4600,30 +4906,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Reprovi ĉiujn alŝutojn + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Forigi konekton - + Cancel Nuligi @@ -4761,8 +5073,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4770,8 +5082,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4869,123 +5181,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Nesubtenata versio de servilo - + 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. - + Disconnected Malkonektita - + Disconnected from some accounts Malkonektita el kelkaj kontoj - + Disconnected from %1 Malkonektita el %1 - + Disconnected from accounts: Malkonektita el la jenaj kontoj: - + Account %1: %2 Konto %1: %2 - + Please sign in Bv. ensaluti - + Signed out Elsalutita - + Account synchronization is disabled Konta sinkronigo estas malebligita - - + + Synchronization is paused Sinkronigo estas paŭzigita - + Folder %1: %2 Dosierujo %1: %2 - + Unresolved conflicts Nesolvitaj konfliktoj - + Up to date Ĝisdata - + Error during synchronization Eraro dum sinkronigo - + There are no sync folders configured. Neniu sinkroniga dosiero agordita. - + No sync folders configured Neniu sinkroniga dosiero agordita - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sinkronigo de %1 el %2 - + Syncing %1 (%2 left) Sinkronigo de %1 (%2 restas) - + Syncing %1 Sinkronigo de %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5137,27 +5449,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Nova dosierujo - + You renamed %1 Vi ŝanĝis nomon de %1 - + You deleted %1 Vi forviŝis %1 - + You created %1 Vi kreis %1 - + You changed %1 Vi ŝanĝis %1 - + Synced %1 Sinkronigis %1 @@ -5223,30 +5535,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Marki kiel legitan + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5262,7 +5650,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5320,6 +5708,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5383,67 +5787,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible Nevidebla - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel Nuligi - + Clear status message - + Set status message @@ -5527,24 +5931,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Nuna konto - - + + Resume sync for all - - + + Pause sync for all Ĉezigi sinkronigadon por ĉio @@ -5554,22 +5958,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Aldoni konton - + Add new account Aldoni novan konton - + Settings Agordoj - + Exit Forlasi @@ -5578,11 +5982,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5594,70 +5993,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Konektita - + Disconnected Malkonektita - + Open Nextcloud Talk in browser - + More apps Pli da aplikaĵoj - + Open %1 in browser Malfermi %1 per la retumilo - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Taskopleto ne disponeblas - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5665,7 +6069,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Konstruita el Git-a revizio <a href="%1">%2</a> je %3, %4, uzante Qt %5, %6</small></p> @@ -5699,72 +6103,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Forigita - + Moved to %1 Movita al %1 - + Ignored Ignorita - + Filesystem access error Eraro de dosiersistema aliro - + Error Eraro - + Updated local metadata Lokaj pridatumoj ĝisdatigitaj - + Unknown Nekonata - + downloading elŝutado - + uploading alŝutado - + deleting forigado - + moving movado - + ignoring ignorado - + error eraro - + updating local metadata ĝisdatigo de lokaj pridatumoj diff --git a/translations/client_es.ts b/translations/client_es.ts index d8438210d..6b4e5ac3e 100644 --- a/translations/client_es.ts +++ b/translations/client_es.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Abrir %1 localmente - + In %1 En %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostrar más acciones @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Descartar + + + Open file details + Abrir detalles del archivo + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista de actividad @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Borrar el menú de mensajes de estado @@ -167,7 +172,7 @@ Opening file for local editing - Abriendo archivo para edición local + Abriendo archivo para editarlo en local @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Descartar + + + Activity Actividad - + Sharing Compartir @@ -226,12 +236,12 @@ Mover a la papelera no está implementado en esta plataforma - + Error removing "%1": %2 Error al eliminar "%1": %2 - + Could not remove folder "%1" No se ha podido eliminar la carpeta "%1" @@ -321,7 +331,7 @@ El código HTTP devuelto por el servidor es erróneo. Se esperaba 204, pero recibido "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Falló al desbloquear la carpeta cifrada %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. El archivo %1 ya está bloqueado por %2. - + Lock operation on %1 failed with error %2 La operación de bloqueo en %1 ha fallado con el error %2. - + Unlock operation on %1 failed with error %2 La operación de desbloqueo en %1 ha fallado con el error %2. @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,14 +410,14 @@ Parece que tienes la función de Archivos Virtuales activada en esta carpeta. Por el momento, no es posible descargar automáticamente los archivos virtuales que están cifrados de extremo a extremo. Para obtener la mejor experiencia con los archivos virtuales y el cifrado de extremo a extremo, asegúrate de que la carpeta cifrada está marcada con "Hacer que esté siempre disponible localmente". - + End-to-end Encryption with Virtual Files - Cifrado de extremo a extremo con Archivos virtuales + Cifrado de extremo a extremo con Archivos Virtuales - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". - + Parece que tienes la función de Archivos Virtuales activada en esta carpeta. Por el momento, no es posible descargar implícitamente los archivos virtuales que están cifrados de extremo a extremo. Para obtener la mejor experiencia con los archivos virtuales y el cifrado de extremo a extremo, asegúrate de que la carpeta cifrada está marcada con "Hacer que esté siempre disponible localmente". @@ -415,29 +425,29 @@ No cifrar carpeta - + Do not encrypt folder No cifrar carpeta - + Encrypt folder Cifrar carpeta - + No account configured. No se ha configurado ninguna cuenta. - - Display mnemonic - Mostrar regla mnemotécnica + + Disable encryption + Deshabilitar cifrado - End-to-end encryption has been enabled for this account - El cifrado de extremo a extremo a sido habilitado para esta cuenta + Display mnemonic + Mostrar regla mnemotécnica @@ -445,18 +455,24 @@ Habilitar cifrado - + + End-to-end encryption has been enabled for this account + El cifrado de extremo a extremo a sido habilitado para esta cuenta + + + Warning Aviso - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + El cifrado de extremo a extremo no está configurado en este dispositivo. Una vez que esté configurado, podrás cifrar esta carpeta. +¿Deseas configurar el cifrado de extremo a extremo? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. No puede cifrar una carpeta con contenidos, por favor, elimine los archivos. @@ -469,121 +485,121 @@ Espere a una nueva sincronización, luego cifrala. Esta cuenta soporta cifrado de extremo a extremo - + Encryption failed Ha fallado el cifrado - + Could not encrypt folder because the folder does not exist anymore No es posible cifrar la carpeta porque ya no existe - - + + Open folder Abrir carpeta - + Encrypt Cifrar - - + + Edit Ignored Files Editar archivos ignorados - - + + Create new folder Crear nueva carpeta - - + + Availability Disponibilidad - + Choose what to sync Elija qué sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sync - + Resume sync Continuar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la sincronización de carpetas conectadas - + Disable virtual file support … Desactivar soporte para archivos virtuales … - + Enable virtual file support %1 … Activar soporte para archivos virtuales %1 ... - + (experimental) (experimental) - + Folder creation failed Ha fallado la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> <p>No pudo crear la carpeta local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirme la sincronización para la eliminación de la carpeta conectada - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿De verdad quiere dejar de sincronizar la carpeta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> elminará los archivo.</p> - + Remove Folder Sync Connection Eliminar carpeta de sincronización conectada - + Disable virtual file support? ¿Desactivar soporte para archivos virtuales? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +612,7 @@ La única ventaja de deshabilitar el soporte de archivos virtuales es para la ca Además, esta acción interrumpirá cualquier sincronización en curso. - + Disable support Desactivar soporte @@ -606,145 +622,177 @@ Además, esta acción interrumpirá cualquier sincronización en curso.Mnemónico para cifrado de extremo a extremo - + End-to-end encryption mnemonic Mnemónico para cifrado de extremo a extremo - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Para proteger tu identidad criptográfica, la ciframos con una regla mnemotécnica de 12 palabras del diccionario. Por favor, anótalas y mantenlas a salvo. Estas palabras serán necesarias para añadir otros dispositivos a su cuenta (como un teléfono móvil o un portátil). - + + Disable end-to-end encryption + Deshabilitar cifrado de extremo a extremo + + + + Disable end-to-end encryption for %1? + Deshabilitar cifrado de extremo a extremo para %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Quitar el cifrado de extremo a extremo borrará los archivos sincronizados localmente que se encuentran encriptados.<br>Los archivos encriptados se mantendrán en el servidor. + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La sincronización está en curso.<br/>¿Desea interrumpirla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, como carpetas de red o compartidas, podrían tener límites diferentes. - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible sobre el uso de almacenamiento. - + %1 in use %1 en uso - + %1 as %2 %1 como %2 - + The server version %1 is unsupported! Proceed at your own risk. ¡La versión %1 del servidor no está soportada! Si continúas, lo haces bajo tu propio riesgo. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. Servidor %1 no está disponible temporalmente. - + Server %1 is currently in maintenance mode. El servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerró sesión desde %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización desde el navegador. <a href='%1'>Haga clic aquí</a> para re-abrir el navegador. - + Connecting to %1 … Conectando a %1 ... - + No connection to %1 at %2. Sin conexión a %1 en %2. - + Server configuration error: %1 at %2. Error de configuración del servidor: %1 en %2, - + No %1 connection configured. No hay ninguna conexión de %1 configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no se han sincronizado porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no se han sincronizado porque están en el almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no se han sincronizado porque son demasiado grandes o están en el almacenamiento externo: - + Confirm Account Removal Confirmar eliminación de cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿De verdad quiere eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> eliminará los archivos.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption Esta cuenta soporta cifrado punto a punto - + Set up encryption - + Configurar cifrado - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + El cifrado de extremo a extremo ha sido habilitado en esta cuenta con otro dispositivo.<br> puede ser habilitado en este dispositivo ingresando su mnemónico.<br> Esto habilitará la sincronización de las carpetas cifradas existentes + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + La petición autenticada al servidor ha sido redirigida a "%1". La URL es errónea, el servidor está mal configurado. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Acceso denegado por el servidor. Para verificar que tiene acceso, <a href="%1">haga clic aquí</a> para acceder al servicio desde el navegador. + + + + There was an invalid response to an authenticated WebDAV request + Ha habido una respuesta no válida a una solicitud autenticada de WebDAV @@ -798,7 +846,7 @@ Además, esta acción interrumpirá cualquier sincronización en curso. OCC::ActivityListModel - + For more activities please open the Activity app. Para más detalles, por favor, abre la app Actividades. @@ -808,12 +856,12 @@ Además, esta acción interrumpirá cualquier sincronización en curso.Actividades de búsqueda... - + Fetching activities … Actividades de búsqueda... - + Files from the ignore list as well as symbolic links are not synced. Los archivos de la lista de ignorados así como los enlace simbólicos no estarán sincronizados. @@ -864,32 +912,59 @@ Además, esta acción interrumpirá cualquier sincronización en curso. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Continuar significará <b>eliminar estos ajustes</b>. - + Continuing will mean <b>ignoring these settings</b>. Continuar significará <b>ignorar estos ajustes</b>. - + 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>. Algunos ajustes fueron configurados en nuevas versiones de este cliente y usan características que no están disponibles en esta versión.<br><br>%1<br><br>Ya se ha hecho una copia de seguridad del archivo de configuración a <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Salir - + Continue Continuar - + Error accessing the configuration file Error al acceder al archivo de configuración @@ -899,12 +974,12 @@ Además, esta acción interrumpirá cualquier sincronización en curso.Se ha producido un error al acceder al archivo de configuración en %1. Por favor asegúrese de que el archivo es accesible por su usuario. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Se ha producido un error al acceder al archivo de configuración en %1. Por favor, asegúrese de que su cuenta del sistema puede acceder al archivo. - + Quit %1 Salir %1 @@ -950,56 +1025,216 @@ Además, esta acción interrumpirá cualquier sincronización en curso.El archivo %1 tiene una hora de modificación no válida. No subir al servidor. - + File Removed (start upload) %1 Archivo eliminado (comenzar subida) %1 - + File %1 has invalid modification time. Do not upload to the server. El archivo %1 tiene una hora de modificación no válida. No subir al servidor. - + Local file changed during syncing. It will be resumed. Un archivo local ha cambiado durante la sincronización. Será subido. - - + + Local file changed during sync. Un archivo local ha cambiado durante la sincronización. - + Network error: %1 Error de red: %1 - + Error updating metadata: %1 Error al actualizar los metadatos: %1 - + The file %1 is currently in use El archivo %1 se encuentra en uso - + The local file was removed during sync. El archivo local ha sido eliminado durante la sincronización. - + Restoration failed: %1 Fallo al restaurar: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + No se puede renombrar el archivo porque hay un archivo con el mismo nombre en el servidor. Por favor, elije otro nombre. + + + + Could not rename file. Please make sure you are connected to the server. + No se ha podido renombrar el archivo. Por favor, asegúrese de que está conectado al servidor. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + No tienes permisos para renombrar este archivo. Por favor, dile al autor del archivo que lo renombre. + + + + Failed to fetch permissions with error %1 + Fallo en la obtención de permisos con error %1 + + + + Filename contains leading and trailing spaces. + El nombre del archivo contiene espacios iniciales y finales. + + + + Filename contains leading spaces. + El nombre del archivo contiene espacios al inicio. + + + + Filename contains trailing spaces. + El nombre del archivo contiene espacios al final. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Conflicto de capitalización + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + El archivo no puede ser sincronizado porque genera un conflicto de capitalización con un archivo que ya existe en este sistema. + + + + Error + Error + + + + Existing file + Archivo existente + + + + file A + Archivo A + + + + fileA + fileA + + + + + today + hoy + + + + + 0 byte + 0 bytes + + + + + Open existing file + Abrir archivo existente + + + + Case clashing file + Archivo con conflicto de capitalización + + + + file B + Archivo B + + + + fileB + fileB + + + + + Open clashing file + Abrir archivo con problema de capitalización + + + + Please enter a new name for the clashing file: + Por favor ingrese un nombre nuevo para el archivo con el problema de capitalización: + + + + New filename + Nuevo nombre de archivo + + + + Rename file + Renombrar archivo + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + El archivo "%1" no pudo ser sincronizado porque genera un conflicto de capitalización con un archivo que ya existe en este sistema. + + + + %1 does not support equal file names with only letter casing differences. + %1 no soporta nombres de archivo idénticos con diferencias de capitalización de letras. + + + + Filename contains leading and trailing spaces. + El nombre del archivo contiene espacios iniciales y finales. + + + + Filename contains leading spaces. + El nombre del archivo contiene espacios al inicio. + + + + Filename contains trailing spaces. + El nombre del archivo contiene espacios al final. + + + + Use invalid name + Usar nombre inválido + + + + Filename contains illegal characters: %1 + El nombre del archivo contiene caracteres ilegales: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir los metadatos en la base de datos @@ -1017,12 +1252,12 @@ Además, esta acción interrumpirá cualquier sincronización en curso.Por favor, introduce la frase de seguridad del cifrado extremo a extremo: <br><br>Usuario: %2<br>Cuenta: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Por favor, introduzca su frase de cifrado de extremo a extremo:<br><br>Nombre de usuario: %2<br> Cuenta: %3<br> - + Enter E2E passphrase Introduce la frase de acceso E2E @@ -1198,8 +1433,8 @@ Además, esta acción interrumpirá cualquier sincronización en curso. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Error del servidor: ¡la respuesta de PROPFIND no tiene formato XML! @@ -1207,27 +1442,27 @@ Además, esta acción interrumpirá cualquier sincronización en curso. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Error al abrir el directorio %1 - + Directory not accessible on client, permission denied Directorio no accesible en el cliente, permiso denegado - + Directory not found: %1 Directorio no encontrado: %1 - + Filename encoding is not valid La codificación del nombre del archivo no es válida - + Error while reading directory %1 Error al leer el directorio %1 @@ -1235,91 +1470,91 @@ Además, esta acción interrumpirá cualquier sincronización en curso. OCC::EditLocallyJob - + Invalid token received. Se recibió un token inválido. - - - - - - + + + + + + Please try again. Por favor intente de nuevo. - + Invalid file path was provided. Se proporcionó una ruta al archivo inválida. - + Could not find an account for local editing. No fue posible encontrar una cuenta para edición local - - + + Could not validate the request to open a file from server. No se pudo validar la solicitud de apertura de archivo desde el servidor. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. No fue posible encontrar un archivo para edición local. Asegúrese de que la ruta es válida y que este se encuentra sincronizado localmente. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. No fue posible encontrar un archivo para edición local. Asegúrese de que no está excluida a través de la sincronización selectiva. - + Server error: PROPFIND reply is not XML formatted! - + Error del servidor: ¡la respuesta de PROPFIND no tiene formato XML! - + Could not find a remote file info for local editing. Make sure its path is valid. - + No fue posible encontrar la información del archivo remoto para edición local. Asegúrese de que la ruta es válida. - + Could not open %1 - + No fue posible abrir %1 - + File %1 already locked. - + El archivo %1 ya está bloqueado. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + El bloqueo se mantendrá por %1 minutos. Puede también desbloquear este archivo manualmente una vez que termine de editarlo. - + File %1 now locked. - + El archivo %1 ahora está bloqueado. - + File %1 could not be locked. - + El archivo %1 no pudo ser bloqueado. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. No se pueden generar los metadatos para el cifrado, desbloquea la carpeta. @@ -1449,145 +1684,145 @@ Esto podría ser un problema con tu librería OpenSSL OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta, pero no lo es. - + %1 is not readable. %1 es ilegible. - + %1 and %n other file(s) have been removed. %1 y otro archivo han sido borrados.%1 y otros %n archivos han sido borrados.%1 y otros %n archivos han sido borrados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. %1 y %n otro(s) archivo(s) ha(n) sido añadido(s).%1 y %n otro(s) archivo(s) ha(n) sido añadido(s).%1 y %n otro(s) archivo(s) ha(n) sido añadido(s). - + %1 has been added. %1 names a file. %1 ha sido añadido. - + %1 and %n other file(s) have been updated. %1 y otro archivo han sido actualizados.%1 y otros %n archivos han sido actualizados.%1 y otros %n archivos han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado a %2 y otro archivo ha sido renombrado.%1 ha sido renombrado a %2 y otros %n archivos han sido renombrado.%1 ha sido renombrado a %2 y otros %n archivos han sido renombrado. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 ha sido movido a %2 y otro archivo ha sido movido.%1 ha sido movido a %2 y otros %n archivos han sido movidos.%1 ha sido movido a %2 y otros %n archivos han sido movidos. - + %1 has been moved to %2. %1 ha sido movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y otro archivo han tenido conflictos al sincronizar.%1 y otros %n archivos han tenido conflictos al sincronizar.%1 y otros %n archivos han tenido conflictos al sincronizar. - + %1 has a sync conflict. Please check the conflict file! Conflicto al sincronizar %1. ¡Por favor compruebe el archivo! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y otro archivo no pudieron ser sincronizados debido a errores. Para más detalles vea el registro.%1 y otros %n archivos no se han podido sincronizar debido a errores. Para más detalles vea el registro.%1 y otros %n archivos no se han podido sincronizar debido a errores. Para más detalles vea el registro. - + %1 could not be synced due to an error. See the log for details. %1 no se ha podido sincronizar debido a un error. Para más detalles, vea el registro. - + %1 and %n other file(s) are currently locked. %1 y otro %n archivo está actualmente bloqueado.%1 y otro(s) %n archivo(s) están bloqueados actualmente.%1 y otro(s) %n archivo(s) están bloqueados actualmente. - + %1 is currently locked. %1 está actualmente bloqueado. - + Sync Activity Actividad de la sincronización - + Could not read system exclude file No se ha podido leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una carpeta mayor de %1 MB ha sido añadida: %2. - + A folder from an external storage has been added. Una carpeta de almacenamiento externo ha sido añadida. - + Please go in the settings to select it if you wish to download it. Por favor vaya a opciones a seleccionarlo si desea descargar esto. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Se ha creado la carpeta %1 pero se excluyó de la sincronización con anterioridad. Los datos en su interior no se sincronizarán. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Se ha creado el archivo %1 pero se excluyó de la sincronización con anterioridad. No se sincronizará. - + 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). @@ -1600,7 +1835,7 @@ Esto significa que el cliente de sincronización podría no subir inmediatamente %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1846,7 @@ Si decides restaurar los archivos, volverán a sincronizarse con el servidor si Si decides eliminar los archivos, ya no los tendrás disponibles, a no ser que seas el propietario. - + 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. @@ -1621,17 +1856,17 @@ Esta eliminación será sincronizada con tu servidor, haciendo que esos archivos Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincronizados desde el servidor. - + Remove All Files? ¿Eliminar todos los archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1667,22 +1902,22 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron OCC::FolderMan - + Could not reset folder state No se ha podido restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Se ha encontrado un registro de sincronización antiguo "%1", que no se ha podido eliminar. Por favor, asegúrese de que ninguna aplicación lo está utilizando en este momento. - + (backup) (copia de seguridad) - + (backup %1) (copia de seguridad %1) @@ -1692,27 +1927,27 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron Estado no definido. - + Undefined state. Estado no definido. - + Waiting to start syncing. Esperando para comenzar la sincronización. - + Preparing for sync. Preparándose para sincronizar. - + Sync is running. Sincronización en funcionamiento. - + Sync finished with unresolved conflicts. La sincronización finalizó pero con conflictos sin resolver. @@ -1732,62 +1967,62 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron Interrumpido por el usuario. - + Last sync was successful. La última sincronización se ha realizado con éxito. - + Setup error. Error de configuración. - + Sync request was cancelled. La solicitud de sincronización fue cancelada. - + Sync is paused. La sincronización está en pausa. - + %1 (Sync is paused) %1 (Sincronización en pausa) - + No valid folder selected! ¡La carpeta seleccionada no es válida! - + The selected path does not exist! ¡La ruta seleccionada no existe! - + The selected path is not a folder! ¡La ruta seleccionada no es una carpeta! - + You have no permission to write to the selected folder! ¡No tiene permiso para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! El directorio local %1 ya contiene un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro. - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! El directorio local %1 está dentro de un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro. - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una tarea de sincronización entre el servidor y esta carpeta. Por favor elija otra carpeta local. @@ -1800,7 +2035,7 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron Añadir conexión para el directorio de sincronización - + File Archivo @@ -1808,152 +2043,156 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron OCC::FolderStatusModel - + You need to be connected to add a folder Necesita estar conectado para añadir una carpeta - + Click this button to add a folder to synchronize. Haga clic en este botón para añadir una carpeta a sincronizar - - + + Could not decrypt! + ¡No fue posible desencriptar! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Error mientras se cargaba la lista de carpetas desde el servidor. - + Fetching folder list from server … Obteniendo la lista de carpetas del servidor ... - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz clic para más detalles. - + Virtual file support is enabled. El soporte para archivos virtuales está activado. - + Signed out Cerrar sesión - + Synchronizing VirtualFiles with local folder Sincronizando archivos virtuales con carpeta local - + Synchronizing with local folder Sincronizando con carpeta local - + Checking for changes in remote "%1" Buscando cambios en carpeta remota "%1" - + Checking for changes in local "%1" Buscando cambios en carpeta local "%1" - + Reconciling changes Reconciliando cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando: %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargar %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Quedan pocos segundos, %1 de %2, archivo %3 de %4 - + %5 left, %1 of %2, file %3 of %4 %5 restantes, %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … Esperando ... - + Waiting for %n other folder(s) … Esperando a otra %n carpeta ...Esperando a %n carpeta(s)…Esperando a %n carpeta(s)… - + Preparing to sync … Preparando la sincronización ... @@ -2184,13 +2423,13 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron - + stable stable - + beta beta @@ -2242,32 +2481,32 @@ Si esto ha sido un accidente, y decides mantener tus archivos, serán re-sincron - + Create Debug Archive Crear archivo de depuración - + Server notifications that require attention. Notificaciones del servidor que requieren atención. - + Show call notification dialogs. Mostrar diálogos de notificación de llamadas. - + You cannot disable autostart because system-wide autostart is enabled. No puedes desactivar el inicio automático porque el inicio automático de todo el sistema está activado. - + Change update channel? ¿Cambiar el canal de actualización? - + 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. 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. @@ -2276,27 +2515,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Tenga en cuenta que esto sólo selecciona de qué grupo se tomarán las actualizaciones, y que no hay vuelta atrás: Por lo tanto volver del canal "beta" al canal "estable" normalmente no puede hacerse inmediatamente y significa esperar a una versión estable que sea más reciente que la versión beta instalada actualmente. - + Change update channel Cambiar canal de actualización - + Cancel Cancelar - + Zip Archives Archivos Zip - + Debug Archive Created Archivo de depuración creado - + Debug archive is created at %1 El archivo de depuración se ha creado en %1 @@ -2304,22 +2543,22 @@ Tenga en cuenta que esto sólo selecciona de qué grupo se tomarán las actualiz OCC::GetOrCreatePublicLinkShare - + Password for share required Se requiere contraseña para compartir - + Please enter a password for your link share: Por favor, introduce una contraseña para tu enlace compartido: - + Sharing error Error al compartir - + Could not retrieve or create the public link share. Error: %1 @@ -2557,6 +2796,11 @@ Los elementos que se permite su borrado se eliminarán si impiden que un directo Close Cerrar + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2892,60 +3136,60 @@ Nótese que usar cualquier opción de toma de registros a través de línea de c - + Use &virtual files instead of downloading content immediately %1 Usa &archivos virtuales en vez de descargar el contenido inmediatamente %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Los archivos virtuales no son compatibles con la carpeta raíz de la partición de Windows como carpeta local. Por favor, elija una subcarpeta válida bajo la letra de la unidad. - + %1 folder "%2" is synced to local folder "%3" %1 carpeta "%2" está sincronizada con la carpeta local "%3" - + Sync the folder "%1" Sincronizar la carpeta "%1" - + Warning: The local folder is not empty. Pick a resolution! Advertencia: La carpeta local no está vacía. ¡Elija una solución! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 espacio libre - + Virtual files are not available for the selected folder Los archivos virtuales no están disponiblespara la carpeta seleccionada - + Local Sync Folder Carpeta local de sincronización - - + + (%1) (%1) - + There isn't enough free space in the local folder! ¡No hay suficiente espacio libre en la carpeta local! @@ -3017,7 +3261,8 @@ Nótese que usar cualquier opción de toma de registros a través de línea de c OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Es imposible leer la hora de modificación del archivo en conflicto %1 @@ -3049,144 +3294,144 @@ Nótese que usar cualquier opción de toma de registros a través de línea de c OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado con éxito a %1: versión %2 %3 (%4)</font><br/><br/> - + Invalid URL URL no válida. - + Failed to connect to %1 at %2:<br/>%3 Fallo al conectar %1 a %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Tiempo de espera agotado mientras se intentaba conectar a %1 en %2 - + Trying to connect to %1 at %2 … Intentando conectar a %1 desde %2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. La petición autenticada al servidor ha sido redirigida a "%1". La URL es errónea, el servidor está mal configurado. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso denegado por el servidor. Para verificar que tiene acceso, <a href="%1">haga clic aquí</a> para acceder al servicio desde el navegador. - + There was an invalid response to an authenticated WebDAV request Ha habido una respuesta no válida a una solicitud autenticada de WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, configurándola para la sincronización.<br/><br/> - + Creating local sync folder %1 … Creando carpeta de sincronización local %1 ... - + OK OK - + failed. ha fallado. - + Could not create local folder %1 No se ha podido crear la carpeta local %1 - + No remote folder specified! ¡No se ha especificado ninguna carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 Creando carpeta en Nextcloud: %1 - + Remote folder %1 created successfully. Carpeta remota %1 creado correctamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectándola para sincronizacion. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta ha producido el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota ha fallado debido a que las credenciales proporcionadas son incorrectas!<br/>Por favor, vuelva atrás y compruebe sus credenciales</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota ha fallado, probablemente porque las credenciales proporcionadas son incorrectas.</font><br/>Por favor, vuelva atrás y compruebe sus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Creación %1 de carpeta remota ha fallado con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Se ha configarado una conexión de sincronización desde %1 al directorio remoto %2 - + Successfully connected to %1! ¡Conectado con éxito a %1! - + Connection to %1 could not be established. Please check again. No se ha podido establecer la conexión con %1. Por favor, compruébelo de nuevo. - + Folder rename failed Error al renombrar la carpeta - + Cannot 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. No se pudo eliminar y restaurar la carpeta porque ella o un archivo dentro de ella está abierto por otro programa. Por favor, cierre la carpeta o el archivo y pulsa en reintentar o cancelar la instalación. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Carpeta de sincronización local %1 creada con éxito</b></font> @@ -3209,12 +3454,12 @@ Nótese que usar cualquier opción de toma de registros a través de línea de c Cancelar - + Enable experimental feature? ¿Activar característica experimental? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3231,12 +3476,12 @@ Cambiar a este modo interrumpirá cualquier sincronización en proceso. Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de cualquier tipo de problema que pueda surgir. - + Enable experimental placeholder mode Activar modo experimental de marcador de posición - + Stay safe Mantente a salvo @@ -3265,162 +3510,167 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Los enlaces simbólicos no están soportados en la sincronización. - + File is listed on the ignore list. El archivo está en la lista de ignorados. - + File names ending with a period are not supported on this file system. Los nombres de archivo que terminan con un punto no son compatibles con este sistema de archivos. - + File names containing the character "%1" are not supported on this file system. Los nombres de archivo que contienen el carácter "%1" no son compatibles con este sistema de archivos. - + File name contains at least one invalid character El nombre del archivo contiene al menos un carácter no válido - + The file name is a reserved name on this file system. El nombre del archivo es una palabra reservada del sistema de archivos. - + Filename contains trailing spaces. El nombre del archivo contiene espacios finales. - + Filename contains leading spaces. El nombre del archivo contiene espacios iniciales. - + Filename contains leading and trailing spaces. El nombre del archivo contiene espacios iniciales y finales. - + Filename is too long. El nombre del archivo es demasiado largo. - + File/Folder is ignored because it's hidden. El archivo o carpeta es ignorado porque está oculto. - + Stat failed. Stat ha fallado. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflicto: Versión del servidor descargada, la copia local ha sido renombrada pero no se ha podido subir. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Conflicto de capitalización: Se descargó el archivo del servidor y se renombró para evitar el conflicto. + + + The filename cannot be encoded on your file system. El nombre de archivo no se puede codificar en tu sistema de archivos. - + The filename is blacklisted on the server. El nombre del archivo está prohibido en el servidor. - + File has extension reserved for virtual files. El archivo tiene una extensión reservada para archivos virtuales. - + size tamaño - + permission permisos - + file id identificador de archivo - + Server reported no %1 El servidor informó de no %1 - + Cannot sync due to invalid modification time No se puede sincronizar debido a una hora de modificación no válida - + Error while deleting file record %1 from the database Error mientras se borraba el registro de archivo %1 de la base de datos - + Conflict when uploading a folder. It's going to get cleared! Se ha producido un conflicto al subir una carpeta. ¡Se eliminará! - + Conflict when uploading a file. It's going to get removed! Se ha producido un conflicto al subir un archivo. ¡Se eliminará! - + Ignored because of the "choose what to sync" blacklist Ignorado porque se encuentra en la lista negra de «elija qué va a sincronizar» - + Not allowed because you don't have permission to add subfolders to that folder No permitido porque no tienes permiso para añadir subcarpetas a esa carpeta. - + Not allowed because you don't have permission to add files in that folder No permitido porque no tienes permiso para añadir archivos a esa carpeta. - + Not allowed to upload this file because it is read-only on the server, restoring No está permitido subir este archivo porque es de solo lectura en el servidor, restaurando. - + Moved to invalid target, restoring Movido a un lugar no válido, restaurando - + Not allowed to remove, restoring No está permitido borrar, restaurando - + Error while reading the database Error mientras se leía la base de datos - + Server replied with an error while reading directory "%1" : %2 El servidor contestó con un error al leer el directorio "%1" : %2 @@ -3428,22 +3678,22 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::PropagateDirectory - + could not delete file %1 from local DB no fue posible borrar el archivo %1 de la base de datos local - + Error updating metadata due to invalid modification time Error al actualizar los metadatos debido a una hora de modificación no válida - + Error updating metadata: %1 Error al actualizar los metadatos: %1 - + File is currently in use El archivo se encuentra en uso @@ -3456,19 +3706,19 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c no fue posible obtener el archivo %1 de la base de datos local - + File %1 cannot be downloaded because encryption information is missing. El archivo %1 no puede ser descargado porque falta la información de cifrado, - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB No fue posible borrar el registro del archivo %1 de la base de datos local @@ -3479,32 +3729,32 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c ¡El archivo %1 no se pudo descargar a causa de un conflicto con el nombre de un archivo local! - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no se puede descargar a causa de un conflicto con el nombre de un archivo local! - + The download would reduce free local disk space below the limit La descarga reducirá el espacio libre local por debajo del límite. - + Free space on disk is less than %1 El espacio libre en el disco es inferior a %1 - + File was deleted from server Se ha eliminado el archivo del servidor - + The file could not be downloaded completely. No se ha podido descargar el archivo completamente. - + The downloaded file is empty, but the server said it should have been %1. El archivo descargado está vacío, aunque el servidor dijo que debía ocupar %1. @@ -3514,18 +3764,23 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c ¡El archivo %1 no puede guardarse debido a un conflicto con el nombre de otro archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. El servidor informa que el archivo %1 tiene una hora de modificación no válida. No lo guardes. - + + File %1 downloaded but it resulted in a local file name clash! + ¡El archivo %1 se descargó pero resultó en un conflicto con el nombre de un archivo local! + + + Error updating metadata: %1 Error al actualizar los metadatos: %1 - + The file %1 is currently in use El archivo %1 se encuentra en uso @@ -3546,7 +3801,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no se ha podido borrar el archivo %1, error: %2 @@ -3557,16 +3812,21 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c + Folder %1 cannot be created because of a local file or folder name clash! + ¡La carpeta %1 no se pudo crear a causa de un conflicto con el nombre de un archivo o carpeta local! + + + Could not create folder %1 No se pudo crear la carpeta %1 - + Error updating metadata: %1 Error al actualizar los metadatos: %1 - + The file %1 is currently in use El archivo %1 se encuentra en uso @@ -3574,7 +3834,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No se ha podido eliminar %1 por causa de un conflicto con el nombre de un archivo local @@ -3587,46 +3847,51 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash El archivo %1 no se pudo renombrar a %2 a causa de un conflicto con el nombre de un archivo local - - - + + File %1 downloaded but it resulted in a local file name clash! + ¡El archivo %1 se descargó pero resultó en un conflicto con el nombre de un archivo local! + + + + + could not get file %1 from local DB no fue posible obtener el archivo %1 de la base de datos local - + Error setting pin state Error al configurar el estado fijado - - + + Error updating metadata: %1 Error al actualizar los metadatos: %1 - + The file %1 is currently in use El archivo %1 se encuentra en uso - - + + Could not delete file record %1 from local DB No fue posible borrar el registro del archivo %1 de la base de datos local - + Failed to propagate directory rename in hierarchy Fallo al propagar el renombrado de carpeta en la jerarquía - + Failed to rename file Fallo al renombrar el archivo @@ -3647,7 +3912,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". El código HTTP devuelto por el servidor es erróneo. Se esperaba 204, pero se recibió "%1 %2". @@ -3660,12 +3925,12 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c El código HTTP devuelto por el servidor es erróneo. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 Error al escribir los metadatos en la base de datos: %1 - + The file %1 is currently in use El archivo %1 se encuentra en uso @@ -3673,42 +3938,42 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 No se puede renombrar %1 a %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". El código HTTP devuelto por el servidor es erróneo. Esperado 201, pero recibido "%1 %2". - + could not get file %1 from local DB no fue posible obtener el archivo %1 de la base de datos local - + Could not delete file record %1 from local DB No fue posible borrar el registro del archivo %1 de la base de datos local - + Error updating metadata: %1 Error al actualizar los metadatos: %1 - + The file %1 is currently in use El archivo %1 se encuentra en uso - + Error setting pin state Error al configurar el estado fijado - + Error writing metadata to the database Error al escribir los metadatos en la base de datos @@ -3898,7 +4163,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::ServerNotificationHandler - + Reply Responder @@ -3916,23 +4181,23 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Ajustes - + %1 Settings This name refers to the application name e.g Nextcloud %1 Configuración - + General General - + Network Red - + Account Cuenta @@ -3940,17 +4205,22 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::ShareModel - + Share link Compartir enlace - + Link share Compartición de enlace - + + Internal link + Enlace interno + + + Enter a note for the recipient Ingrese una nota para el destinatario @@ -4026,7 +4296,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4035,132 +4305,171 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::SocketApi - + + Failed to encrypt folder at "%1" + No se pudo cifrar carpeta en "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + La cuenta %1 no tiene el cifrado de extremo a extremo configurado. Por favor configure esto en sus opciones de cuenta para habilitar el cifrado de carpetas. + + + + Failed to encrypt folder + Fallo al cifrar la carpeta + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + No se pudo cifrar la siguiente carpeta: "%1" + +El servidor respondió con el error: %2 + + + + Folder encrypted successfully + Se cifró la carpeta exitosamente + + + + The following folder was encrypted successfully: "%1" + La siguiente carpeta se cifró con éxito: "%1" + + + Context menu share Compartir en menú contextual - + Select new location … Seleccione nueva ubicación … - + I shared something with you He compartido algo contigo - - + + Share options Opciones de compartir - - + + Activity Actividad - + Copy private link to clipboard Copiar enlace privado al portapapeles - + Send private link by email … Enviar enlace privado por correo electrónico ... + + + Expire in %1 minutes + remaining time before lock expire + Caduca en %1 minutoCaduca en %1 minutosCaduca en %1 minutos + - + Leave this share Salir de este compartido - + Resharing this file is not allowed No está permitido compartir de nuevo - + Resharing this folder is not allowed No está permitido compartir de nuevo esta carpeta - - + + Copy public link Copiar enlace público - + Copy internal link Copiar enlace interno - + + Encrypt + Cifrar + + + Lock file Bloquear archivo - + Unlock file Desbloquear archivo - + Locked by %1 Bloqueado por %1 - - Expire in %1 minutes - remaining time before lock expire - Caduca en %1 minutoCaduca en %1 minutosCaduca en %1 minutos - - - + Expires in %1 minutes remaining time before lock expires Expira en %1 minutoExpira en %1 minutosExpira en %1 minutos - + Edit Editar - + Open in browser Abrir en navegador - + Resolve conflict … Resolver conflicto … - + Move and rename … Mover y renombrar … - + Move, rename and upload … Mover, renombrar y subir … - + Delete local changes Borra cambios en local - + Move and upload … Mover y subir … - + Delete Eliminar @@ -4378,63 +4687,63 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (no realizado por el error anterior, intente de nuevo %2) - + Could not update file: %1 No se pudo actualizar el archivo: %1 - + Could not update virtual file metadata: %1 No se ha podido actualizar los metadatos del archivo virtual: %1 - + Could not update file metadata: %1 No se pudo actualizar los metadatos del archivo: %1 - + Could not set file record to local DB: %1 No fue posible establecer el registro del archivo a la base de datos local: %1 - + Unresolved conflict. Conflicto sin resolver. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo %1 disponible, se necesita por lo menos %2 para comenzar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Imposible abrir o crear la BBDD local de sync. Asegurese de que tiene permisos de escritura en la carpeta de sync. - + Using virtual files with suffix, but suffix is not set Usando archivos virtuales con sufijo, pero el sufijo no está establecido - + Unable to read the blacklist from the local database No se pudo leer la lista de bloqueo de la base de datos local - + Unable to read from the sync journal. No se ha podido leer desde el registro de sincronización - + Cannot open the sync journal No es posible abrir el diario de sincronización @@ -4444,12 +4753,12 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c La sincronización continuará en breves. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Poco espacio libre en disco: La descarga lo reducirá por debajo del %1, deberia abortar. - + There is insufficient space available on the server for some uploads. No hay suficiente espacio libre en el servidor para algunas subidas. @@ -4518,59 +4827,59 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::Systray - + Download Descargar - + Add account Agregar cuenta - + Open main dialog Abrir diálogo principal - - + + Pause sync Pausar sincronización - - + + Resume sync Continuar sincronización - + Settings Ajustes - + Help Ayuda - + Exit %1 Salir %1 - + Pause sync for all Pausar sincronización a todos - + Resume sync for all Continuar sincronización a todos - + %1: %2 %1: %2 @@ -4578,24 +4887,24 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 - Cliente de escritorio</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versión %1. Para obtener más información, haga clic <a href='%2'> aquí </a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Usando el plugin de archivos virtuales: %1</small></p> - + <p>This release was supplied by %1</p> <p>Esta versión ha sido suministrada por %1</p> @@ -4603,22 +4912,22 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Fallo al recuperar los proveedores. - + Failed to fetch search providers for '%1'. Error: %2 Fallo al recuperar los proveedores de búsqueda para '%1'. Error: %2 - + Search has failed for '%2'. La búsqueda ha fallado para '%2'. - + Search has failed for '%1'. Error: %2 La búsqueda ha fallado para '%1'. Error: %2 @@ -4626,30 +4935,36 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::User - + Retry all uploads Reintentar todas las subidas + + + + Resolve conflict + Resolver conflicto + OCC::UserModel - + Confirm Account Removal Confirma la eliminación de cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿De verdad quieres eliminar la conexión con la cuenta <i>%1</i>?</p><p><b>Aviso:</b> Esto <b>no eliminará</b> ningún archivo.</p> - + Remove connection Eliminar vinculación - + Cancel Cancelar @@ -4787,8 +5102,8 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Error al actualizar los metadatos debido a una fecha de modificación no válida. @@ -4796,8 +5111,8 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Error al actualizar los metadatos debido a una fecha de modificación no válida. @@ -4895,123 +5210,123 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c OCC::ownCloudGui - + Unsupported Server Version Versión del servidor no soportada - + 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. El servidor en la cuenta %1 usa una versión no soportada %2. El uso de este cliente con versiones de servidor no soportadas no ha sido probado y es potencialmente peligroso. Continúa bajo tu propio riesgo. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado desde varias cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado desde cuentas: - + Account %1: %2 Cuenta %1: %2 - + Please sign in Por favor, inicie sesión - + Signed out Cerrar sesión - + Account synchronization is disabled La sincronización está deshabilitada - - + + Synchronization is paused La sincronización se ha detenido - + Folder %1: %2 Archivo %1: %2 - + Unresolved conflicts Conflictos sin resolver - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No hay carpetas configuradas para sincronizar. - + No sync folders configured No hay carpetas sincronizado configuradas - + Checking for changes in remote "%1" Buscando cambios en carpeta remota "%1" - + Checking for changes in local "%1" Buscando cambios en carpeta local "%1" - + Syncing %1 of %2 (%3 left) Sincronizando %1 de %2 (quedan %3) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (quedan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5163,27 +5478,27 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Nueva carpeta - + You renamed %1 Has renombrado %1 - + You deleted %1 Has borrado %1 - + You created %1 Has creado %1 - + You changed %1 Has cambiado %1 - + Synced %1 Sincronizado %1 @@ -5249,30 +5564,106 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Marcar como leído + + ShareDelegate + + + Create a new share link + Crear un nuevo enlace de recurso compartido + + + + Copy share link location + Copiar dirección del recurso compartido + + + + Share options + Opciones del recurso compartido + + + + ShareDetailsPage + + + An error occurred setting the share password. + Ocurrió un error al establecer la contraseña del recurso compartido + + + + Edit share + Editar recurso compartido + + + + Dismiss + Descartar + + + + Share label + Etiqueta del recurso compartido + + + + Allow editing + Permitir edición + + + + Password protect + Proteger con contraseña + + + + Set expiration date + Fijar fecha de caducidad + + + + Note to recipient + Nota para el destinatario + + + + Unshare + Dejar de compartir + + + + Add another link + Añadir otro enlace + + + + Copy share link + Copiar enlace de recurso compartido + + ShareView - + Password required for new share Se requiere una contraseña para la nueva compartición - + Share password Contraseña de la compartición - + Sharing is disabled Compartir está deshabilitado - + This item cannot be shared. Este ítem no puede ser compartido. - + Sharing is disabled. Compartir está deshabilitado. @@ -5288,7 +5679,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c SyncJournalDb - + Failed to connect database. Fallo en la conexión a la base de datos. @@ -5346,6 +5737,22 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Cargar más resultados + + UnifiedSearchResultNothingFound + + + No results for + No se encontraron resultados para + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Sección %1 de resultados de búsqueda + + UserLine @@ -5409,67 +5816,67 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c UserStatusSelector - + Online status Estado en línea - + Online En línea - + Away Ausente - + Do not disturb No molestar - + Mute all notifications Silenciar todas las notificaciones - + Invisible Invisible - + Appear offline Mostrar como fuera de línea - + Status message Mensaje de estado - + What is your status? ¿Cuál es su estado? - + Clear status message after Borrar el mensaje de estado después de - + Cancel Cancelar - + Clear status message Borrar el mensaje de estado - + Set status message Establecer un mensaje de estado @@ -5553,24 +5960,24 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Window - + Nextcloud desktop main dialog Cuadro de diálogo principal de escritorio de Nextcloud - + Current account Cuenta actual - - + + Resume sync for all Continuar sincronización para todos - - + + Pause sync for all Pausar sincronización para todos @@ -5580,22 +5987,22 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Cambiar el estado del usuario - + Add account Agregar cuenta - + Add new account Añadir cuenta nueva - + Settings Ajustes - + Exit Salir @@ -5604,11 +6011,6 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c Current user avatar Avatar del usuario actual - - - Current account avatar - Avatar del usuario actual - Current user status is online @@ -5620,70 +6022,75 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c El estado actual del usuario es no molestar - + + Current account avatar + Avatar del usuario actual + + + Current account status is online El estado actual del usuario es en línea - + Current account status is do not disturb El estado actual del usuario es no molestar - + + %1 - File activity + %1 - Actividad del archivo + + + Account switcher and settings menu Cambiador de cuentas y menú de configuración - + Open local folder of current account Abrir carpeta local de la cuenta actual - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser Abrir Nextcloud Talk en el navegador - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list Unificar la lista de resultados de la búsqueda - - - %1 - File activity - %1 - Actividad del archivo - main.cpp - + System Tray not available La bandeja del sistema no está disponible - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 requiere una bandeja del sistema de trabajo. Si estás ejecutando XFCE, por favor, siga <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">estas instrucciones</a>. Por otro lado, instale una bandeja del sistema de aplicaciones como "trayer" e inténtelo de nuevo. @@ -5691,7 +6098,7 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Construido desde la revisión Git <a href="%1">%2</a> en %3, %4, usando Qt %5, %6</small></p> @@ -5725,72 +6132,77 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c + Server version downloaded, copied changed local file into case conflict conflict file + Se descargó la versión del servidor, se copió el archivo local cambiado hacia archivo con conflictos de capitalización + + + Deleted Eliminado - + Moved to %1 Movido a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizados metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading subiendo - + deleting eliminando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando metadatos locales diff --git a/translations/client_es_CL.ts b/translations/client_es_CL.ts index ea975e5a3..9e59b0c0b 100644 --- a/translations/client_es_CL.ts +++ b/translations/client_es_CL.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_CO.ts b/translations/client_es_CO.ts index 5835d7088..cb46fce95 100644 --- a/translations/client_es_CO.ts +++ b/translations/client_es_CO.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_CR.ts b/translations/client_es_CR.ts index 2117f49bd..c958ecfda 100644 --- a/translations/client_es_CR.ts +++ b/translations/client_es_CR.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_DO.ts b/translations/client_es_DO.ts index b8a7f6288..97f5dcb68 100644 --- a/translations/client_es_DO.ts +++ b/translations/client_es_DO.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_EC.ts b/translations/client_es_EC.ts index 5f18d6c52..f8c4e00a2 100644 --- a/translations/client_es_EC.ts +++ b/translations/client_es_EC.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_GT.ts b/translations/client_es_GT.ts index 500fdaf97..302d68562 100644 --- a/translations/client_es_GT.ts +++ b/translations/client_es_GT.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_HN.ts b/translations/client_es_HN.ts index 7e05c25d9..af85ffc3f 100644 --- a/translations/client_es_HN.ts +++ b/translations/client_es_HN.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_MX.ts b/translations/client_es_MX.ts index 2de0e1788..7f5b96d94 100644 --- a/translations/client_es_MX.ts +++ b/translations/client_es_MX.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link Copiar enlace público - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_es_SV.ts b/translations/client_es_SV.ts index 224980ae2..8f1f93430 100644 --- a/translations/client_es_SV.ts +++ b/translations/client_es_SV.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. No hay cuentas configuradas. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir carpeta - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Elige que sincronizar - + Force sync now Forzar la sincronización ahora - + Restart sync Reiniciar sincronización - + Resume sync Reanudar sincronización - + Pause sync Pausar sincronización - + Remove folder sync connection Eliminar la conexión de sincronización de carpetas - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Falló la creación de la carpeta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar la Eliminación de la Conexión de Sincronización de Carpeta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres dejar de sincronizar la carpeta <i>%1</i>?<p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove Folder Sync Connection Eliminar la Conexión de Sincronización de la Carpeta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en curso - + The syncing operation is running.<br/>Do you want to terminate it? La operación de sincronización está en curso. <br/>¿Deseas terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algunas carpetas, incluidas carpetas montadas en red o carpetas compartidas, pueden tener diferentes límites - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente no hay información disponible del espacio usado. - + %1 in use %1 en uso - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. El servidor %1 se encuntra temporalmente no disponible - + Server %1 is currently in maintenance mode. Actualmente el servidor %1 se encuentra en modo mantenimiento. - + Signed out from %1. Cerraste sesión en %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obteniendo autorización del navegador. <a href='%1'>Haz click aquí</a> para re-abrir el navegador. - + Connecting to %1 … - + No connection to %1 at %2. No hay conexión a %1 en %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. No hay %1 conexión configurada. - + There are folders that were not synchronized because they are too big: Hay carpetas que no fueron sincronizadas porque son demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hay carpetas que no fueron sincronizadas porque son de almacenamiento externo: - + There are folders that were not synchronized because they are too big or external storages: Hay carpetas que no fueron sincronizadas porque son demasiado grandes o son de almacenamiento externo: - + Confirm Account Removal Confirma la Remosion de la Cuenta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>¿Realmente quieres eliminar la conexión a la cuenta <i>%1</i>?</p><p><b>Nota:</b> Esto <b>no</b> borrará ningún archivo.</p> - + Remove connection Eliminar conexión - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Error al acceder el archivo de configuración @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error al escribir metadatos a la base de datos @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. La carpeta local %1 no existe. - + %1 should be a folder but is not. %1 debería ser una carpeta pero no lo es. - + %1 is not readable. No se puede leer %1. - + %1 and %n other file(s) have been removed. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. %1 y %n otro(s) archivo(s) han sido eliminados. - + %1 has been removed. %1 names a file. %1 ha sido eliminado. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados.%1 y %n otro(s) archivo(s) han sido actualizados. - + %1 has been updated. %1 names a file. %1 ha sido actualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. %1 ha sido renombrado como %2 y %n otro(s) archivo(s) han sido renombrados. - + %1 has been renamed to %2. %1 and %2 name files. %1 ha sido renombrado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos.%1 se ha movido a %2 y %n otro(s) archivo(s) han sido movidos. - + %1 has been moved to %2. %1 se ha movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización.%1 y %n otro(s) archivo(s) tienen confictos de sincronización. - + %1 has a sync conflict. Please check the conflict file! %1 tiene un conflicto de sincronización. ¡Por favor verifica el archivo con conflicto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. %1 y %n otro(s) archivo(s) no puideron ser sincronizado por errores. Consulta la bitácora para más detalles. - + %1 could not be synced due to an error. See the log for details. %1 no pudo ser sincronizado por un error. Consulta la bitácora para más detalles. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sincronizar Actividad - + Could not read system exclude file No fue posible leer el archivo de exclusión del sistema - + A new folder larger than %1 MB has been added: %2. Una nueva carpeta de más de %1 MB ha sido agregada: %2 - + A folder from an external storage has been added. Una carpeta de un almacenamiento externo ha sido agregada. - + Please go in the settings to select it if you wish to download it. Por favor ve a las configuraciones para seleccionarlo si deseas descargarlo. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ¿Eliminar Todos los Archivos? - + Remove all files Eliminar todos los archivos - + Keep files Mantener archivos @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state No fue posible restablecer el estado de la carpeta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (respaldo) - + (backup %1) (respaldo %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado no definido. - + Undefined state. - + Waiting to start syncing. Agurardando para iniciar la sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. La Sincronización está en curso. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado por el Usuario. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronización está pausada. - + %1 (Sync is paused) %1 (La sincronización está pausada) - + No valid folder selected! ¡No se ha seleccionado una carpeta válida! - + The selected path does not exist! - + The selected path is not a folder! ¡La ruta seleccionada no es de una carpeta! - + You have no permission to write to the selected folder! ¡No tienes permisos para escribir en la carpeta seleccionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La carpeta local %1 contiene una carpeta ya usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La carpeta local %1 ya está contenida en una carpeta usada en una conexión de sincronización de carpeta. ¡Por favor elige otra! - + There is already a sync from the server to this local folder. Please pick another local folder! Ya existe una sincronización desde el servidor a esta carpeta local. ¡Por favor elige otra carpeta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Agregar una Conexión de Sincronización de Carpeta - + File Archivo @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Neceistas estar conectado para agregar una carpeta - + Click this button to add a folder to synchronize. Haz click en este botón para agregar una carpeta a sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Se presentó un error al cargar la lista de carpetas desde el servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Hay conflictos sin resolver. Haz click para más detalles. - + Virtual file support is enabled. - + Signed out Sesión cerrada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliando los cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargando %1/seg - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) cargando %1/seg - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 faltan %5 , %1 de %2, archivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archivo %3 de %4 - + file %1 of %2 archivo %1 de %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Carpeta de Sincronización Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado exitosamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL Inválido - + Failed to connect to %1 at %2:<br/>%3 Hubo una falla al conectarse a %1 en %2: <br/>%3 - + Timeout while trying to connect to %1 at %2. Expiró el tiempo al tratar de conectarse a %1 en %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido por el servidor. Para verificar que tengas el acceso correcto, <a href="%1">haz click aquí</a> para acceder al servicio con tu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La carpeta de sincronización local %1 ya existe, preparandola para la sincronización. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. falló. - + Could not create local folder %1 No fue posible crear la carpeta local %1 - + No remote folder specified! ¡No se especificó la carpeta remota! - + Error: %1 Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. La carpeta remota %1 fue creada exitosamente. - + The remote folder %1 already exists. Connecting it for syncing. La carpeta remota %1 ya existe. Conectandola para sincronizar. - - + + The folder creation resulted in HTTP error code %1 La creación de la carpeta dio como resultado el código de error HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ¡La creación de la carpeta remota falló porque las credenciales proporcionadas están mal!<br/> Por favor regresa y verifica tus credenciales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creación de la carpeta remota falló probablemente porque las credenciales proporcionadas son incorrectas. </font><br/> Por favor regresa y verifica tus credenciales.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La creación de la carpeta remota %1 falló con el error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una conexión de sincronización de %1 al directorio remoto %2 fue establecida. - + Successfully connected to %1! ¡Conectado exitosamente a %1! - + Connection to %1 could not be established. Please check again. No se pudo establecer la conexión a %1. Por favor verifica de nuevo. - + Folder rename failed Falla al renombrar la carpeta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>¡La carpeta de sincronización local %1 fue creada exitosamente!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery El archivo ha cambiado desde que fue descubierto - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! ¡El archivo %1 no puede ser descargado porque hay un conflicto con el nombre del archivo local! - + The download would reduce free local disk space below the limit La descarga reduciría el espacio local disponible por debajo del límite - + Free space on disk is less than %1 El espacio disponible en disco es menos del 1% - + File was deleted from server El archivo fue borrado del servidor - + The file could not be downloaded completely. El archivo no pudo ser descargado por completo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss ¡El archivo %1 no puede ser guardado debido a un conflicto en su nombre con un archivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no fue posible borrar el archivo %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No fue posible eliminar %1 porque hay un conflicto con el nombre de archivo local @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código equivocado de HTTP regresado por el servidor. Se esperaba 201, pero se recibió "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Error al escribir los metadatos a la base de datos @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Configuraciones - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Red - + Account Cuenta @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Te compartí algo - - + + Share options - - + + Activity - + Copy private link to clipboard Copiar la liga privada al portapapeles - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Borrar @@ -4345,63 +4651,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por un error previo, intentando de nuevo en %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflicto no resuelto. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Solo tiene %1 disponible, se necesita de al menos %2 para iniciar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. No fue posible abrir o crear la base de datos de sincronización local. Asegúrate de que tengas permisos de escritura en la carpeta de sincronización. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database No fue posible leer la lista negra de la base de datos local - + Unable to read from the sync journal. No es posible leer desde el diario de sincronización. - + Cannot open the sync journal No se puede abrir el diario de sincronización @@ -4411,12 +4717,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Espacio en disco bajo: Las descargas que podrían reducir el espacio por debajo de %1 se omitieron. - + There is insufficient space available on the server for some uploads. No hay espacio disponible en el servidor para algunas cargas. @@ -4485,59 +4791,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Agregar cuenta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configuraciones - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4545,24 +4851,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4570,22 +4876,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4593,30 +4899,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4754,8 +5066,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4763,8 +5075,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4862,123 +5174,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versión del Servidor No Soportada - + 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. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algunas cuentas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de las cunetas: - + Account %1: %2 Cuenta %1 : %2 - + Please sign in Por favor inicia sesión - + Signed out Sesión cerrada - + Account synchronization is disabled La sincronización de cuentas está deshabilitada - - + + Synchronization is paused La sincronización está pausada - + Folder %1: %2 Carpeta %1 : %2 - + Unresolved conflicts - + Up to date Actualizado - + Error during synchronization Error durante la sincronización - + There are no sync folders configured. No se han configurado carpetas para sincronizar - + No sync folders configured No se han configurado carpetas de sincronización - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (faltan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5130,27 +5442,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5216,30 +5528,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5255,7 +5643,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5313,6 +5701,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5376,67 +5780,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5520,24 +5924,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cuenta actual - - + + Resume sync for all - - + + Pause sync for all @@ -5547,22 +5951,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Agregar cuenta - + Add new account - + Settings Configuraciones - + Exit Salir @@ -5571,11 +5975,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5587,70 +5986,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser - + More apps Más aplicaciones - + Open %1 in browser Abrir %1 en el navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available La Bandeja del Sistema no está disponible. - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5658,7 +6062,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5692,72 +6096,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Borrado - + Moved to %1 Se movió a %1 - + Ignored Ignorado - + Filesystem access error Error de acceso al sistema de archivos - + Error Error - + Updated local metadata Actualizando los metadatos locales - + Unknown Desconocido - + downloading descargando - + uploading cargando - + deleting borrando - + moving moviendo - + ignoring ignorando - + error error - + updating local metadata actualizando los metadatos locales diff --git a/translations/client_et.ts b/translations/client_et.ts index 1c8d2e1a5..edce8082a 100644 --- a/translations/client_et.ts +++ b/translations/client_et.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Loobu @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Ühtegi kontot pole seadistatud - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ - + + End-to-end encryption has been enabled for this account + + + + Warning Hoiatus - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Ava kaust - + Encrypt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Vali, mida sünkroniseerida - + Force sync now - + Restart sync - + Resume sync Taasta sünroonimist - + Pause sync Peata sünkroonimine - + Remove folder sync connection - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Kausta loomine ebaõnnestus - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove Folder Sync Connection - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sünkroniseerimine on käimas - + The syncing operation is running.<br/>Do you want to terminate it? Sünkroniseerimine on käimas.<br/>Kas sa soovid seda lõpetada? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. - + %1 of %2 in use - + Currently there is no storage usage information available. Hetkel pole mahu kasutuse info saadaval. - + %1 in use %1 kasutusel - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Ühendatud %1 - + Server %1 is temporarily unavailable. Server %1 pole ajutiselt saadaval. - + Server %1 is currently in maintenance mode. - + Signed out from %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1 … - + No connection to %1 at %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. Ühtegi %1 ühendust pole seadistatud. - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Kinnita konto eemaldamine - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Eemalda ühendus - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,143 +1675,143 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Kohalikku kausta %1 pole olemas. - + %1 should be a folder but is not. - + %1 is not readable. %1 pole loetav. - + %1 and %n other file(s) have been removed. - + %1 has been removed. %1 names a file. %1 on eemaldatud. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. - + %1 has been updated. %1 names a file. %1 on uuendatud. - + %1 has been renamed to %2 and %n other file(s) have been renamed. - + %1 has been renamed to %2. %1 and %2 name files. %1 on ümber nimetatud %2. - + %1 has been moved to %2 and %n other file(s) have been moved. - + %1 has been moved to %2. %1 on tõstetud %2. - + %1 has and %n other file(s) have sync conflicts. - + %1 has a sync conflict. Please check the conflict file! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. - + %1 could not be synced due to an error. See the log for details. %1 sünkroniseerimine ebaõnnestus tõrke tõttu. Lisainfot vaata logist. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sünkroniseerimise tegevus - + Could not read system exclude file Süsteemi väljajätmiste faili lugemine ebaõnnestus - + A new folder larger than %1 MB has been added: %2. - + A folder from an external storage has been added. - + Please go in the settings to select it if you wish to download it. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1586,7 +1820,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1594,24 +1828,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Kustutada kõik failid? - + Remove all files Kustutada kõik failid - + Keep files Säilita failid @@ -1647,22 +1881,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Ei suutnud tühistada kataloogi staatust - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (varukoopia) - + (backup %1) (varukoopia %1) @@ -1672,27 +1906,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Määramata staatus. - + Undefined state. - + Waiting to start syncing. Oodatakse sünkroonimise alustamist. - + Preparing for sync. Valmistun sünkroniseerima. - + Sync is running. Sünkroniseerimine on käimas. - + Sync finished with unresolved conflicts. @@ -1712,62 +1946,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Kasutaja tühistamine. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sünkroniseerimine on peatatud. - + %1 (Sync is paused) %1 (Sünkroniseerimine on peatatud) - + No valid folder selected! Sobilikku kausta pole valitud! - + The selected path does not exist! - + The selected path is not a folder! Valitud asukoht pole kaust! - + You have no permission to write to the selected folder! Sul puuduvad õigused valitud kataloogi kirjutamiseks! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! @@ -1780,7 +2014,7 @@ If this was an accident and you decide to keep your files, they will be re-synce - + File Fail @@ -1788,152 +2022,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Kausta lisamiseks pead sa olema ühendatud - + Click this button to add a folder to synchronize. Sünkroniseeritava kausta lisamiseks kliki sellele nupule. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. - + Virtual file support is enabled. - + Signed out Välja logitud - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sünkroniseerimine %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) allalaadimine %1/s - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) üleslaadimine %1/s - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 / %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 / %2, fail %3 / %4 - + file %1 of %2 fail %1 / %2-st - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2164,13 +2402,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2222,59 +2460,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2282,22 +2520,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2531,6 +2769,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2863,60 +3106,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Kohalik Sync Kataloog - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2988,7 +3231,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3020,144 +3264,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Edukalt ühendatud %1: %2 versioon %3 (4)</font><br/><br/> - + Invalid URL - + Failed to connect to %1 at %2:<br/>%3 Ühendumine ebaõnnestus %1 %2-st:<br/>%3 - + Timeout while trying to connect to %1 at %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Kohalik kataloog %1 on juba olemas. Valmistan selle ette sünkroniseerimiseks. - + Creating local sync folder %1 … - + OK - + failed. ebaõnnestus. - + Could not create local folder %1 Ei suuda tekitada kohalikku kataloogi %1 - + No remote folder specified! Ühtegi võrgukataloogi pole määratletud! - + Error: %1 Viga: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. Eemalolev kaust %1 on loodud. - + The remote folder %1 already exists. Connecting it for syncing. Serveris on kataloog %1 juba olemas. Ühendan selle sünkroniseerimiseks. - - + + The folder creation resulted in HTTP error code %1 Kausta tekitamine lõppes HTTP veakoodiga %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Kataloogi loomine serverisse ebaõnnestus, kuna kasutajatõendid on valed!<br/>Palun kontrolli oma kasutajatunnust ja parooli.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Serveris oleva kataloogi tekitamine ebaõnnestus tõenäoliselt valede kasutajatunnuste tõttu.</font><br/>Palun mine tagasi ning kontrolli kasutajatunnust ning parooli.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Kataloogi %1 tekitamine serverisse ebaõnnestus veaga <tt>%2</tt> - + A sync connection from %1 to remote directory %2 was set up. Loodi sünkroniseerimisühendus kataloogist %1 serveri kataloogi %2 - + Successfully connected to %1! Edukalt ühendatud %1! - + Connection to %1 could not be established. Please check again. Ühenduse loomine %1 ebaõnnestus. Palun kontrolli uuesti. - + Folder rename failed Kataloogi ümbernimetamine ebaõnnestus - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Kohalik kataloog %1 edukalt loodud!</b></font> @@ -3180,12 +3424,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3196,12 +3440,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3230,162 +3474,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3393,22 +3642,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3421,19 +3670,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Faili on pärast avastamist muudetud - + Could not delete file record %1 from local DB @@ -3444,32 +3693,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Faili %1 ei saa alla laadida kuna on konflikt kohaliku faili nimega. - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 - + File was deleted from server Fail on serverist kustutatud - + The file could not be downloaded completely. Faili täielik allalaadimine ebaõnnestus. - + The downloaded file is empty, but the server said it should have been %1. @@ -3479,18 +3728,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Faili %1 ei saa salvestada kuna on nime konflikt kohaliku failiga! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3511,7 +3765,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ei saa kustutada faili %1, viga: %2 @@ -3522,16 +3776,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3539,7 +3798,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Ei saa eemaldada %1 kuna on konflikt kohaliku faili nimega @@ -3552,46 +3811,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3612,7 +3876,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3625,12 +3889,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Server saatis vale HTTP koodi. Ootuspärane kood oli 201, aga saadeti kood "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3638,42 +3902,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Server saatis vale HTTP koodi. Ootuspärane kood oli 201, aga saadeti kood "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database @@ -3863,7 +4127,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3881,23 +4145,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Seaded - + %1 Settings This name refers to the application name e.g Nextcloud - + General Üldine - + Network Võrk - + Account Konto @@ -3905,17 +4169,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3991,7 +4260,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4000,132 +4269,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you - - + + Share options - - + + Activity - + Copy private link to clipboard - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link Kopeeri avalik link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Kustuta @@ -4343,63 +4649,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Ei suuda avada sünkroniseeringu zurnaali @@ -4409,12 +4715,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4483,59 +4789,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Lisa konto - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Seaded - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4543,24 +4849,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4568,22 +4874,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4591,30 +4897,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4752,8 +5064,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4761,8 +5073,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4860,123 +5172,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version - + 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. - + Disconnected Lahti ühendatud - + Disconnected from some accounts - + Disconnected from %1 - + Disconnected from accounts: Kontodest lahtiühendatud - + Account %1: %2 Konto %1: %2 - + Please sign in Palun logi sisse - + Signed out Välja logitud - + Account synchronization is disabled - - + + Synchronization is paused - + Folder %1: %2 Kaust %1: %2 - + Unresolved conflicts - + Up to date Ajakohane - + Error during synchronization - + There are no sync folders configured. Sünkroniseeritavaid kaustasid pole määratud. - + No sync folders configured - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 - + Syncing %1 (%2 left) Sünkroniseerin %1 (%2 veel) - + Syncing %1 Sünkroniseerimine %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5128,27 +5440,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5214,30 +5526,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5253,7 +5641,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5311,6 +5699,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5374,67 +5778,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5518,24 +5922,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account - - + + Resume sync for all - - + + Pause sync for all @@ -5545,22 +5949,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Lisa konto - + Add new account - + Settings Seaded - + Exit @@ -5569,11 +5973,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5585,70 +5984,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Ühendatud - + Disconnected Lahti ühendatud - + Open Nextcloud Talk in browser - + More apps Veel rakendusi - + Open %1 in browser Ava %1 veebilehitsejas - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Süsteemisalv pole saadaval - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5656,7 +6060,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5690,72 +6094,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Kustutatud - + Moved to %1 Tõstetud %1 - + Ignored Eiratud - + Filesystem access error Failisüsteemi ligipääsu viga - + Error Viga - + Updated local metadata - + Unknown Tundmatu - + downloading allalaadimine - + uploading üleslaadimine - + deleting kustutan - + moving liigutan - + ignoring eiran - + error viga - + updating local metadata diff --git a/translations/client_eu.ts b/translations/client_eu.ts index 142391fee..3f267a60b 100644 --- a/translations/client_eu.ts +++ b/translations/client_eu.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Ireki %1 lokalean - + In %1 %1 -n @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Erakutsi ekintza gehiago @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Baztertu + + + Open file details + Ireki fitxategiaren xehetasunak + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Jarduera zerrenda @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Garbitu egoera mezuaren menua @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Baztertu + + + Activity Jarduera - + Sharing Partekatzea @@ -226,12 +236,12 @@ Plataforma honetan ezin da mugitu zakarrontzira - + Error removing "%1": %2 Errorea "%1" kentzen: %2 - + Could not remove folder "%1" Ezin izan da kendu "%1" karpeta @@ -321,7 +331,7 @@ HTTP kode okerra erantzun du zerbitzariak. 204 espero zen, baina "%1 %2" jaso da. - + "%1 Failed to unlock encrypted folder %2". "%1(e)k huts egin du %2 karpeta enkriptatua desblokeatzean". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. %1 fitxategia %2-(e)k blokeatuta du dagoeneko - + Lock operation on %1 failed with error %2 %1 blokeatze eragiketak huts egin du %2 errorearekin - + Unlock operation on %1 failed with error %2 %1 desblokeatze eragiketak huts egin du %2 errorearekin @@ -353,9 +363,9 @@ - - - + + + Cancel Ezeztatu @@ -400,14 +410,14 @@ Badirudi fitxategi birtualak ezaugarria gaituta duzula karpeta honetan. Momentu honetan, ez da posible muturretik muturrera enkriptatuta dauden fitxategi birtualak inplizituki deskargatzea. Fitxategi birtualekin eta muturretik muturrerako enkriptatzearekin esperientzia onena lortzeko, ziurtatu enkriptatutako karpeta "Beti lokalki eskuragarri" aukera markatuta duela. - + End-to-end Encryption with Virtual Files Muturretik muturrerako zifratzea fitxategi birtualekin - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". - + Badirudi fitxategi birtualak ezaugarria gaituta duzula karpeta honetan. Momentu honetan, ez da posible muturretik muturrera enkriptatuta dauden fitxategi birtualak inplizituki deskargatzea. Fitxategi birtualekin eta muturretik muturrerako enkriptatzearekin esperientzia onena lortzeko, ziurtatu enkriptatutako karpeta "Beti lokalki eskuragarri" aukera markatuta duela. @@ -415,29 +425,29 @@ Ez enkriptatu karpeta - + Do not encrypt folder Ez enkriptatu karpeta - + Encrypt folder Enkriptatu karpeta - + No account configured. Ez da konturik konfiguratu. - - Display mnemonic - Erakutsi mnemoteknika + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Erakutsi mnemoteknika @@ -445,18 +455,24 @@ Gaitu zifratzea - + + End-to-end encryption has been enabled for this account + Muturretik muturrerako zifratzea gaituta dago kontu honetan + + + Warning Abisua - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + Muturretik muturrerako zifratzea ez dago gailu honetan konfiguratuta. Konfiguratuta dagoenean, karpeta hau zifratu ahal izango duzu. +Muturretik muturrerako zifratzea konfiguratu nahi duzu? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Ezin da edukidun karpeta enkriptatu, kendu fitxategiak. @@ -469,121 +485,121 @@ Itxaron berriro sinkronizatu arte, ondoren enkriptatu. Kontu honek muturretik muturrerako zifratzea onartzen du - + Encryption failed Zifratzeak huts egin du - + Could not encrypt folder because the folder does not exist anymore Ezin izan da karpeta enkriptatu, karpeta existitzen ez delako - - + + Open folder Ireki karpeta - + Encrypt Zifratu - - + + Edit Ignored Files Editatu baztertutako fitxategiak - - + + Create new folder Sortu karpeta berria - - + + Availability Eskuragarritasuna - + Choose what to sync Hautatu zer sinkronizatu - + Force sync now Behartu orain sinkronizatzen - + Restart sync Berrabiarazi sinkronizazioa - + Resume sync Berrekin sinkronizazioa - + Pause sync Gelditu sinkronizazioa - + Remove folder sync connection Ezabatu karpeta honen konexioa - + Disable virtual file support … Desgaitu fitxategi birtualaren laguntza ... - + Enable virtual file support %1 … Gaitu fitxategi birtualaren laguntza %1 ... - + (experimental) (esperimentala) - + Folder creation failed Karpeta sortzeak huts egin du - + <p>Could not create local folder <i>%1</i>.</p> <p>Ezin izan da <i>%1</i> bertako karpeta sortu.</p> - + Confirm Folder Sync Connection Removal Baieztatu Karpetaren Konexioaren Ezabatzea - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ziur zaude <i>%1</i>karpetaren sinkronizazioa gelditu nahi duzula?</p><p><b>Oharra:</b> Honek <b>ez</b> du fitxategirik ezabatuko.</p> - + Remove Folder Sync Connection Ezabatu Karpeta Honen Konexioa - + Disable virtual file support? Desgaitu fitxategi birtualen laguntza? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +612,7 @@ Fitxategi birtualen laguntza desgaitzearen abantaila bakarra da sinkronizazio se Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. - + Disable support Desgaitu laguntza @@ -606,145 +622,177 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. Muturretik muturrerako enkriptatzearen gako mnemoteknikoa - + End-to-end encryption mnemonic Muturretik muturrerako enkriptatzearen gako mnemoteknikoa - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Zure nortasun kriptografikoa babesteko, hiztegietako 12 hitzen mnemoniko batekin zifratzen dugu. Mesedez, kontuan hartu horiek eta gorde itzazu. Beharrezkoak izango dira zure kontuan beste gailu batzuk gehitzeko (telefono mugikorra edo ordenagailu eramangarria adibidez). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sinkronizazioa martxan da - + The syncing operation is running.<br/>Do you want to terminate it? Sinkronizazio martxan da.<br/>Bukatu nahi al duzu? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %2-tik %1 (%3%) erabiltzen ari da. Zenbait karpetek, sarean muntatutako edo partekatutako karpetak barne, muga desberdinak izan ditzakete. - + %1 of %2 in use %2tik %1 erabilita - + Currently there is no storage usage information available. Orain ez dago eskuragarri biltegiratze erabileraren informazioa. - + %1 in use %1 erabiltzen - + %1 as %2 %1 %2 gisa - + The server version %1 is unsupported! Proceed at your own risk. Zerbitzariko %1 bertsioa ez da onartzen! Zure ardurapean jarraitu. - + Connected to %1. %1 konektatuta. - + Server %1 is temporarily unavailable. %1 zerbitzaria ez dago orain eskuragarri - + Server %1 is currently in maintenance mode. - %1 zerbitzaria une honetan mantenu lanetan dago. + %1 zerbitzaria une honetan mantentze lanetan dago. - + Signed out from %1. %1etik saioa itxita. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Nabigatzailearen baimena eskuratzen. Egin <a href= '%1'>klik hemen</a> nabigatzailea berrabiarazteko. - + Connecting to %1 … %1(e)ra konektatzen … - + No connection to %1 at %2. Konexiorik ez %1-ekin %2-en - + Server configuration error: %1 at %2. Zerbitzariaren konfigurazio errorea: %1 %2-n. - + No %1 connection configured. Ez dago %1 konexiorik konfiguratuta. - + There are folders that were not synchronized because they are too big: Hainbat karpeta ez dira sinkronizatu handiegiak direlako: - + There are folders that were not synchronized because they are external storages: Hainbat karpeta ez dira sinkronizatu kanpoko biltegietan daudelako: - + There are folders that were not synchronized because they are too big or external storages: Hainbat karpeta ez dira sinkronizatu handiegiak direlako edo kanpoko biltegietan daudelako: - + Confirm Account Removal Baieztatu Kontuaren Ezabatzea - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ziur zaude <i>%1</i>kontuaren konexioa kendu nahi duzula?</p><p><b>Oharra:</b> Honek<b>ez</b> du fitxategirik ezabatuko.</p> - + Remove connection Ezabatu konexioa - - + This account supports end-to-end encryption Kontu honek onartzen du muturretik muturrerako zifratzea - + Set up encryption Konfiguratu zifratzea - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Muturretik muturrerako zifratzea gaituta dago kontu honetan beste gailu batekin.<br>Zure mnemonikoa sartuz gaitu daiteke gailu honetan.<br>Honek dauden karpeta zifratuen sinkronizazioa gaituko du. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Zerbitzarirako autentifikatutako eskaera "%1"ra birbideratu da. URLa txarra da, zerbitzaria gaizki konfiguratuta dago. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Zerbitzariak sarbidea debekatu du. Sarbide egokia duzula egiaztatzeko, <a href="%1">egin klik hemen</a> zure nabigatzailearekin zerbitzuan sartzeko. + + + + There was an invalid response to an authenticated WebDAV request + Erantzun baliogabea eman zaio kautotutako WebDAV eskaera bati @@ -772,7 +820,7 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. Maintenance mode - Mantenu lanetan + Mantentze lanetan @@ -798,7 +846,7 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. OCC::ActivityListModel - + For more activities please open the Activity app. Jarduera gehiagorako ireki Jarduerak aplikazioa. @@ -808,12 +856,12 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. Jarduerak eskuratzen... - + Fetching activities … Jarduerak eskuratzen ... - + Files from the ignore list as well as symbolic links are not synced. Ez ikusi zerrendako fitxategiak eta esteka sinbolikoak ez dira sinkronizatuko. @@ -864,32 +912,59 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Jarraitzeak <b>ezarpen horiek ezabattzea</b> supostuko du. - + Continuing will mean <b>ignoring these settings</b>. Jarraitzeak <b>ezarpen horiek ez ikustea</b>suposatuko du. - + 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>. Ezarpen batzuk bezero honen bertsio berriagoetan konfiguratu ziren eta bertsio honetan erabilgarri ez dauden funtzioak erabiltzen dituzte.<br><br>%1<br><br>Uneko konfigurazio fitxategiaren babeskopia egin zen<i>%2</i>-ra. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Irten - + Continue Jarraitu - + Error accessing the configuration file Errorea ezarpen fitxategia atzitzean @@ -899,12 +974,12 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. % 1 konfigurazio fitxategian sartzean akats bat gertatu da. Egiaztatu zure erabiltzaileak fitxategi hau atzitzeko baimena duela. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Errorea gertatu da %1 konfigurazio fitxategian sartzean. Egiaztatu zure sistemaren kontuak fitxategi hau atzitzeko baimena duela. - + Quit %1 Irten %1(e)tik @@ -950,56 +1025,216 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. %1 fitxategiak aldaketa-data baliogabea du. Ez igo hau zerbitzarira. - + File Removed (start upload) %1 Fitxategia kendu da (hasi karga) %1 - + File %1 has invalid modification time. Do not upload to the server. %1 fitxategiak aldaketa-data baliogabea du. Ez kargatu hau zerbitzarira. - + Local file changed during syncing. It will be resumed. Fitxategi lokala aldatu egin da sinkronizazioa egin bitartean. Berrekin egingo da. - - + + Local file changed during sync. Fitxategi lokala aldatu da sinkronizazioan. - + Network error: %1 Sareko errorea: %1 - + Error updating metadata: %1 Erorrea metadatuak eguneratzen: %1 - + The file %1 is currently in use %1 fitxategia momentu honetan erabilpean dago - + The local file was removed during sync. Fitxategi lokala ezabatu da sinkronizazioan. - + Restoration failed: %1 Berrezartzeak huts egin du: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Ezin da fitxategia berrizendatu izen berdina duen fitxategi bat existitzen delako zerbitzarian dagoeneko. Mesedez, aukeratu beste izen bat. + + + + Could not rename file. Please make sure you are connected to the server. + Ezin izan da fitxategia berrizendatu. Mesedez egiaztatu zerbitzarira konektatuta zaudela. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Ez duzu baimenik fitxategi hau berrizendatzeko. Mesedez, eskatu fitxategiaren jabeari berrizendatzeko. + + + + Failed to fetch permissions with error %1 + Ezin izan dira baimenak eskuratu %1 errorearekin + + + + Filename contains leading and trailing spaces. + Fitxategi-izenak hasierako eta amaierako zuriuneak dauzka. + + + + Filename contains leading spaces. + Fitxategi-izenak hasierako zuriunea dauka. + + + + Filename contains trailing spaces. + Fitxategi-izenak amaierako zuriunea dauka. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + Errorea + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + gaur + + + + + 0 byte + 0 byte + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + Fitxategi-izen berria + + + + Rename file + Berrizendatu fitxategia + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + Fitxategi-izenak hasierako eta amaierako zuriuneak dauzka. + + + + Filename contains leading spaces. + Fitxategi-izenak hasierako zuriunea dauka. + + + + Filename contains trailing spaces. + Fitxategi-izenak amaierako zuriunea dauka. + + + + Use invalid name + Erabili izen baliogabea + + + + Filename contains illegal characters: %1 + Fitxategiak karaktere ilegalak dauzka: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Errorea metadatuak datu-basean idaztean @@ -1017,12 +1252,12 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. Sartu zure muturretik muturrerako zifratzeko pasahitza:<br><br>Erabiltzailea: %2<br>Kontua: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Mesedez, idatzi zure muturreko enkriptatze pasaesaldia: <br><br>Erabiltzaile-izena: <br> %2Kontua:<br> - + Enter E2E passphrase Sartu muturretik muturrerako (E2E) pasahitza @@ -1198,8 +1433,8 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Zerbitzariko errorea: PROPFINDaren erantzunak ez du XML formaturik! @@ -1207,27 +1442,27 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 %1 direktorioaren irekitzeak huts egin du - + Directory not accessible on client, permission denied Direktorioa ez dago eskuragarri bezeroan, baimena ukatua - + Directory not found: %1 Direktorioa ez da aurkitu: %1 - + Filename encoding is not valid Fitxategiaren kodeketa baliogabea da - + Error while reading directory %1 Errorea gertatu da %1 direktorioa irakurtzean @@ -1235,91 +1470,91 @@ Ekintza honek unean uneko sinkronizazioa bertan behera utziko du. OCC::EditLocallyJob - + Invalid token received. Token baliogabea lortu da. - - - - - - + + + + + + Please try again. Mesedez saiatu berriro. - + Invalid file path was provided. Fitxategiaren bide-izen baliogabea eman da. - + Could not find an account for local editing. Ezin izan da kontu bat aurkitu editatze lokalerako. - - + + Could not validate the request to open a file from server. - + Ezin izan da zerbitzariko fitxategia irekitzeko eskaera balioztatu. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Ezin izan da fitxategi bat aurkitu editatze lokalerako. Ziurtatu bide-izena baliozkoa dela eta lokalean sinkronizatuta dagoela. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Ezin izan da fitxategi bat aurkitu editatze lokalerako. Ziurtatu ez dagoela ezikusia sinkronizazio hautakorraren bidez. - + Server error: PROPFIND reply is not XML formatted! - + Zerbitzariko errorea: PROPFIND erantzunak ez du XML formaturik! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Ezin izan da kanpoko fitxategiaren informazioa aurkitu editatze lokalerako. Ziurtatu bide-izena baliozkoa dela. - + Could not open %1 - + Ezin izan da %1 ireki - + File %1 already locked. - + %1 fitxategia dagoeneko blokeatuta dago. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Blokeoak %1 minutu iraungo ditu. Fitxategi hau eskuz desblokeatu dezakezu edizioa bukatzen duzunean. - + File %1 now locked. - + %1 fitxategia blokeatuta dago. - + File %1 could not be locked. - + Ezin izan da %1 fitxategia blokeatu. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Ezin dira enkriptatze metadatuak sortu, karpeta desblokeatu behar da. @@ -1449,145 +1684,145 @@ Baliteke OpenSSL liburutegiekin arazoa egotea. OCC::Folder - + Local folder %1 does not exist. Bertako %1 karpeta ez da existitzen. - + %1 should be a folder but is not. %1 karpeta bat izan behar zen baina ez da. - + %1 is not readable. %1 ezin da irakurri. - + %1 and %n other file(s) have been removed. %1 eta beste fitxategi %n ezabatu dira.%1 eta beste %n fitxategi ezabatu dira. - + %1 has been removed. %1 names a file. %1 ezabatua izan da. - + %1 and %n other file(s) have been added. %1 eta beste fitxategi %n gehitu da.%1 eta beste %n fitxategi gehitu dira. - + %1 has been added. %1 names a file. %1 gehitu da.. - + %1 and %n other file(s) have been updated. %1 eta beste fitxategi %n eguneratu dira.%1 eta beste %n fitxategi eguneratu dira. - + %1 has been updated. %1 names a file. %1 kargatu da. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 fitxategiak %2 izen berria hartu du eta beste fitxategi %n berrizendatu da.%1 fitxategiak %2 izen berria hartu du eta beste %n fitxategi berrizendatu dira. - + %1 has been renamed to %2. %1 and %2 name files. %1 %2-(e)ra berrizendatu da. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 fitxategia %2-ra mugitu da eta beste fitxategi %n mugitu da.%1 fitxategia %2-ra mugitu da eta beste %n fitxategi mugitu dira. - + %1 has been moved to %2. %1 %2-(e)ra mugitu da. - + %1 has and %n other file(s) have sync conflicts. %1 eta beste fitxategi %n sinkronizazio gatazkak izan dituzte.%1 eta beste %n fitxategi sinkronizazio gatazkak izan dituzte. - + %1 has a sync conflict. Please check the conflict file! %1 sinkronizazio gatazka izan du. Begiratu gatazkaren fitxategia! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 eta beste fitxateg %ni ezin izan dira sinkronizatu erroreak direla eta. Ikusi egunkaria xehetasun gehiago izateko.%1 eta beste %n fitxategi ezin izan dira sinkronizatu erroreak direla eta. Ikusi egunkaria xehetasun gehiago izateko. - + %1 could not be synced due to an error. See the log for details. %1 ezin izan da sinkronizatu errore bat dela eta. Ikusi egunkaria xehetasun gehiago izateko. - + %1 and %n other file(s) are currently locked. %1 eta beste fitxategi %n blokeatuta daude.%1 eta beste %n fitxategi blokeatuta daude. - + %1 is currently locked. %1 blokeatuta dago - + Sync Activity Sinkronizatu Jarduerak - + Could not read system exclude file Ezin izan da sistemako baztertutakoen fitxategia irakurri - + A new folder larger than %1 MB has been added: %2. %1 MB baino handiagoa den karpeta berri bat gehitu da: %2. - + A folder from an external storage has been added. Kanpoko biltegi bateko karpeta gehitu da. - + Please go in the settings to select it if you wish to download it. Jo ezarpenetara aukeratzeko deskargatu nahi ote duzun. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. %1 karpeta sortu zen baina sinkronizaziotik kanpo ezarri zen. Haren barneko fitxategiak ez dira sinkronizatuko. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. %1 fitxategia sortu zen baina sinkronizaziotik kanpo ezarri zen. Fitxategia ez da sinkronizatuko. - + 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). @@ -1600,7 +1835,7 @@ Honek esan nahi du sinkronizazio bezeroak agian ez duela berehalakoan kargatuko %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1846,7 @@ Fitxategiak leheneratzea erabakitzen baduzu, berriro sinkronizatuko dira zerbitz Fitxategiak ezabatzea erabakitzen baduzu, ezingo dituzu erabilgarri izan, jabea ez bazara behintzat. - + 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. @@ -1620,17 +1855,17 @@ Ziur zaude ekintza horiek zerbitzariarekin sinkronizatu nahi dituzula? Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzaritik berriro sinkronizatuko dira. - + Remove All Files? Ezabatu fitxategi guztiak? - + Remove all files Ezabatu fitxategi guztiak - + Keep files Mantendu fitxategiak @@ -1666,22 +1901,22 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar OCC::FolderMan - + Could not reset folder state Ezin izan da karpetaren egoera berrezarri - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. "% 1" sinkronizazio egunkari zahar bat aurkitu da, baina ezin izan da kendu. Ziurtatu ez dela aplikaziorik erabiltzen ari. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1691,27 +1926,27 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar Definitu gabeko egoera. - + Undefined state. Definitu gabeko egoera. - + Waiting to start syncing. Itxoiten sinkronizazioa hasteko. - + Preparing for sync. Sinkronizazioa prestatzen. - + Sync is running. Sinkronizazioa martxan da. - + Sync finished with unresolved conflicts. Sinkronizazioa burutu da, ebatzi gabeko gatazka batzuekin. @@ -1731,62 +1966,62 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar Erabiltzaileak bertan behera utzi du. - + Last sync was successful. Azkeneko sinkronizazioa behar bezala burutu da. - + Setup error. Konfigurazio errorea. - + Sync request was cancelled. Sinkronizazio eskaera bertan behera utzi da. - + Sync is paused. Sinkronizazioa pausatuta dago. - + %1 (Sync is paused) %1 (Sinkronizazioa pausatuta dago) - + No valid folder selected! Ez da baliozko karpetarik hautatu! - + The selected path does not exist! Hautatutako bidea ez da existitzen! - + The selected path is not a folder! Hautatutako bidea ez da karpeta bat! - + You have no permission to write to the selected folder! Ez daukazu hautatutako karpetan idazteko baimenik! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Tokiko '%1' karpetak badu dagoeneko sinkronizatutako karpeta bat. Hautatu beste bat! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Tokiko '%1' karpeta dagoeneko sinkronizatutako karpeta batean dago. Hautatu beste bat! - + There is already a sync from the server to this local folder. Please pick another local folder! Dagoeneko sinkronizazio bat dago zerbitzaritik karpeta lokal honetara. Aukeratu tokiko beste karpeta bat! @@ -1799,7 +2034,7 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar Gehitu Karpeta Sinkronizatzeko Konexioa - + File Fitxategia @@ -1807,152 +2042,156 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar OCC::FolderStatusModel - + You need to be connected to add a folder Konektatuta egon behar duzu karpeta bat gehitzeko - + Click this button to add a folder to synchronize. Klikatu botoi hau karpeta bat gehitzeko sinkronizazioari. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Errorea zerbitzaritik karpeten zerrenda eskuratzean. - + Fetching folder list from server … Karpeta zerrenda zerbitzaritik lortzen... - + There are unresolved conflicts. Click for details. Konpondu gabeko gatazkak daude. Klikatu zehaztasunak ikusteko. - + Virtual file support is enabled. Fitxategi birtualaren laguntza gaituta dago. - + Signed out Saioa bukatuta - + Synchronizing VirtualFiles with local folder Fitxategi birtualak sinkronizatzen karpeta lokalarekin - + Synchronizing with local folder Karpeta lokalarekin sinkronizatzen - + Checking for changes in remote "%1" Urruneko "% 1"-(e)an aldaketarik dagoen egiaztatzen - + Checking for changes in local "%1" Tokiko "% 1"-(e)an aldaketarik dagoen egiaztatzen - + Reconciling changes Aldaketak bateratzen - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" %1 Sinkronizatzen - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) Deskargatu %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) Kargatu %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%4 - %3tik) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Segundu batzuk falta dira, 2%tik %1, %4tik %3 fitxategia - + %5 left, %1 of %2, file %3 of %4 %5 falta da,%2tik %1 , %4tik %3 fitxategi - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %2tik %1 , %4tik %3 fitxategi - + file %1 of %2 %1. fitxategia %2tik - + Waiting … Itxaroten … - + Waiting for %n other folder(s) … Beste karpeta %n-en zainBeste %n karpetaren zain - + Preparing to sync … Sinkronizatzeko prestatzen … @@ -2183,13 +2422,13 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar - + stable egonkorra - + beta beta @@ -2241,32 +2480,32 @@ Istripua izan bada eta zure fitxategiak mantentzea erabakitzen baduzu, zerbitzar - + Create Debug Archive Sortu arazketa fitxategia - + Server notifications that require attention. Arreta eskatzen duten zerbitzariaren jakinarazpenak. - + Show call notification dialogs. Erakutsi dei jakinarazpenen elkarrizketa-koadroak. - + You cannot disable autostart because system-wide autostart is enabled. Ezin da abiarazte automatikoa desgaitu sistema osoaren abiarazte automatikoa gaituta dagoelako. - + Change update channel? Eguneratze kanala aldatu nahi duzu? - + 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. 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. @@ -2275,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Kontuan izan honek bertsio berriak nondik hartu bakarrik hautatzen duela, ezin dela bertsio zaharretara itzuli: beraz, beta kanaletik batzuetan ezin da automatikoki kanal egonkorrera itzuli, jarrita dagoena baino berriagoa den bertsio egonkor bati itxaron behar zaio. - + Change update channel Aldatu eguneratze kanala - + Cancel Ezeztatu - + Zip Archives Zip fitxategiak - + Debug Archive Created Arazketa fitxategia sortu da - + Debug archive is created at %1 Arazketa fitxategia sortuta dago, hemen: %1 @@ -2303,22 +2542,22 @@ Kontuan izan honek bertsio berriak nondik hartu bakarrik hautatzen duela, ezin d OCC::GetOrCreatePublicLinkShare - + Password for share required Partekatzeak pasahitza izan behar du - + Please enter a password for your link share: Idatzi zure partekatze estekaren pasahitza: - + Sharing error Errorea partekatzerakoan - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2795,11 @@ Ezabatu daitezkeen elementuak ezabatu egingo dira karpeta bat ezabatzea ekiditen Close Itxi + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3135,60 @@ Kontuan izan erregistro-komando lerroaren edozein aukera erabiliz ezarpen hau ga - + Use &virtual files instead of downloading content immediately %1 Erabili & fitxategi birtualak edukia berehala deskargatu beharrean % 1 - + (experimental) (esperimentala) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Fitxategi birtualak ez dira bateragarriak Windows partizio sustraiekin karpeta lokal bezala. Mesedez aukeratu baliozko azpikarpeta bat diskoaren letra azpian. - + %1 folder "%2" is synced to local folder "%3" %1 karpeta "%2" lokaleko "%3" karpetan dago sinkronizatuta - + Sync the folder "%1" Sinkronizatu "%1" karpeta - + Warning: The local folder is not empty. Pick a resolution! Abisua: karpeta lokala ez dago hutsik. Aukeratu nola konpondu! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 egin leku librea - + Virtual files are not available for the selected folder Fitxategi birtualak ez daude hautatutako karpetarentzako eskuragarri - + Local Sync Folder Sinkronizazio karpeta lokala - - + + (%1) (%1) - + There isn't enough free space in the local folder! Ez dago nahikoa toki librerik karpeta lokalean! @@ -3016,7 +3260,8 @@ Kontuan izan erregistro-komando lerroaren edozein aukera erabiliz ezarpen hau ga OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Ezin izan da lortu %1 gatazkan dagoen fitxategiaren aldatze-denbora @@ -3048,144 +3293,144 @@ Kontuan izan erregistro-komando lerroaren edozein aukera erabiliz ezarpen hau ga OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Konexioa ongi burutu da %1 zerbitzarian: %2 bertsioa %3 (%4)</font><br/><br/> - + Invalid URL Baliogabeko URLa - + Failed to connect to %1 at %2:<br/>%3 Konektatze saiakerak huts egin du %1 at %2:%3 - + Timeout while trying to connect to %1 at %2. Denbora iraungi da %1era %2n konektatzen saiatzean. - + Trying to connect to %1 at %2 … %2 zerbitzarian dagoen %1 konektatzen... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Zerbitzarira autentifikatutako eskaera "% 1" ra birbideratu da. URLa okerra da, zerbitzaria gaizki konfiguratuta dago. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Sarrera zerbitzariarengatik ukatuta. Sarerra egokia duzula egiaztatzeko, egin <a href="%1">klik hemen</a> zerbitzura zure arakatzailearekin sartzeko. - + There was an invalid response to an authenticated WebDAV request Baliogabeko erantzuna jaso du autentifikaturiko WebDAV eskaera batek - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Bertako %1 karpeta dagoeneko existitzen da, sinkronizaziorako prestatzen.<br/><br/> - + Creating local sync folder %1 … %1 sinkronizazio karpeta lokala sortzen... - + OK OK - + failed. huts egin du. - + Could not create local folder %1 Ezin da %1 karpeta lokala sortu - + No remote folder specified! Ez da urruneko karpeta zehaztu! - + Error: %1 Errorea: %1 - + creating folder on Nextcloud: %1 Nextcloud-en karpeta sortzen: %1 - + Remote folder %1 created successfully. Urruneko %1 karpeta ongi sortu da. - + The remote folder %1 already exists. Connecting it for syncing. Urruneko %1 karpeta dagoeneko existintzen da. Bertara konetatuko da sinkronizatzeko. - - + + The folder creation resulted in HTTP error code %1 Karpeta sortzeak HTTP %1 errore kodea igorri du - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Huts egin du urrutiko karpeta sortzen emandako kredintzialak ez direlako zuzenak!<br/> Egin atzera eta egiaztatu zure kredentzialak.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Urruneko karpeten sortzeak huts egin du ziuraski emandako kredentzialak gaizki daudelako.</font><br/>Mesedez atzera joan eta egiaztatu zure kredentzialak.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Urruneko %1 karpetaren sortzeak huts egin du <tt>%2</tt> errorearekin. - + A sync connection from %1 to remote directory %2 was set up. Sinkronizazio konexio bat konfiguratu da %1 karpetatik urruneko %2 karpetara. - + Successfully connected to %1! %1-era ongi konektatu da! - + Connection to %1 could not be established. Please check again. %1 konexioa ezin da ezarri. Mesedez egiaztatu berriz. - + Folder rename failed Karpetaren berrizendatzeak huts egin du - + Cannot 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. Ezin da karpeta kendu eta babeskopiarik egin, karpeta edo barruko fitxategiren bat beste programa batean irekita dagoelako. Itxi karpeta edo fitxategia eta sakatu berriro saiatu edo bertan behera utzi konfigurazioa. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Bertako sinkronizazio %1 karpeta ongi sortu da!</b></font> @@ -3208,12 +3453,12 @@ Kontuan izan erregistro-komando lerroaren edozein aukera erabiliz ezarpen hau ga Utzi - + Enable experimental feature? Ezaugarri esperimentala gaitu? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3475,12 @@ Modu honetara aldatzeak martxan legokeen sinkronizazioa bertan behera utziko du. Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen diren arazoen berri eman mesedez. - + Enable experimental placeholder mode Gaitu leku-marka modu esperimentala - + Stay safe Jarraitu era seguruan @@ -3264,162 +3509,167 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Esteka sinbolikoak ezin dira sinkronizatu. - + File is listed on the ignore list. Fitxategia baztertutakoen zerrendan dago. - + File names ending with a period are not supported on this file system. Puntu batekin amaitzen diren fitxategi-izenak ez dira onartzen fitxategi-sistema honetan. - + File names containing the character "%1" are not supported on this file system. "%1" karakterea daukaten fitxategi-izenak ez dira onartzen fitxategi-sistema honetan. - + File name contains at least one invalid character Fitxategi izenak behintzat baliogabeko karaktere bat du - + The file name is a reserved name on this file system. Fitxategi-izena izen erreserbatua da fitxategi-sistema honetan. - + Filename contains trailing spaces. Fitxategi-izenak amaierako zuriunea dauka. - + Filename contains leading spaces. Fitxategi-izenak hasierako zuriunea dauka. - + Filename contains leading and trailing spaces. Fitxategi-izenak hasierako eta amaierako zuriuneak dauzka. - + Filename is too long. Fitxategiaren izena luzeegia da. - + File/Folder is ignored because it's hidden. Fitxategia/Karpeta ez da ikusi ezkutuan dagoelako. - + Stat failed. Hasierak huts egin du. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Gatazka: zerbitzari bertsioa deskargatu da, kopia lokala berrizendatua eta ez kargatuta. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Fitxategi-izen hori ezin da kodetu fitxategi-sistema honetan. - + The filename is blacklisted on the server. Fitxategiaren izena zerrenda beltzean dago zerbitzarian. - + File has extension reserved for virtual files. Fitxategiak fitxategi birtualentzako gordetako luzapena du. - + size tamaina - + permission baimena - + file id fitxategiaren id-a - + Server reported no %1 Zerbitzariak ez du %1-rik jakinarazi - + Cannot sync due to invalid modification time Ezin da sinkronizatu aldaketa-ordu baliogabea delako - + Error while deleting file record %1 from the database Errorea %1 fitxategi erregistroa datu-basetik ezabatzean - + Conflict when uploading a folder. It's going to get cleared! Gatazka gertatu da karpeta kargatzean. Garbituko da! - + Conflict when uploading a file. It's going to get removed! Gatazka gertatu da fitxategia kargatzean. Garbituko da! - + Ignored because of the "choose what to sync" blacklist Ez ikusi egin zaio, "aukeratu zer sinkronizatu" zerrenda beltzagatik. - + Not allowed because you don't have permission to add subfolders to that folder Ez da onartu, ez daukazulako baimenik karpeta horretan azpikarpetak gehitzeko - + Not allowed because you don't have permission to add files in that folder Ez da onartu, ez daukazulako baimenik karpeta horretan fitxategiak gehitzeko - + Not allowed to upload this file because it is read-only on the server, restoring Ez dago baimenik fitxategi hau kargatzek zerbitzarian irakurtzeko soilik delako, leheneratzen. - + Moved to invalid target, restoring Baliogabeko helburura mugitu da, berrezartzen - + Not allowed to remove, restoring Ezabatzeko baimenik gabe, berrezartzen - + Error while reading the database Errorea datu-basea irakurtzean - + Server replied with an error while reading directory "%1" : %2 Zerbitzariak errore batekin erantzun du "%1" direktorioa irakurtzean: % 2 @@ -3427,22 +3677,22 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::PropagateDirectory - + could not delete file %1 from local DB Ezin izan da %1 fitxategia datu-base lokaletik ezabatu - + Error updating metadata due to invalid modification time Errorea metadatuak eguneratzen aldaketa-data baliogabeagatik - + Error updating metadata: %1 Erorrea metadatuak eguneratzen: %1 - + File is currently in use Fitxategia erabiltzen ari da @@ -3455,19 +3705,19 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Ezin izan da %1 fitxategia datu-base lokaletik lortu - + File %1 cannot be downloaded because encryption information is missing. Ezin da% 1 fitxategia deskargatu enkriptatze-informazioa falta delako. - - + + File has changed since discovery Fitxategia aldatu egin da aurkitu zenetik - + Could not delete file record %1 from local DB Ezin izan da %1 fitxategiaren erregistroa datu-base lokaletik ezabatu @@ -3478,32 +3728,32 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Ezin da% 1 fitxategia deskargatu, fitxategi lokal baten izenarekin talka! - + File %1 can not be downloaded because of a local file name clash! %1 fitxategia ezin da deskargatu, fitxategi lokal baten izenarekin gatazka! - + The download would reduce free local disk space below the limit Deskargak disko lokaleko toki librea muga azpitik gutxituko luke - + Free space on disk is less than %1 %1 baino toki libre gutxiago diskoan - + File was deleted from server Fitxategia zerbitzaritik ezabatua izan da - + The file could not be downloaded completely. Fitxategia ezin izan da guztiz deskargatu. - + The downloaded file is empty, but the server said it should have been %1. Deskargatutako fitxategia hutsik dago, baina zerbitzariak %1 izan beharko lukeela iragarri du. @@ -3513,18 +3763,23 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di %1 fitxategia ezin da gorde, fitxategi lokal baten izenarekin gatazka! - - + + File %1 has invalid modified time reported by server. Do not save it. % 1 fitxategiak zerbitzariak jakinarazitako aldaketa-ordu baliogabea du. Ez gorde. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Erorrea metadatuak eguneratzen: %1 - + The file %1 is currently in use %1 fitxategia erabiltzen ari da @@ -3545,7 +3800,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ezin izan da %1 fitxategia ezabatu, errorea: %2 @@ -3556,16 +3811,21 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Ezin da %1 karpeta sortu - + Error updating metadata: %1 Erorrea metadatuak eguneratzen: %1 - + The file %1 is currently in use %1 fitxategia erabiltzen ari da @@ -3573,7 +3833,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Ezin izan da %1 kendu fitxategi lokal baten izen gatazka dela eta @@ -3586,46 +3846,51 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash %1 fitxategiari ezin zaio %2 izena eman fitxategi lokal baten izenarekin talkagatik. - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB Ezin izan da %1 fitxategia datu-base lokaletik lortu - + Error setting pin state Errorea pin egoera ezartzean - - + + Error updating metadata: %1 Erorrea metadatuak eguneratzen: %1 - + The file %1 is currently in use %1 fitxategia erabiltzen ari da - - + + Could not delete file record %1 from local DB Ezin izan da %1 fitxategiaren erregistroa datu-base lokaletik ezabatu - + Failed to propagate directory rename in hierarchy Ezin izan da direktorioen berrizendatzea hedatu hierarkiatik - + Failed to rename file Fitxategia berrizendatzeak huts egin du @@ -3646,7 +3911,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". HTTP kode okerra erantzun du zerbitzariak. 204 espero zen, baina "%1 %2" jaso da. @@ -3659,12 +3924,12 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di HTTP kode okerra erantzun du zerbitzariak. 201 espero zen, baina "%1 %2" jaso da. - + Error writing metadata to the database: %1 Errorea metadatuak datu-basean idaztean: %1 - + The file %1 is currently in use %1 fitxategia erabiltzen ari da @@ -3672,42 +3937,42 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Ezin izan zaio %1-ri %2 izena eman, errorea: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". HTTP kode okerra erantzun du zerbitzariak. 201 espero zen, baina "%1 %2" jaso da. - + could not get file %1 from local DB Ezin izan da %1 fitxategia datu-base lokaletik lortu - + Could not delete file record %1 from local DB Ezin izan da %1 fitxategiaren erregistroa datu-base lokaletik ezabatu - + Error updating metadata: %1 Erorrea metadatuak eguneratzen: %1 - + The file %1 is currently in use %1 fitxategia erabiltzen ari da - + Error setting pin state Errorea pin egoera ezartzean - + Error writing metadata to the database Errorea metadatuak datu-basean idaztean @@ -3897,7 +4162,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::ServerNotificationHandler - + Reply Erantzun @@ -3915,23 +4180,23 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Ezarpenak - + %1 Settings This name refers to the application name e.g Nextcloud %1 ezarpenak - + General Orokorra - + Network Sarea - + Account Kontua @@ -3939,17 +4204,22 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::ShareModel - + Share link Partekatu esteka - + Link share Lotu partekatzea - + + Internal link + Barneko esteka + + + Enter a note for the recipient Sartu ohar bat hartzailearentzat @@ -4025,7 +4295,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4304,171 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::SocketApi - + + Failed to encrypt folder at "%1" + Ezin izan da karpeta zifratu "%1" kokalekuan + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + %1 kontuak ez du muturretik muturrerako zifratzea konfiguratuta. Konfiguratu hau zure kontuko ezarpenetan karpeten zifratzea gaitzeko mesedez. + + + + Failed to encrypt folder + Karpeta zifratzeak huts egin du + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Ezin izan da hurrengo karpeta zifratu "%1". + +Zerbitzariak errorearekin erantzun du: %2 + + + + Folder encrypted successfully + Karpeta ongi zifratu da + + + + The following folder was encrypted successfully: "%1" + Hurrengo karpeta ondo zifratu da: "%1" + + + Context menu share Testuinguruaren partekatze menua - + Select new location … Hautatu kokapen berria ... - + I shared something with you Zerbait partekatu dut zurekin - - + + Share options Partekatze aukerak - - + + Activity Jarduera - + Copy private link to clipboard Kopiatu esteka pribatua arbelera - + Send private link by email … Bidali esteka pribatua postaz... + + + Expire in %1 minutes + remaining time before lock expire + Iraungi minutu %1eanIraungi %1 minututan + - + Leave this share Utzi partekatze hau - + Resharing this file is not allowed Fitxategi hau birpartekatzea ez da onartzen - + Resharing this folder is not allowed Karpeta hau berriro partekatzea ez dago onartuta - - + + Copy public link Kopiatu esteka publikoa - + Copy internal link Kopiatu barne esteka - + + Encrypt + Zifratu + + + Lock file Blokeatu fitxategia - + Unlock file Desblokeatu fitxategia - + Locked by %1 %1-(e)k blokeatuta - - Expire in %1 minutes - remaining time before lock expire - Iraungi minutu %1eanIraungi %1 minututan - - - + Expires in %1 minutes remaining time before lock expires Minutu %1ean iraungiko da%1 minututan iraungiko da - + Edit Editatu - + Open in browser Ireki nabigatzailean - + Resolve conflict … Ebatzi gatazka ... - + Move and rename … Mugitu eta izena aldatu ... - + Move, rename and upload … Mugitu, izena aldatu eta igo ... - + Delete local changes Ezabatu tokiko aldaketak - + Move and upload … Mugitu eta igo ... - + Delete Ezabatu @@ -4377,63 +4686,63 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (saltatua zena aurreko errore batengatik, berriro saiatzen hemen: %2) - + Could not update file: %1 Ezin izan da eguneratu fitxategia: % 1 - + Could not update virtual file metadata: %1 Ezin izan dira fitxategi birtualaren metadatuak eguneratu: %1 - + Could not update file metadata: %1 Ezin izan dira fitxategiaren metadatuak eguneratu: %1 - + Could not set file record to local DB: %1 Ezin izan da fitxategiaren erregistroa datu-base lokalean ezarri: %1 - + Unresolved conflict. Ebatzi gabeko gatazka. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() %1 bakarrik dago eskuragarri, gutxienez %2 behar da hasteko. - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Ezin izan da ireki edo sortu datu-base lokal sinkronizatua. Ziurtatu idazteko baimena daukazula karpeta sinkronizatu lokalean. - + Using virtual files with suffix, but suffix is not set Suffix erabiltzen da fitxategi birtualak kudeatzeko, baina suffix ez dago konfiguratuta - + Unable to read the blacklist from the local database Ezin izan da zerrenda beltza irakurri datu-base lokaletik - + Unable to read from the sync journal. Ezin izan da sinkronizazio-egunkaria irakurri. - + Cannot open the sync journal Ezin da sinkronizazio egunerokoa ireki @@ -4443,12 +4752,12 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Sinkronizazioak laster jarraituko du. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Toki gutxi dago diskoan: toki librea %1 azpitik gutxituko zuten deskargak saltatu egin dira. - + There is insufficient space available on the server for some uploads. Ez dago nahiko toki erabilgarririk zerbitzarian hainbat kargatarako. @@ -4517,59 +4826,59 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::Systray - + Download Deskargatu - + Add account Gehitu kontua - + Open main dialog Ireki elkarrizketa nagusia - - + + Pause sync Gelditu sinkronizazioa - - + + Resume sync Berrekin sinkronizazioa - + Settings Ezarpenak - + Help Laguntza - + Exit %1 Irten %1(e)tik - + Pause sync for all Pausatu sinkronizazioa guztientzat - + Resume sync for all Berrekin sinkronizazioa guztientzat - + %1: %2 %1: %2 @@ -4577,24 +4886,24 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Mahaigaineko %1 bezeroa</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>%1 bertsioa. Informazio gehiago eskuratzeko egin klik <a href='%2'>hemen</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Fitxategi birtualen plugina erabiltzen: %1</small></p> - + <p>This release was supplied by %1</p> <p>Argitalpen hau %1(e)k eman du</p> @@ -4602,22 +4911,22 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Ezin izan dira hornitzaileak atzitu. - + Failed to fetch search providers for '%1'. Error: %2 Ezin izan dira bilaketa hornitzaileak lortu '%1?-(r)entzat. Errorea: %2 - + Search has failed for '%2'. '%2' bilaketak huts egin du. - + Search has failed for '%1'. Error: %2 '%1' bilaketak huts egin du. Errorea: %2 @@ -4625,30 +4934,36 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::User - + Retry all uploads Saiatu dena berriro kargatzen + + + + Resolve conflict + Ebatzi gatazka + OCC::UserModel - + Confirm Account Removal Baieztatu kontua kentzea - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ziur zaude <i>%1</i> kontura konexioa kendu nahi duzula?</p><p><b>Oharra:</b> Honek <b>ez</b> du fitxategirik ezabatuko.</p> - + Remove connection Kendu konexioa - + Cancel Utzi @@ -4786,8 +5101,8 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Errorea metadatuak eguneratzen aldaketa-data baliogabeagatik @@ -4795,8 +5110,8 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Errorea metadatuak eguneratzen aldaketa-data baliogabeagatik @@ -4894,123 +5209,123 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di OCC::ownCloudGui - + Unsupported Server Version Ez da zerbitzariaren bertsioa onartzen - + 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. %1 kontuko zerbitzariak onartzen ez den %2 bertsioa darabil. Onartzen ez diren zerbitzari bertsioekin bezero hau erabiltzea probatu gabe dago eta potentzialki arriskutsua da. Zure ardurapean jarraitu. - + Disconnected Deskonektatuta - + Disconnected from some accounts Kontu batzuetatik deskonektatuta - + Disconnected from %1 %1etik deskonektatuta - + Disconnected from accounts: Kontuetatik deskonektatuta: - + Account %1: %2 %1 Kontua: %2 - + Please sign in Mesedez saioa hasi - + Signed out Saioa bukatuta - + Account synchronization is disabled Kontuen sinkronizazioa desaktibatua dago - - + + Synchronization is paused Sinkronizazioa pausatua dago - + Folder %1: %2 %1 karpeta: %2 - + Unresolved conflicts Ebatzi gabeko gatazkak - + Up to date Eguneratua - + Error during synchronization Errorea sinkronizatzean - + There are no sync folders configured. Ez dago sinkronizazio karpetarik definituta. - + No sync folders configured Ez dira ezarri sinkronizatzeko karpetak - + Checking for changes in remote "%1" Urruneko "% 1"-(e)an aldaketarik dagoen egiaztatzen - + Checking for changes in local "%1" Tokiko "% 1"-(e)an aldaketarik dagoen egiaztatzen - + Syncing %1 of %2 (%3 left) %2tik %1 sinkronizatzen (%3 gelditzen dira) - + Syncing %1 of %2 Sinlrnozatzen %1 %2tik - + Syncing %1 (%2 left) Sinkronizatzen %1 (%2faltan) - + Syncing %1 %1 Sinkronizatzen - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5477,27 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Karpeta berria - + You renamed %1 %1 berrizendatu duzu - + You deleted %1 %1 ezabatu duzu - + You created %1 %1 sortu duzu - + You changed %1 %1 aldatu duzu - + Synced %1 %1 sinkronizatuta @@ -5248,30 +5563,106 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Markatu irakurri gisa + + ShareDelegate + + + Create a new share link + Sortu partekatzeko esteka berri bat + + + + Copy share link location + Kopiatu partekatzeko estekaren kokapena + + + + Share options + Partekatzeko aukerak + + + + ShareDetailsPage + + + An error occurred setting the share password. + Errore bat gertatu da partekatzeko pasahitza ezartzen. + + + + Edit share + Editatu partekatzea + + + + Dismiss + Baztertu + + + + Share label + Partekatu etiketa + + + + Allow editing + Baimendu edizioa + + + + Password protect + Pasahitza babestea + + + + Set expiration date + Ezarri iraungitze-data + + + + Note to recipient + Oharra hartzaileari + + + + Unshare + Eten partekatzea + + + + Add another link + Gehitu beste esteka bat + + + + Copy share link + Kopiatu partekatzeko esteka + + ShareView - + Password required for new share Pasahitza beharrezkoa da partekatze berri batentzat - + Share password Partekatu pasahitza - + Sharing is disabled Partekatzea desgaituta dago - + This item cannot be shared. Elementu hau ezin da partekatu. - + Sharing is disabled. Partekatzea desgaituta dago. @@ -5287,7 +5678,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di SyncJournalDb - + Failed to connect database. Datu-basera konektatzeak huts egin du @@ -5345,6 +5736,22 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Kargatu emaitza gehiago + + UnifiedSearchResultNothingFound + + + No results for + Ez dago emaitzarik + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Bilaketa-emaitzen atala %1 + + UserLine @@ -5408,67 +5815,67 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di UserStatusSelector - + Online status Lineako egoera - + Online Linean - + Away Kanpoan - + Do not disturb Ez molestatu - + Mute all notifications Mututu jakinarazpen guztiak - + Invisible Ikusezina - + Appear offline Lineaz kanpo agertu - + Status message Egoera mezua - + What is your status? Zein da zure egoera? - + Clear status message after Garbitu egoera mezua ondoren - + Cancel Utzi - + Clear status message Garbitu egoera mezua ondoren - + Set status message Ezarri egoera-mezua @@ -5552,24 +5959,24 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Window - + Nextcloud desktop main dialog Mahaigaineko Nextclouden elkarrizketa-koadro nagusia - + Current account Uneko kontua - - + + Resume sync for all Berrekin sinkronizazioa guztientzat - - + + Pause sync for all Pausatu sinkronizazioa guztientzat @@ -5579,22 +5986,22 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Ezarri erabiltzaile-egoera - + Add account Gehitu kontua - + Add new account Gehitu kontu berri bat - + Settings Ezarpenak - + Exit Irten @@ -5603,11 +6010,6 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Current user avatar Uneko erabiltzailearen avatarra - - - Current account avatar - Uneko kontuaren avatarra - Current user status is online @@ -5619,70 +6021,75 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di Erabiltzailea 'ez molestatu' egoeran dago - + + Current account avatar + Uneko kontuaren avatarra + + + Current account status is online Uneko kontua linean dago - + Current account status is do not disturb Uneko kontua ez molestatu egoeran dago - + + %1 - File activity + %1 - Fitxategiaren jarduera + + + Account switcher and settings menu Kontu txandakatze eta ezarpenen menua - + Open local folder of current account Ireki uneko kontuaren karpeta lokala - + Connected Konektatuta - + Disconnected Deskonektatuta - + Open Nextcloud Talk in browser Ireki Nextcloud Talk nabigatzailean - + More apps Aplikazio gehiago - + Open %1 in browser Ireki %1 arakatzailean - + Unified search results list Bateratutako bilaketaren emaitzen zerrenda - - - %1 - File activity - %1 - Fitxategiaren jarduera - main.cpp - + System Tray not available Sistemaren erretilua ez dago erabilgarri - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1-k sistema-erretilu funtzionala behar du. XFCE exekutatzen ari bazara, mesedez jarraitu <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">argibide hauek</a>. Bestela, mesedez instalatu 'trayer' bezalako sistema-erretilu aplikazio bat eta saiatu berriro. @@ -5690,7 +6097,7 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small><a href="%1">%2</a> Git berrikuspenetik eraikia %3, %4 Qt %5 erabiliz, %6</small></p> @@ -5724,72 +6131,77 @@ Modu hau berria eta experimentala da. Erabiltzea erabakitzen baduzu, agertzen di + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Ezabatuta - + Moved to %1 %1era mugituta - + Ignored Ezikusia - + Filesystem access error Fitxategi sisteman sartzeko errorea - + Error Errorea - + Updated local metadata metadatu lokalak eguneratu dira - + Unknown Ezezaguna - + downloading deskargatzen - + uploading kargatzen - + deleting ezabatzen - + moving mugitzen - + ignoring ezikusten - + error errorea - + updating local metadata metadatu lokalak eguneratzen diff --git a/translations/client_fa.ts b/translations/client_fa.ts index 96d8e456c..3c85708db 100644 --- a/translations/client_fa.ts +++ b/translations/client_fa.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity فعّالیت - + Sharing هم‌رسانی @@ -226,12 +236,12 @@ انتقال فایل به سطل آشغال در این فلتفرم پیاده سازی نشده است - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel منصرف شدن @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. هیچ حساب‌کاربری‌ای تنظیم نشده‌ است. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ فعال سازی رمزنگاری - + + End-to-end encryption has been enabled for this account + + + + Warning هشدار - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder بازکردن پوشه - + Encrypt رمزنگاری - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync انتخاب موارد همگام‌سازی - + Force sync now - + Restart sync راه اندازی مجدد همگام سازی - + Resume sync از سر‎گیری همگام‌سازی - + Pause sync توقف به‌هنگام‌سازی - + Remove folder sync connection حذف اتصال همگام سازی پوشه - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed ساخت پوشه ناموفق - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal تأیید حذف اتصال همگام سازی پوشه - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>آیا شما واقعا می خواهید همگام سازی پوشه <i>1%</i> را متوقف نمایید؟</p><p><b>توجه:</b>این هیچ فایلی را حذف <b>نخواهد</b> کرد. </p> - + Remove Folder Sync Connection حذف اتصال همگام سازی پوشه - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running همگام سازی در حال اجراست - + The syncing operation is running.<br/>Do you want to terminate it? عملیات همگام سازی در حال اجراست.<br/>آیا دوست دارید آن را متوقف کنید؟ - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. 1% (%3%) از 2% در استفاده. برخی پوشه‌ها، شامل شبکه نصب شده یا پوشه های مشترک، ممکن است محدودیت های متفاوت داشته باشند. - + %1 of %2 in use 1% از 2% در استفاده - + Currently there is no storage usage information available. در حال حاضر هیچ اطلاعات کاربرد ذخیره سازی در دسترس نیست. - + %1 in use 1% در استفاده - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. متصل به %1. - + Server %1 is temporarily unavailable. سرور %1 بصورت موقت خارج از دسترس است. - + Server %1 is currently in maintenance mode. سرور 1% اکنون در حالت تعمیر است. - + Signed out from %1. از 1% خارج شد. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. دریافت مجوز از مرورگر. <a href='%1'>اینجا کلیک کنید</a> تا مرورگر دوباره باز شود. - + Connecting to %1 … - + No connection to %1 at %2. اتصال به 1% در 2% وجود ندارد. - + Server configuration error: %1 at %2. - + No %1 connection configured. بدون %1 اتصال پیکربندی شده. - + There are folders that were not synchronized because they are too big: پوشه‌هایی وجود دارند که همگام سازی نشده اند زیرا آن ها بسیار بزرگ هستند: - + There are folders that were not synchronized because they are external storages: پوشه‌هایی وجود دارند که همگام سازی نشده اند زیرا آن ها مخازن خارجی هستند: - + There are folders that were not synchronized because they are too big or external storages: پوشه‌هایی وجود دارند که همگام سازی نشده اند زیرا آن ها بسیار بزرگ یا مخازن خارجی هستند: - + Confirm Account Removal تائید حذف حساب‌کاربری - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>آیا شما واقعا می خواهید اتصال به حساب <i>1%</i>را حذف کنید؟</p> <p><b>توجه:</b> این هیچ فایلی را حذف نخواهد کرد.</p> - + Remove connection حذف ارتباط - - + This account supports end-to-end encryption این حساب کاربری امکان رمزنگاری انتها-به-انتها را دارد - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file خطای دسترسی به پرونده پیکربندی @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database خطا در نوشتن متادیتا در پایگاه داده @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. پوشه محلی %1 موجود نیست. - + %1 should be a folder but is not. 1% باید یک پوشه باشد اما نیست. - + %1 is not readable. %1 قابل خواندن نیست. - + %1 and %n other file(s) have been removed. 1% و n% پرونده های دیگر حذف شده اند.1% و n% پرونده های دیگر حذف شده اند. - + %1 has been removed. %1 names a file. %1 حذف شده است. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. 1% و n% پرونده های دیگر به روز رسانی شده اند. 1% و n% پرونده های دیگر به روز رسانی شده اند. - + %1 has been updated. %1 names a file. %1 بروز رسانی شده است. - + %1 has been renamed to %2 and %n other file(s) have been renamed. 1% به 2% تغییر نام داده شده و n% پرونده های دیگر تغییر نام داده شده اند.1% به 2% تغییر نام داده شده و n% پرونده های دیگر تغییر نام داده شده اند. - + %1 has been renamed to %2. %1 and %2 name files. %1 به %2 تغییر نام داده شده است. - + %1 has been moved to %2 and %n other file(s) have been moved. 1% به 2% منتقل شده و n% پرونده های دیگر منتقل شده اند.1% به 2% منتقل شده و n% پرونده های دیگر منتقل شده اند. - + %1 has been moved to %2. %1 به %2 انتقال داده شده است. - + %1 has and %n other file(s) have sync conflicts. 1% و n% سایر پرونده ها ناسازگاری همگام سازی دارند.1% و n% سایر پرونده ها ناسازگاری همگام سازی دارند. - + %1 has a sync conflict. Please check the conflict file! 1% داراری ناسازگاری همگام سازی است. لطفا پرونده ناسازگار را بررسی نمایید. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. 1% و n% سایر پرونده ها به دلیل خطاها نمی توانند همگام سازی شوند. برای جزییات log را مشاهده کنید.1% و n% سایر پرونده ها به دلیل خطاها نمی توانند همگام سازی شوند. برای جزییات log را مشاهده کنید. - + %1 could not be synced due to an error. See the log for details. 1% به دلیل خطاها نمی تواند همگام سازی شود. برای جزییات log را مشاهده کنید. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity فعالیت همگام سازی - + Could not read system exclude file نمی توان پرونده خارجی سیستم را خواند. - + A new folder larger than %1 MB has been added: %2. یک پوشه جدید بزرگتر از 1% MB اضافه شده است: 2%. - + A folder from an external storage has been added. یک پوشه از یک مخزن خارجی اضافه شده است. - + Please go in the settings to select it if you wish to download it. اگر می خواهید این را دانلود کنید لطفا به تنظیمات بروید تا آن را انتخاب کنید. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? حذف تمام فایل ها؟ - + Remove all files حذف تمام فایل ها - + Keep files نگه داشتن فایل ها @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state نمی تواند حالت پوشه را تنظیم مجدد کند - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (backup) - + (backup %1) (پشتیبان %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce موقعیت تعریف نشده - + Undefined state. - + Waiting to start syncing. انتظار برای شروع همگام‌سازی - + Preparing for sync. آماده سازی برای همگام سازی کردن. - + Sync is running. همگام سازی در حال اجراست - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce خارج کردن کاربر. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. همگام سازی فعلا متوقف شده است - + %1 (Sync is paused) %1 (همگام‌سازی موقتا متوقف شده است) - + No valid folder selected! هیچ پوشه‌ی معتبری انتخاب نشده است! - + The selected path does not exist! - + The selected path is not a folder! مسیر انتخاب شده یک پوشه نیست! - + You have no permission to write to the selected folder! شما اجازه نوشتن در پوشه های انتخاب شده را ندارید! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! پوشه محلی 1% از قبل شامل یک پوشه استفاده شده در یک اتصال همگام سازی پوشه است. لطفا یکی دیگر را انتخاب کنید! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! پوشه محلی 1% از قبل یک پوشه استفاده شده در یک اتصال همگام سازی پوشه دارد. لطفا یکی دیگر را انتخاب کنید! - + There is already a sync from the server to this local folder. Please pick another local folder! در حال حاضر یک همگام سازی از سرور به این پوشه محلی وجود دارد. لطفا یک پوشه محلی دیگر را انتخاب کنید! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce افزودن اتصال همگام سازی پوشه - + File فایل @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder شما باید متصل باشید تا پوشه ای را اضافه کنید - + Click this button to add a folder to synchronize. برای افزودن پوشه به همگام‌سازی روی این دکمه کلیک کنید. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. خطای هنگام بارگذاری لیست پوشه‌ها از سرور. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. ناسازگاری های حل نشده ای وجود دارد. برای جزییات کلیک نمایید. - + Virtual file support is enabled. - + Signed out خارج شد - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes تطبیق تغییرات - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" همگام‌سازی %1 - - + + , رشته های ترجمه نشده - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) دانلود %1/s - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) آپلود %1/s - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 از %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 5% باقی ماند، 1% از 2%، پرونده 3% از 4% - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" 1% از 2%، پرونده 3% از 4% - + file %1 of %2 فایل %1 از %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. نمایش اعلانات سرور نیازمند تائید می باشد - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required برای هم رسانی نیاز به گذرواژه است - + Please enter a password for your link share: لطفاً برای هم‌رسانی پیوندتان، گذرواژه‌ای وارد کنید: - + Sharing error خطای هم‌رسانی - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close بستن + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder پوشه همگام سازی محلی - - + + (%1) (%1) - + There isn't enough free space in the local folder! فضای خالی کافی در پوشه محلی وجود ندارد! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green"> با موفقیت متصل شده است به %1: %2 نسخه %3 (%4)</font><br/><br/> - + Invalid URL آدرس نامعتبر - + Failed to connect to %1 at %2:<br/>%3 ارتباط ناموفق با %1 در %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. هنگام تلاش برای اتصال به 1% در 2% زمان به پایان رسید. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. دسترسی توسط سرور ممنوع شد. برای تأیید اینکه شما دسترسی مناسب دارید، <a href="%1">اینجا را کلیک کنید </a> تا با مرورگر خود به سرویس دسترسی پیدا کنید. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> پوشه همگام سازی محلی %1 در حال حاضر موجود است، تنظیم آن برای همگام سازی. <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. ناموفق. - + Could not create local folder %1 نمی تواند پوشه محلی ایجاد کند %1 - + No remote folder specified! هیچ پوشه از راه دوری مشخص نشده است! - + Error: %1 خطا: %1 - + creating folder on Nextcloud: %1 ایجاد پوشه در نکس کلود: %1 - + Remote folder %1 created successfully. پوشه از راه دور %1 با موفقیت ایجاد شده است. - + The remote folder %1 already exists. Connecting it for syncing. در حال حاضر پوشه از راه دور %1 موجود است. برای همگام سازی به آن متصل شوید. - - + + The folder creation resulted in HTTP error code %1 ایجاد پوشه به خطای HTTP کد 1% منجر شد - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> ایجاد پوشه از راه دور ناموفق بود به علت اینکه اعتبارهای ارائه شده اشتباه هستند!<br/>لطفا اعتبارهای خودتان را بررسی کنید.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red"> ایجاد پوشه از راه دور ناموفق بود، شاید به علت اعتبارهایی که ارئه شده اند، اشتباه هستند.</font><br/> لطفا باز گردید و اعتبار خود را بررسی کنید.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. ایجاد پوشه از راه دور %1 ناموفق بود با خطا <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. یک اتصال همگام سازی از %1 تا %2 پوشه از راه دور راه اندازی شد. - + Successfully connected to %1! با موفقیت به %1 اتصال یافت! - + Connection to %1 could not be established. Please check again. اتصال به %1 نمی تواند مقرر باشد. لطفا دوباره بررسی کنید. - + Folder rename failed تغییر نام پوشه ناموفق بود - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b> پوشه همگام سازی محلی %1 با موفقیت ساخته شده است!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery پرونده از زمان کشف تغییر کرده است. - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! پرونده 1% بخاطر یک پرونده محلی به نام برخورد دانلود نمی شود! - + The download would reduce free local disk space below the limit دانلود فضای دیسک محلی آزاد تحت محدودیت را کاهش می دهد - + Free space on disk is less than %1 فضای خالی دیسک کمتر از %1 است - + File was deleted from server فایل از روی سرور حذف شد - + The file could not be downloaded completely. فایل به طور کامل قابل دانلود نیست. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss پرونده 1% بخاطر یک پرونده محلی به نام برخورد ذخیره نمی شود! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 نمی توان پرونده 1% را حذف کرد: خطای 2% @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash 1% بخاطر یک پرونده محلی به نام برخورد حذف نمی شود @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss کد HTTP اشتباه توسط سرور برگردانده شد. 201 انتظار می رفت، اما "1% 2%" دریافت شد. - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". کد HTTP اشتباه توسط سرور برگردانده شد. 201 انتظار می رفت، اما "1% 2%" دریافت شد. - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database خطا در نوشتن متادیتا در پایگاه داده @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss تنظیمات - + %1 Settings This name refers to the application name e.g Nextcloud - + General عمومی - + Network شبکه - + Account حساب کاربری @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link پیوند هم‌رسانی - + Link share هم‌رسانی پیوند - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share هم‌رسانی فهرست بافتاری - + Select new location … - + I shared something with you چیزی را با شما هم‌رساندم - - + + Share options گزینه‌های هم‌رسانی - - + + Activity - + Copy private link to clipboard لینک خصوصی را در کلیپ بورد کپی کنید - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed بازهم‌رسانی این پرونده مجاز نیست - + Resharing this folder is not allowed بازهم‌رسانی این شاخه مجاز نیست - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser بازکردن در مرورگر - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete حذف @@ -4344,63 +4650,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) 1% (به علت خطای قبلی از بین رفته است، دوباره در 2% امتحان کنید) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. ناسازگاری حل نشده. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() تنها 1% موجود است، حداقل 2% برای شروع مورد نیاز است - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. پایگاه داده محلی باز یا ساخته نمی شود. اطمینان حاصل کنید که دسترسی به نوشتن در پوشه همگام سازی دارید. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database نمی توان لیست سیاه را از پایگاه داده محلی خواند - + Unable to read from the sync journal. نمی توان از مجله همگام ساز خواند. - + Cannot open the sync journal نمی توان مجله همگام ساز را باز کرد @@ -4410,12 +4716,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. فضای دیسک کم است: دانلودهایی که فضای آزاد را به کمتر از 1% کاهش می دهند رد می شوند. - + There is insufficient space available on the server for some uploads. برای بعضی از بارگذاری ها در سرور فضای کافی موجود نیست. @@ -4484,59 +4790,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account افزودن حساب کاربری - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings تنظیمات - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4544,24 +4850,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4569,22 +4875,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4592,30 +4898,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4753,8 +5065,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4762,8 +5074,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4861,123 +5173,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version نسخه سرور پشتیبانی نشده - + 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. - + Disconnected قطع شده - + Disconnected from some accounts قطع شده از برخی حساب ها - + Disconnected from %1 قطع‌شده از %1 - + Disconnected from accounts: قطع شده از حساب ها: - + Account %1: %2 حساب‌کاربری %1: %2 - + Please sign in لطفا وارد شوید - + Signed out خارج شد - + Account synchronization is disabled همگام سازی حساب غیر فعال است - - + + Synchronization is paused همگام سازی متوقف شده است - + Folder %1: %2 پوشه %1: %2 - + Unresolved conflicts - + Up to date تا تاریخ - + Error during synchronization خطا حین همگام سازی - + There are no sync folders configured. هیچ پوشه‌ای برای همگام‌سازی تنظیم نشده است. - + No sync folders configured هیچ پوشه‌ همگام سازی پیکربندی شده - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 همگام سازی 1% از 2% - + Syncing %1 (%2 left) همگام‌سازی %1 (%2 باقیمانده) - + Syncing %1 همگام‌سازی %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5129,27 +5441,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5215,30 +5527,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share برای هم‌رسانی جدید نیاز به گذرواژه است - + Share password گذرواژهٔ هم‌رسانی - + Sharing is disabled هم‌رسانی از کار افتاده - + This item cannot be shared. این مورد نمی‌تواند هم‌رسانی شود. - + Sharing is disabled. هم‌رسانی از کار افتاده. @@ -5254,7 +5642,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5312,6 +5700,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5375,67 +5779,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline برون‌خط به نظر رسیدن - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5519,24 +5923,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account حساب جاری - - + + Resume sync for all - - + + Pause sync for all @@ -5546,22 +5950,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account افزودن حساب کاربری - + Add new account - + Settings تنظیمات - + Exit خروج @@ -5570,11 +5974,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5586,70 +5985,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected متصل - + Disconnected قطع شده - + Open Nextcloud Talk in browser - + More apps برنامه های بیشتر - + Open %1 in browser 1% را در مرورگر باز کنید - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5657,7 +6061,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5691,72 +6095,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted حذف شده - + Moved to %1 به %1 انتقال یافت - + Ignored نادیده گرفته شد - + Filesystem access error خطای دسترسی به فایل‌های سیستمی - + Error خطا - + Updated local metadata فرا داده محلی به روز رسانی شده - + Unknown نامشخص - + downloading در حال دانلود - + uploading در حال آپلود - + deleting در حال حذف - + moving در حال انتقال - + ignoring نادیده گرفتن - + error خطا - + updating local metadata فرا داده محلی به روز رسانی شده diff --git a/translations/client_fi.ts b/translations/client_fi.ts index 0f4a06ff7..7d533a994 100644 --- a/translations/client_fi.ts +++ b/translations/client_fi.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Avaa %1 paikallisesti - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Näytä lisää toimintoja @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Hylkää + + + Open file details + Avaa tiedoston yksityiskohdat + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Aktiviteettilista @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Tyhjennä tilaviestien valikko @@ -167,7 +172,7 @@ Opening file for local editing - + Avataan tiedosto paikallista muokkausta varten @@ -189,14 +194,19 @@ FileDetailsPage - + + Dismiss + Hylkää + + + Activity - + Sharing - + Jakaminen @@ -226,12 +236,12 @@ Roskakoriin siirtotoimintoa ei ole luotu tälle käyttöjärjestelmälle - + Error removing "%1": %2 Virhe poistaessa "%1": %2 - + Could not remove folder "%1" Ei voitu poistaa kansiota "%1" @@ -321,7 +331,7 @@ Palvelin vastasi vääräll HTTP-koodilla: Odotettiin koodia 204, mutta vastaanotettiin "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Salatun hakemiston avaaminen epäonnistui %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Tiedosto %1 on jo lukitty käyttäjän %2 toimesta. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Peruuta @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Älä salaa kansiota - + Do not encrypt folder Älä salaa kansiota - + Encrypt folder Salaa kansio - + No account configured. Tiliä ei ole määritelty. - - Display mnemonic - Näytä avainkoodi + + Disable encryption + Poista salaus käytöstä - End-to-end encryption has been enabled for this account - + Display mnemonic + Näytä avainkoodi @@ -445,18 +455,23 @@ Ota salaus käyttöön - + + End-to-end encryption has been enabled for this account + Päästä päähän -salaus on käytössä tällä tilillä + + + Warning Varoitus - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. Tämä tili tukee päästä päähän -salausta - + Encryption failed Salaus epäonnistui - + Could not encrypt folder because the folder does not exist anymore Kansiota ei voida salata, koska sitä ei ole enää olemassa - - + + Open folder Avaa kansio - + Encrypt Salaus - - + + Edit Ignored Files Muokkaa ohitettavia tiedostoja - - + + Create new folder Luo uusi kansio - - + + Availability Saatavuus - + Choose what to sync Valitse synkronoitavat tiedot - + Force sync now Pakota synkronointi nyt - + Restart sync Käynnistä synkronointi uudelleen - + Resume sync Palauta synkronointi - + Pause sync Keskeytä synkronointi - + Remove folder sync connection Poista kansion synkronointiyhteys - + Disable virtual file support … Poista virtuaalitiedostojen tuki käytöstä … - + Enable virtual file support %1 … Ota käyttöön virtuaalitiedostojen tuki %1 … - + (experimental) (kokeellinen) - + Folder creation failed Kansion luominen epäonnistui - + <p>Could not create local folder <i>%1</i>.</p> <p>Ei voitu luoda paikallista kansiota <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Vahvista kansion synkronointiyhteyden poisto - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Haluatko varmasti lopettaa kansion <i>%1</i> synkronoinnin?</p><p><b>Huomio:</b> Tämä toimenpide <b>ei</b> poista mitään tiedostoja.</p> - + Remove Folder Sync Connection Poista kansion synkronointiyhteys - + Disable virtual file support? Poistetaanko virtuaalitiedostojen tuki käytöstä? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -595,7 +610,7 @@ Ainoa etu virtuaalitiedostojen tuen poistamisesta käytöstä on se, että valik Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. - + Disable support Poista tuki @@ -605,144 +620,176 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + Poista päästä päähän -salaus käytöstä + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Synkronointi meneillään - + The syncing operation is running.<br/>Do you want to terminate it? Synkronointioperaatio on meneillään.<br/>Haluatko keskeyttää sen? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1/%2 (%3 %) käytössä. Jotkin kansiot, mukaan lukien verkkojaot ja jaetut kansiot, voivat sisältää eri rajoitukset. - + %1 of %2 in use %1/%2 käytössä - + Currently there is no storage usage information available. Tallennustilan käyttötietoja ei ole juuri nyt saatavilla. - + %1 in use %1 käytössä - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. Palvelimen versiota %1 ei tueta! Jatka omalla vastuulla. - + Connected to %1. Yhteys muodostettu kohteeseen %1. - + Server %1 is temporarily unavailable. Palvelin %1 ei ole juuri nyt saatavilla. - + Server %1 is currently in maintenance mode. Palvelin %1 on parhaillaan huoltotilassa. - + Signed out from %1. Kirjauduttu ulos kohteesta %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Hankitaan valtuutus selaimelta. <a href='%1'>Napsauta tästä</a> avataksesi selaimen uudelleen. - + Connecting to %1 … Yhdistetään kohteeseen %1 … - + No connection to %1 at %2. Ei yhteyttä kohteeseen %1 osoitteessa %2. - + Server configuration error: %1 at %2. Palvelimen kokoonpanovirhe: %1 at %2. - + No %1 connection configured. %1-yhteyttä ei ole määritelty. - + There are folders that were not synchronized because they are too big: Havaittiin kansioita, joita ei synkronoitu, koska ne ovat kooltaan liian suuria: - + There are folders that were not synchronized because they are external storages: Seuraavia kansioita ei synkronoitu, koska ne sijaitsevat ulkoisella tallennustilalla: - + There are folders that were not synchronized because they are too big or external storages: Seuraavia kansioita ei synkronoitu, koska ne ovat liian suuria tai ulkoisia tallennustiloja: - + Confirm Account Removal Vahvista tilin poistaminen - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Haluatko varmasti poistaa tilin <i>%1</i>?</p><p><b>Huomio:</b> Tämä toimenpide <b>ei</b> poista mitään tiedostoja.</p> - + Remove connection Poista yhteys - - + This account supports end-to-end encryption Tämä tili tukee päästä päähän -salausta - + Set up encryption + Aseta salaus + + + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + OCC::AccountSetupFromCommandLineJob - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -797,7 +844,7 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. OCC::ActivityListModel - + For more activities please open the Activity app. Lisää tapahtumia löydät Tapahtumat-sovelluksesta. @@ -807,12 +854,12 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Symbolisia linkkejä ja tiedostoja, jotka ovat ohitettavien tiedostojen listalla, ei synkronoida. @@ -863,32 +910,59 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Jatkaminen tarkoittaa <b>näiden asetusten poistamista </b>. - + Continuing will mean <b>ignoring these settings</b>. Jatkaminen tarkoittaa <b>näiden asetusten ohittamista </b>. - + 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>. Jotkin asetetukset on asetettu uudemmalla sovelluksen versiolla ja käyttävät ominaisuuksia, jotka eivät ole saatavilla tässä versiossa.<br><br>%1<br><br>Nykyiset asetukset on varmuuskopioituna kohteeseen %2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Lopeta - + Continue Jatka - + Error accessing the configuration file Asetustiedostoa ei voitu käyttää @@ -898,12 +972,12 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Lopeta %1 @@ -949,56 +1023,216 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. Tiedostolla %1 on virheellinen muokkausaika. Älä lataa sitä palvelimelle. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. Paikallinen tiedosto muuttui synkronoinnin aikana. - + Network error: %1 Verkkovirhe: %1 - + Error updating metadata: %1 Virhe metatietoja päivittäessä: %1 - + The file %1 is currently in use Tiedosto %1 on parhaillaan käytössä - + The local file was removed during sync. Paikallinen tiedosto poistettiin synkronoinnin aikana. - + Restoration failed: %1 Palautus epäonnistui: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + Virhe + + + + Existing file + Olemassa oleva tiedosto + + + + file A + + + + + fileA + + + + + + today + tänään + + + + + 0 byte + 0 tavua + + + + + Open existing file + Avaa olemassa oleva tiedosto + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + Uusi tiedostonimi + + + + Rename file + Nimeä tiedosto uudelleen + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Virhe kirjoittaessa metadataa tietokantaan @@ -1016,12 +1250,12 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Syötä E2E-salasana @@ -1197,8 +1431,8 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Palvelinvirhe: PROPFIND-vastaus ei ole XML-formaatissa! @@ -1206,27 +1440,27 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Virhe kansion %1 avaamisessa - + Directory not accessible on client, permission denied Kansioon ei ole käyttöoikeutta - + Directory not found: %1 Kansiota ei löytynyt: %1 - + Filename encoding is not valid Tiedostonimen merkkikoodaus ei ole kelvollinen - + Error while reading directory %1 Virhe kansion %1 luvussa @@ -1234,91 +1468,91 @@ Tämä toiminto peruu kaikki tämänhetkiset synkronoinnit. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Yritä uudelleen. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + Ei voitu avata %1 - + File %1 already locked. - + Tiedosto %1 on jo lukittu. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + Tiedosto %1 on lukittu. - + File %1 could not be locked. - + Tiedostoa %1 ei voitu lukita. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Salausta varten ei voida luoda metatietoja. Poistetaan kansion lukitus. @@ -1331,43 +1565,43 @@ OpenSSL-kirjastosi kanssa saattaa olla ongelma. %1 second(s) ago seconds elapsed since file last modified - + %1 sekunti sitten%1 sekuntia sitten %1 minute(s) ago minutes elapsed since file last modified - + %1 minuutti sitten%1 minuuttia sitten %1 hour(s) ago hours elapsed since file last modified - + %1 tunti sitten%1 tuntia sitten %1 day(s) ago days elapsed since file last modified - + %1 päivä sitten%1 päivää sitten %1 month(s) ago months elapsed since file last modified - + %1 kuukausi sitten%1 kuukautta sitten %1 year(s) ago years elapsed since file last modified - + %1 vuosi sitten%1 vuotta sitten Locked by %1 - Expires in %2 minute(s) remaining time before lock expires - + Lukinnut %1 - Vanhenee %2 minuutin kuluttuaLukinnut %1 - Vanhenee %2 minuutin kuluttua @@ -1448,145 +1682,145 @@ OpenSSL-kirjastosi kanssa saattaa olla ongelma. OCC::Folder - + Local folder %1 does not exist. Paikallista kansiota %1 ei ole olemassa. - + %1 should be a folder but is not. Kohteen %1 pitäisi olla kansio, mutta se ei kuitenkaan ole kansio. - + %1 is not readable. %1 ei ole luettavissa. - + %1 and %n other file(s) have been removed. %1 ja %n muu tiedosto on poistettu.%1 ja %n muuta tiedostoa on poistettu. - + %1 has been removed. %1 names a file. %1 on poistettu. - + %1 and %n other file(s) have been added. %1 ja %n muuta tiedostoa on lisätty.%1 ja %n muuta tiedostoa on lisätty. - + %1 has been added. %1 names a file. %1 on lisätty. - + %1 and %n other file(s) have been updated. %1 ja %n muu tiedosto on päivitetty.%1 ja %n muuta tiedostoa on päivitetty. - + %1 has been updated. %1 names a file. %1 on päivitetty. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 on nimetty uudelleen nimellä %2 ja %n muuta tiedostoa on uudelleennimetty.%1 on nimetty uudelleen nimellä %2 ja %n muuta tiedostoa on uudelleennimetty. - + %1 has been renamed to %2. %1 and %2 name files. %1 on nimetty uudeelleen muotoon %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 on siirretty kohteeseen %2 ja %n muuta tiedostoa on siirretty.%1 on siirretty kohteeseen %2 ja %n muuta tiedostoa on siirretty. - + %1 has been moved to %2. %1 on siirretty kohteeseen %2. - + %1 has and %n other file(s) have sync conflicts. %1 ja %n muulla tiedostolla on synkronointiristiriitoja.%1 ja %n muulla tiedostolla on synkronointiristiriitoja. - + %1 has a sync conflict. Please check the conflict file! Kohteella %1 on synkronoinnin ristiriita. Tarkista konfliktitiedosto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 ja %n muuta tiedostoa ei voitu synkronoida virheiden takia. Katso lisätietoja lokista.%1 ja %n muuta tiedostoa ei voitu synkronoida virheiden takia. Katso lisätietoja lokista. - + %1 could not be synced due to an error. See the log for details. Kohdetta %1 ei voi synkronoida virheen vuoksi. Katso tarkemmat tiedot lokista. - + %1 and %n other file(s) are currently locked. %1 ja %n muuta tiedostoa on tällä hetkellä lukittuna.%1 ja %n muuta tiedostoa on tällä hetkellä lukittuna. - + %1 is currently locked. %1 on lukittu. - + Sync Activity Synkronointiaktiviteetti - + Could not read system exclude file - + A new folder larger than %1 MB has been added: %2. Uusi kansio kooltaan yli %1 Mt on lisätty: %2. - + A folder from an external storage has been added. Kansio erillisestä tallennustilasta on lisätty. - + Please go in the settings to select it if you wish to download it. Jos haluat ladata sen, valitse kansio asetuksista. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1595,7 +1829,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1603,24 +1837,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Poistetaanko kaikki tiedostot? - + Remove all files Poista kaikki tiedostot - + Keep files Pidä tiedostot @@ -1656,22 +1890,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Kansion tilaa ei voitu alustaa - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (varmuuskopio) - + (backup %1) (varmuuskopio %1) @@ -1681,27 +1915,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Määrittelemätön tila. - + Undefined state. - + Waiting to start syncing. Odotetaan synkronoinnin aloitusta. - + Preparing for sync. Valmistellaan synkronointia. - + Sync is running. Synkronointi on meneillään. - + Sync finished with unresolved conflicts. Synkronointi päättyi ratkaisemattomilla konflikteilla. @@ -1721,62 +1955,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Käyttäjän keskeyttämä. - + Last sync was successful. Viimeisin synkronointi suoritettiin onnistuneesti. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Synkronointi on keskeytetty. - + %1 (Sync is paused) %1 (Synkronointi on keskeytetty) - + No valid folder selected! Kelvollista kansiota ei ole valittu! - + The selected path does not exist! Valittua polkua ei ole olemassa! - + The selected path is not a folder! Valittu polku ei ole kansio! - + You have no permission to write to the selected folder! Sinulla ei ole kirjoitusoikeutta valittuun kansioon! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Paikallinen kansio %1 sisältää kansion, jota käytetään kansion synkronointiyhteydessä. Valitse toinen kansio! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! Palvelimelta synkronoidaan jo tähän paikalliseen kansioon. Valitse toinen sijainti! @@ -1789,7 +2023,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Lisää kansion synkronointiyhteys - + File Tiedosto @@ -1797,152 +2031,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Yhteyden tulee olla muodostettu, jotta voit lisätä kansion - + Click this button to add a folder to synchronize. Napsauta valitaksesi synkronoitavan kansion. - - + + Could not decrypt! + Salausta ei voitu purkaa! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Virhe ladatessa kansiolistausta palvelimelta. - + Fetching folder list from server … Noudetaan kansiolistausta palvelimelta… - + There are unresolved conflicts. Click for details. Selvittämättömiä ristiriitoja. Napsauta nähdäksesi tiedot. - + Virtual file support is enabled. Virtuaalitiedostojen tuki on käytössä. - + Signed out Kirjauduttu ulos - + Synchronizing VirtualFiles with local folder Synkronoidaan virtuaalitiedostoja paikalliseen kansioon - + Synchronizing with local folder Synkronoidaan paikallisen kansion kanssa - + Checking for changes in remote "%1" Tarkistetaan muutoksia palvelimella "%1" - + Checking for changes in local "%1" Tarkistetaan muutoksia paikallisesti "%1" - + Reconciling changes Täsmäytetään muutoksia - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synkronoidaan %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) lataus %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) lähetys %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3/%4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Muutama sekunti jäljellä, %1/%2, tiedosto %3/%4 - + %5 left, %1 of %2, file %3 of %4 %5 jäljellä, %1/%2, tiedosto %3/%4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1/%2, tiedosto %3/%4 - + file %1 of %2 tiedosto %1/%2 - + Waiting … Odotetaan ... - + Waiting for %n other folder(s) … Odotetaan %n muuta kansiota ...Odotetaan %n muuta kansiota ... - + Preparing to sync … Valmistaudutaan synkronoimaan ... @@ -2173,13 +2411,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable vakaa - + beta beta @@ -2231,59 +2469,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Koosta vianetsintätiedot - + Server notifications that require attention. Palvelinilmoitukset jotka vaativat huomiota. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? Vaihdetaanko päivityskanavaa? - + 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. 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. - + Change update channel Vaihda päivityskanava - + Cancel Peruuta - + Zip Archives Zip-arkistot - + Debug Archive Created Vianetsintätiedot koostettu - + Debug archive is created at %1 Vianetsintätietodot koostettu kohteeseen %1 @@ -2291,22 +2529,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Salasana vaaditaan jaettavalle - + Please enter a password for your link share: Syötä salasana linkkijaolle: - + Sharing error Jakamisvirhe - + Could not retrieve or create the public link share. Error: %1 @@ -2544,6 +2782,11 @@ Kohteet, joissa poisto on sallittu, poistetaan, jos ne estävät kansion poistam Close Sulje + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2876,60 +3119,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 Käytä &virtuaalitiedostoja sen sijaan, että sisältö ladataan välittömästi %1 - + (experimental) (kokeellinen) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Windows ei tue virtuaalitiedostoja levyosioiden juurihakemistoissa. Valitse alikansio. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" Synkronoi kansio "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 vapaata tilaa - + Virtual files are not available for the selected folder Virtuaalitiedostot eivät ole käytettävissä valitulle kansiolle - + Local Sync Folder Paikallinen synkronointikansio - - + + (%1) (%1) - + There isn't enough free space in the local folder! Paikallisessa kansiossa ei ole riittävästi vapaata tilaa! @@ -3001,7 +3244,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3033,144 +3277,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Muodostettu yhteys onnistuneesti kohteeseen %1: %2 versio %3 (%4)</font><br/><br/> - + Invalid URL Virheellinen verkko-osoite - + Failed to connect to %1 at %2:<br/>%3 Yhteys %1iin osoitteessa %2 epäonnistui:<br/>%3 - + Timeout while trying to connect to %1 at %2. Aikakatkaisu yrittäessä yhteyttä kohteeseen %1 osoitteessa %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Palvelin esti käyttämisen. Vahvista käyttöoikeutesi palvelimeen <a href="%1">napsauttamalla tästä</a> ja kirjaudu palveluun selaimella. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Paikallinen kansio %1 on jo olemassa, asetetaan se synkronoitavaksi.<br/><br/> - + Creating local sync folder %1 … Luodaan paikallinen synkronointikansio %1 … - + OK OK - + failed. epäonnistui. - + Could not create local folder %1 Paikalliskansion %1 luonti epäonnistui - + No remote folder specified! Etäkansiota ei määritelty! - + Error: %1 Virhe: %1 - + creating folder on Nextcloud: %1 luodaan kansio Nextcloudiin: %1 - + Remote folder %1 created successfully. Etäkansio %1 luotiin onnistuneesti. - + The remote folder %1 already exists. Connecting it for syncing. Etäkansio %1 on jo olemassa. Otetaan siihen yhteyttä tiedostojen täsmäystä varten. - - + + The folder creation resulted in HTTP error code %1 Kansion luonti aiheutti HTTP-virhekoodin %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Etäkansion luominen epäonnistui koska antamasi tunnus/salasana ei täsmää!<br/>Ole hyvä ja palaa tarkistamaan tunnus/salasana</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Pilvipalvelun etäkansion luominen ei onnistunut , koska tunnistautumistietosi ovat todennäköisesti väärin.</font><br/>Palaa takaisin ja tarkista käyttäjätunnus ja salasana.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Etäkansion %1 luonti epäonnistui, virhe <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Täsmäysyhteys kansiosta %1 etäkansioon %2 on asetettu. - + Successfully connected to %1! Yhteys kohteeseen %1 muodostettiin onnistuneesti! - + Connection to %1 could not be established. Please check again. Yhteyttä osoitteeseen %1 ei voitu muodostaa. Ole hyvä ja tarkista uudelleen. - + Folder rename failed Kansion nimen muuttaminen epäonnistui - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Paikallinen synkronointikansio %1 luotu onnistuneesti!</b></font> @@ -3190,15 +3434,15 @@ Note that using any logging command line options will override this setting. Cancel - + Peruuta - + Enable experimental feature? Otetaanko kokeellinen toiminto käyttöön? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3209,12 +3453,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe Pysy turvassa @@ -3243,162 +3487,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Symboliset linkit eivät ole tuettuja synkronoinnissa. - + File is listed on the ignore list. Tiedosto on ohitettavien tiedostojen listalla. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character Tiedoston nimi sisältää ainakin yhden virheellisen merkin - + The file name is a reserved name on this file system. Tiedostonimi on varattu tämän tiedostojärjestelmän käyttöön. - + Filename contains trailing spaces. Tiedostonimi sisältää välilyöntejä lopussa. - + Filename contains leading spaces. Tiedostonimi sisältää välilyöntejä alussa. - + Filename contains leading and trailing spaces. Tiedostonimi sisältää välilyöntejä alussa ja lopussa. - + Filename is too long. Tiedoston nimi on liian pitkä. - + File/Folder is ignored because it's hidden. Tiedosto/kansio ohitetaan, koska se on piilotettu. - + Stat failed. Stat epäonnistui. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikti: Palvelimen versio ladattu, paikallinen kopio on nimetty uudelleen mutta ei ladattu palvelimelle. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Tiedostonimeä ei voida enkoodata tiedostojärjestelmälläsi. - + The filename is blacklisted on the server. Tiedostonimi on palvelimella mustalla listalla. - + File has extension reserved for virtual files. Tiedoston pääte on varattu virtuaalitiedostoille. - + size koko - + permission käyttöoikeus - + file id tiedoston id - + Server reported no %1 - + Cannot sync due to invalid modification time Ei voida synkronoida virheellisen muokkausajan vuoksi - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder Ei sallittu, koska oikeutesi eivät riitä alikansioiden lisäämiseen kyseiseen kansioon - + Not allowed because you don't have permission to add files in that folder Ei sallittu, koska käyttöoikeutesi eivät riitä tiedostojen lisäämiseen kyseiseen kansioon - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database Virhe tietokantaa luettaessa - + Server replied with an error while reading directory "%1" : %2 @@ -3406,22 +3655,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 Virhe metatietoja päivittäessä: %1 - + File is currently in use Tiedosto on tällä hetkellä käytössä @@ -3434,19 +3683,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Tiedosto on muuttunut löytymisen jälkeen - + Could not delete file record %1 from local DB @@ -3457,32 +3706,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 Levyllä on vapaata tilaa vähemmän kuin %1 - + File was deleted from server Tiedosto poistettiin palvelimelta - + The file could not be downloaded completely. Tiedostoa ei voitu ladata täysin. - + The downloaded file is empty, but the server said it should have been %1. @@ -3492,18 +3741,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Virhe päivittäessä metatietoja: %1 - + The file %1 is currently in use Tiedosto %1 on tällä hetkellä käytössä @@ -3524,7 +3778,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ei voitu poistaa tiedostoa %1, virhe: %2 @@ -3535,16 +3789,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Ei voitu luoda kansiota %1 - + Error updating metadata: %1 Virhe metatietoja päivittäessä: %1 - + The file %1 is currently in use Tiedosto %1 on tällä hetkellä käytössä @@ -3552,7 +3811,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3565,46 +3824,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 Virhe metatietoja päivittäessä: %1 - + The file %1 is currently in use Tiedosto %1 on tällä hetkellä käytössä - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Tiedoston uudelleennimeäminen epäonnistui @@ -3625,7 +3889,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Palvelin palautti väärän HTTP-koodin. Odotettiin 204, vastaanotettiin "%1 %2". @@ -3638,12 +3902,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss HTTP-palvelin palautti väärän koodin. Odotettiin koodia 201, vastaanotettiin "%1 %2". - + Error writing metadata to the database: %1 Virhe kirjoittaessa metatietoja tietokantaan: %1 - + The file %1 is currently in use Tiedosto %1 on tällä hetkellä käytössä @@ -3651,42 +3915,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". HTTP-palvelin palautti väärän koodin. Odotettiin koodia 201, vastaanotettiin "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Virhe metatietoja päivittäessä: %1 - + The file %1 is currently in use Tiedosto %1 on tällä hetkellä käytössä - + Error setting pin state - + Error writing metadata to the database Virhe kirjoittaessa metadataa tietokantaan @@ -3696,7 +3960,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Failed to upload encrypted file. - + Salatun tiedoston lähettäminen epäonnistui. @@ -3876,7 +4140,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Vastaa @@ -3894,23 +4158,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Asetukset - + %1 Settings This name refers to the application name e.g Nextcloud %1 -asetukset - + General Yleiset - + Network Verkko - + Account Tili @@ -3918,19 +4182,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + Sisäinen linkki + + + Enter a note for the recipient - + Lisää muistiinpano vastaanottajalle @@ -4004,7 +4273,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4013,132 +4282,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + Kansion salaaminen epäonnistui + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + Kansio salattu onnistuneesti + + + + The following folder was encrypted successfully: "%1" + Seuraava kansio salattiin: "%1" + + + Context menu share - + Select new location … Valitse uusi sijainti… - + I shared something with you Jaoin jotain kanssasi - - + + Share options Jakamisen valinnat - - + + Activity - + Copy private link to clipboard Kopioi yksityinen linkki leikepöydälle - + Send private link by email … Lähetä yksityinen linkki sähköpostitse… + + + Expire in %1 minutes + remaining time before lock expire + Vanhenna %1 minuutin kuluttuaVanhenna %1 minuutin kuluttua + - + Leave this share - + Resharing this file is not allowed Tämän tiedoston uudelleenjakaminen ei ole sallittu - + Resharing this folder is not allowed Tämän kansion uudelleenjakaminen ei ole sallittu - - + + Copy public link Kopioi julkinen linkki - + Copy internal link Kopioi sisäinen linkki - + + Encrypt + Salaa + + + Lock file Lukitse tiedosto - + Unlock file Avaa tiedoston lukitus - + Locked by %1 Lukinnut %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Vanhenee %1 minuutin kuluttuaVanhenee %1 minuutin kuluttua - + Edit Muokkaa - + Open in browser Avaa selaimessa - + Resolve conflict … Selvitä virhetilanne … - + Move and rename … Siirrä ja uudelleennimeä … - + Move, rename and upload … Siirrä, uudelleennimeä ja lataa … - + Delete local changes Poista paikalliset muutokset - + Move and upload … Siirrä ja lataa … - + Delete Poista @@ -4356,63 +4662,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 Tiedostoa ei voitu päivittää: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Selvittämätön ristiriita. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Vain %1 on käytettävissä, käynnistymiseen tarvitaan %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal @@ -4422,12 +4728,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Levytila on vähissä. Lataukset, jotka pienentäisivät tilaa alle %1 ohitettiin. - + There is insufficient space available on the server for some uploads. Palvelimella on liian vähän tilaa joillekin latauksille. @@ -4490,65 +4796,65 @@ This is a new, experimental mode. If you decide to use it, please report any iss Syncing file %1 of %2 - + Synkronoidaan tiedostoa %1/%2 OCC::Systray - + Download Lataa - + Add account Lisää tili - + Open main dialog Avaa pääikkuna - - + + Pause sync Tauota synkronointi - - + + Resume sync Jatka synkronointia - + Settings Asetukset - + Help Ohje - + Exit %1 Lopeta %1 - + Pause sync for all Tauota synkronointi kaikille - + Resume sync for all Jatka kaikkien synkronointia - + %1: %2 %1: %2 @@ -4556,24 +4862,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1-työpöytäsovellus</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versio %1. Lisätietoja on saatavilla napsauttamalla <a href='%2'>tästä</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4581,22 +4887,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4604,30 +4910,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Yritä uudelleen kaikkia lähetyksiä + + + + Resolve conflict + Selvitä ristiriita + OCC::UserModel - + Confirm Account Removal Vahvista tilin poistaminen - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Poista yhteys - + Cancel Peruuta @@ -4765,8 +5077,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4774,8 +5086,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4873,123 +5185,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Palvelimen versio ei ole tuettu - + 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. - + Disconnected Yhteys katkaistu - + Disconnected from some accounts Yhteys katkaistu joihinkin tileihin - + Disconnected from %1 Katkaise yhteys kohteeseen %1 - + Disconnected from accounts: Katkaistu yhteys tileihin: - + Account %1: %2 Tili %1: %2 - + Please sign in Kirjaudu sisään - + Signed out Kirjauduttu ulos - + Account synchronization is disabled Tilin synkronointi on poistettu käytöstä - - + + Synchronization is paused Synkronointi on keskeytetty - + Folder %1: %2 Kansio %1: %2 - + Unresolved conflicts Selvittämättömiä konflikteja - + Up to date Ajan tasalla - + Error during synchronization Virhe kesken synkronoinnin - + There are no sync folders configured. Synkronointikansioita ei ole määritelty. - + No sync folders configured Synkronointikansioita ei ole määritelty - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Synkronoidaan %1/%2 (%3 jäljellä) - + Syncing %1 of %2 Synkronoidaan %1/%2 - + Syncing %1 (%2 left) Synkronoidaan %1 (%2 jäljellä) - + Syncing %1 Synkronoidaan %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5141,27 +5453,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Uusi kansio - + You renamed %1 Nimesit uudelleen %1 - + You deleted %1 Poistit %1 - + You created %1 Loit %1 - + You changed %1 Muutit %1 - + Synced %1 Synkronoitu %1 @@ -5227,32 +5539,108 @@ This is a new, experimental mode. If you decide to use it, please report any iss Merkitse luetuksi + + ShareDelegate + + + Create a new share link + Luo uusi jakolinkki + + + + Copy share link location + Kopioi jakolinkki + + + + Share options + Jakamisen valinnat + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + Muokkaa jakoa + + + + Dismiss + Hylkää + + + + Share label + + + + + Allow editing + Salli muokkaaminen + + + + Password protect + Suojaa salasanalla + + + + Set expiration date + Aseta vanhenemispäivä + + + + Note to recipient + Viesti vastaanottajalle + + + + Unshare + Lopeta jakaminen + + + + Add another link + Lisää toinen linkki + + + + Copy share link + Kopioi jakolinkki + + ShareView - + Password required for new share - + Uusi jako vaatii salasanan - + Share password - + Jaon salasana - + Sharing is disabled - + Jakaminen on poistettu käytöstä - + This item cannot be shared. - + Tätä kohdetta ei voi jakaa. - + Sharing is disabled. - + Jakaminen on poistettu käytöstä. @@ -5260,13 +5648,13 @@ This is a new, experimental mode. If you decide to use it, please report any iss Search for users or groups… - + Etsi käyttäjiä tai ryhmiä… SyncJournalDb - + Failed to connect database. Tietokantaan yhdistäminen epäonnistui. @@ -5324,6 +5712,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Lataa lisää tuloksia + + UnifiedSearchResultNothingFound + + + No results for + Ei tuloksia haulla + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5339,12 +5743,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current account status is online - + Nykyinen tilin tila on "Online" Current account status is do not disturb - + Nykyinen tilin tila on "Älä häiritse" @@ -5387,67 +5791,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away Poissa - + Do not disturb Älä häiritse - + Mute all notifications Mykistä kaikki ilmoitukset - + Invisible Näkymätön - + Appear offline - + Status message Tilaviesti - + What is your status? Mikä on tilatietosi? - + Clear status message after - + Cancel Peruuta - + Clear status message Tyhjennä tilaviesti - + Set status message Aseta tilaviesti @@ -5531,24 +5935,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Nykyinen tili - - + + Resume sync for all Jatka synkronointia - - + + Pause sync for all Tauota synkronointi @@ -5558,22 +5962,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Aseta käyttäjän tila - + Add account Lisää tili - + Add new account Lisää uusi tili - + Settings Asetukset - + Exit Poistu @@ -5582,11 +5986,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Käyttäjän avatar - - - Current account avatar - - Current user status is online @@ -5598,70 +5997,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Nykyinen käyttäjän tila on 'Älä häiritse' - - Current account status is online + + Current account avatar - + + Current account status is online + Nykyinen tilin tila on "Online" + + + Current account status is do not disturb + Nykyinen tilin tila on "Älä häiritse" + + + + %1 - File activity - + Account switcher and settings menu Tilin valinta ja asetukset - + Open local folder of current account Avaa nykyisen tilin paikallinen kansio - + Connected Yhdistetty - + Disconnected Yhteys katkaistu - + Open Nextcloud Talk in browser Avaa Nextcloud Talk selaimessa - + More apps Lisää sovelluksia - + Open %1 in browser Avaa %1 selaimeen - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Ilmoitusaluetta ei ole saatavilla - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5669,7 +6073,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5703,72 +6107,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Poistettu - + Moved to %1 Siirretty kohteeseen %1 - + Ignored Ohitettu - + Filesystem access error Tiedostojärjestelmän käyttövirhe - + Error Virhe - + Updated local metadata Paikalliset metatiedot päivitetty - + Unknown Tuntematon - + downloading ladataan - + uploading lähetetään - + deleting poistetaan - + moving siirretään - + ignoring ohitetaan - + error virhe - + updating local metadata päivitetään paikallisia metatietoja @@ -5952,12 +6361,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss The file cannot be shared because it does not have sharing permission. - + Tiedostoa ei voi jakaa, koska siinä ei ole jakamisoikeutta. Please enter a password for your link share: - + Syötä salasana linkkijaolle: @@ -5995,7 +6404,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss View only - + Vain katselu diff --git a/translations/client_fr.ts b/translations/client_fr.ts index d601bfa70..3acec988e 100644 --- a/translations/client_fr.ts +++ b/translations/client_fr.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Ouvrir %1 localement - + In %1 Dans %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Afficher plus d'actions @@ -24,9 +24,14 @@ ActivityItemContent - + Dismiss - Ignorer + Rejeter + + + + Open file details + Ouvrir les détails du fichier @@ -37,7 +42,7 @@ ActivityList - + Activity list Liste des activités @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Menu d'effacement du message de statut @@ -65,17 +70,17 @@ Answer Talk call notification - Répondre à la notification d'appel Talk + Répondre à la notification d'appel de Talk Decline - Refuser + Décliner Decline Talk call notification - Refuser la notification d'appel Talk + Décliner la notification d'appel de Talk @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Rejeter + + + Activity Activité - + Sharing Partage @@ -226,12 +236,12 @@ Mettre à la corbeille n'est pas disponible sur cette plateforme - + Error removing "%1": %2 Erreur lors de la suppression de "%1" : %2 - + Could not remove folder "%1" Impossible de supprimer le dossier "%1" @@ -321,7 +331,7 @@ Le code HTTP retourné par le serveur n'est pas valide. La valeur attendue est 204 mais la valeur retournée est "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Impossible de déverrouiller le dossier chiffré %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Le fichier %1 est déjà verrouillé par %2. - + Lock operation on %1 failed with error %2 L'opération de verrouillage de %1 a échoué avec l'erreur %2 - + Unlock operation on %1 failed with error %2 L'opération de déverrouillage de %1 a échoué avec l'erreur %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Annuler @@ -387,7 +397,7 @@ Apply manual changes - Appliquer les changements manuellement + Appliquer les changements manuels @@ -400,12 +410,12 @@ Il semble que la fonctionnalité de fichiers virtuels soit activée sur ce dossier. Pour le moment, il n'est pas possible de télécharger implicitement des fichiers virtuels qui sont chiffrés de bout en bout. Pour bénéficier d'une expérience optimale avec les fichiers virtuels et le chiffrement de bout en bout, assurez-vous que le dossier chiffré soit paramétré avec l'option "Rendre toujours disponible localement". - + End-to-end Encryption with Virtual Files Chiffrement de bout en bout avec fichiers virtuels - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Il semble que la fonctionnalité des Fichiers Virtuels soit activée sur ce dossier. Pour l'instant, il n'est pas possible de télécharger implicitement des fichiers virtuels qui sont chiffrés de bout en bout. Pour bénéficier d'une expérience optimale avec les fichiers virtuels et le chiffrement de bout en bout, assurez-vous que le dossier chiffré soit marqué par l'option "Toujours rendre disponible localement". @@ -415,29 +425,29 @@ Ne pas chiffrer le dossier - + Do not encrypt folder Ne pas chiffrer le dossier - + Encrypt folder Chiffrer le dossier - + No account configured. Aucun compte configuré. - - Display mnemonic - Afficher la phrase secrète + + Disable encryption + Désactiver le chiffrement - End-to-end encryption has been enabled for this account - Le chiffrement de bout en bout a été activé sur ce compte + Display mnemonic + Afficher la phrase secrète @@ -445,19 +455,24 @@ Activer le chiffrement - + + End-to-end encryption has been enabled for this account + Le chiffrement de bout en bout a été activé sur ce compte + + + Warning Attention - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? Le chiffrement de bout en bout n'est pas configuré sur cet appareil. Une fois qu'il sera configuré, vous serez en mesure de chiffrer ce dossier. Souhaitez-vous configurer le chiffrement de bout en bout ? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Vous ne pouvez pas chiffrer un dossier avec son contenu, veuillez enlever les fichiers. Attendez une nouvelle synchronisation puis chiffrez le dossier. @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. Ce compte supporte l'encryption de bout en bout - + Encryption failed Le chiffrement a échoué - + Could not encrypt folder because the folder does not exist anymore Impossible de chiffrer le dossier car il n'existe plus - - + + Open folder - Ouvrir le dossier local + Ouvrir le dossier - + Encrypt Chiffrer - - + + Edit Ignored Files Modifier les fichiers ignorés - - + + Create new folder Créer un nouveau dossier - - + + Availability Disponibilité - + Choose what to sync Sélectionner le contenu à synchroniser - + Force sync now Forcer la synchronisation maintenant - + Restart sync Redémarrer la synchronisation - + Resume sync Reprendre la synchronisation - + Pause sync - Mettre en pause + Mettre en pause la synchronisation - + Remove folder sync connection - Supprimer la synchronisation du dossier + Retirer la connexion de synchronisation de dossier - + Disable virtual file support … - Désactiver la prise en charge du fichier virtuel ... + Désactiver la prise en charge du fichier virtuel… - + Enable virtual file support %1 … Activer la prise en charge du fichier virtuel %1 … - + (experimental) (expérimental) - + Folder creation failed - Échec de création du dossier + Échec de la création du dossier - + <p>Could not create local folder <i>%1</i>.</p> <p>Impossible de créer le dossier local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmer la suppression de synchronisation de dossier - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Voulez-vous vraiment arrêter de synchroniser le dossier <i>%1</i> ?</p><p><b>Note :</b> Aucun fichier ne sera supprimé.</p> - + Remove Folder Sync Connection Supprimer la synchronisation de ce dossier - + Disable virtual file support? Désactiver le support des fichiers virtuels ? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -594,7 +609,7 @@ Le seul avantage de désactiver la prise en charge du fichier virtuel est que le Cette action entraînera l'interruption de toute synchronisation en cours. - + Disable support Désactiver le support @@ -604,146 +619,178 @@ Cette action entraînera l'interruption de toute synchronisation en cours.< Phrase secrète du chiffrement de bout en bout - + End-to-end encryption mnemonic Phrase secrète du chiffrement de bout en bout - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Pour protéger votre identité cryptographique, nous la chiffrons avec une phrase secrète de 12 mots du dictionnaire. Veuillez la noter et la garder en sécurité. Elle sera nécessaire pour ajouter d’autres appareils à votre compte (comme votre smartphone ou votre ordinateur portable). - + + Disable end-to-end encryption + Désactiver le chiffrement de bout en bout + + + + Disable end-to-end encryption for %1? + Désactiver le chiffrement de bout en bout pour %1 ? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Le retrait du chiffrage de bout en bout supprimera localement les fichiers chiffrés synchronisés.<br>Les fichiers chiffrés demeureront sur le serveur. + + + Sync Running Synchronisation en cours - + The syncing operation is running.<br/>Do you want to terminate it? La synchronisation est en cours.<br/>Voulez-vous l'arrêter ? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) utilisés sur %2. Certains dossiers, montés depuis le réseau ou partagés, peuvent avoir des limites différentes. - + %1 of %2 in use %1 utilisés sur %2 - + Currently there is no storage usage information available. Actuellement aucune information d'utilisation de stockage n'est disponible. - + %1 in use %1 utilisé(s) - + %1 as %2 %1 avec le compte %2 - + The server version %1 is unsupported! Proceed at your own risk. La version %1 du serveur n'est pas maintenue ! Vous prenez vos propres risques. - + Connected to %1. Connecté au serveur %1. - + Server %1 is temporarily unavailable. Le serveur %1 est temporairement indisponible. - + Server %1 is currently in maintenance mode. Le serveur %1 est en cours de maintenance. - + Signed out from %1. Session sur %1 fermée. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. En attente d'autorisation du navigateur. <a href='%1'>Cliquer ici</a> pour recharger le navigateur. - + Connecting to %1 … Connexion à %1 ... - + No connection to %1 at %2. Aucune connexion au serveur %1 à l'adresse %2. - + Server configuration error: %1 at %2. Erreur de configuration serveur : %1 à %2. - + No %1 connection configured. Aucune connexion à %1 configurée - + There are folders that were not synchronized because they are too big: Certains dossiers n'ont pas été synchronisés parce qu'ils sont de taille trop importante : - + There are folders that were not synchronized because they are external storages: Certains dossiers n'ont pas été synchronisés parce qu'ils sont localisés sur un stockage externe : - + There are folders that were not synchronized because they are too big or external storages: Certains dossiers n'ont pas été synchronisés parce qu'ils sont localisés sur un stockage externe ou qu'ils sont de taille trop importante : - + Confirm Account Removal Confirmation de retrait du compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Êtes-vous certain de vouloir retirer <i>%1</i> des comptes synchronisés avec le serveur ?</p><p><b>Remarque :</b> cela ne supprimera pas votre compte sur le serveur et aucun fichier ne sera supprimé ni localement ni en ligne.</p> - + Remove connection - Retirer le compte + Retirer la connexion - - + This account supports end-to-end encryption Ce compte prend en charge le chiffrement de bout en bout. - + Set up encryption Configurer le chiffrement - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - Le chiffrement de bout en bout a été activé sur ce compte avec un autre appareil.<br>Il peut être activé sur cet appareil en entrant votre phrase secrète. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Le chiffrement de bout en bout a été activé sur ce compte avec un autre appareil.<br>Il peut être activé sur cet appareil en entrant votre phrase secrète.<br>Cela permettra la synchronisation des dossiers chiffrés existants. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + La requête authentifiée au serveur a été redirigée vers « %1 ». L'URL est mauvaise, le serveur est mal configuré. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Accès refusé par le serveur. Pour vérifier que vous disposez d'un accès approprié, <a href="%1">cliquez ici</a> pour accéder au service avec votre navigateur Web. + + + + There was an invalid response to an authenticated WebDAV request + Réponse invalide reçue suite à une requête WebDav authentifiée. @@ -791,13 +838,13 @@ Vous prenez vos propres risques. Unknown account state - Etat du compte inconnu + État du compte inconnu OCC::ActivityListModel - + For more activities please open the Activity app. Pour plus d'activités veuillez lancer l'application Activité. @@ -807,12 +854,12 @@ Vous prenez vos propres risques. Récupération des activités… - + Fetching activities … Récupération des activités... - + Files from the ignore list as well as symbolic links are not synced. Les fichiers présents dans la liste d'exclusion ainsi que les liens symboliques ne sont pas synchronisés. @@ -863,32 +910,59 @@ Vous prenez vos propres risques. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Continuer va <b>supprimer ces paramètres</b>. - + Continuing will mean <b>ignoring these settings</b>. Continuer va <b>ignorer ces paramètres</b>. - + 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>. Des paramètres ont été configurés dans des versions plus récentes que ce client et utilisent des fonctionnalités non disponibles dans la version actuelle. <br><br>%1<br><br> Le fichier de configuration actuel a été sauvegardé à <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Quitter - + Continue Continuer - + Error accessing the configuration file Erreur lors de l'accès au fichier de configuration @@ -898,12 +972,12 @@ Vous prenez vos propres risques. Une erreur s'est produite lors de l'accès au fichier de configuration situé dans %1. Assurez-vous que le fichier est accessible par votre utilisateur. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Une erreur est survenue lors de l'accès au fichier de configuration à %1. Merci de vérifier que le fichier est accessible du compte système. - + Quit %1 Quitter %1 @@ -923,17 +997,17 @@ Vous prenez vos propres risques. &Username: - &NomUtilisateur: + &Username: &User: - &Utilisateur : + &User : &Password: - &Mot de passe : + &Password: @@ -949,56 +1023,216 @@ Vous prenez vos propres risques. Le fichier %1 présente une date de modification invalide. Envoi au serveur impossible. - + File Removed (start upload) %1 Fichier supprimé (démarrer l'envoi) %1 - + File %1 has invalid modification time. Do not upload to the server. Le fichier %1 présente une date de modification invalide. Envoi au serveur impossible. - + Local file changed during syncing. It will be resumed. Fichier local modifié pendant la synchronisation. La synchronisation sera reprise. - - + + Local file changed during sync. Fichier local modifié pendant la synchronisation. - + Network error: %1 Erreur réseau : %1 - + Error updating metadata: %1 Erreur à la mise à jour des méta-données : %1 - + The file %1 is currently in use Le fichier %1 est en cours d'utilisation - + The local file was removed during sync. Le fichier local a été supprimé pendant la synchronisation. - + Restoration failed: %1 - Échec de la restauration + Échec de la restauration : %1 + + + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Impossible de renommer le fichier parce qu'un fichier portant le même nom existe déjà sur le serveur. Veuillez choisir un autre nom. + + + + Could not rename file. Please make sure you are connected to the server. + Impossible de renommer le fichier. Assurez-vous de bien être connecté au serveur. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Vous n'avez pas les permissions de renommer ce fichier. Veuillez demander à son auteur de le renommer. + + + + Failed to fetch permissions with error %1 + Échec de récupération de permissions avec l'erreur %1 + + + + Filename contains leading and trailing spaces. + Le nom de fichier contient des espaces de début et de fin. + + + + Filename contains leading spaces. + Le nom de fichier contient des espaces de début. + + + + Filename contains trailing spaces. + Le nom de fichier contient des espaces de fin. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Conflit de casse + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Le fichier n'a pas pu être synchronisé parce qu'il génère un conflit de casse avec un fichier existant dans ce système. + + + + Error + Erreur + + + + Existing file + Fichier existant + + + + file A + fichier A + + + + fileA + fichierA + + + + + today + aujourd'hui + + + + + 0 byte + 0 octets + + + + + Open existing file + Ouvrir un fichier existant + + + + Case clashing file + Fichier avec conflit de casse + + + + file B + fichier B + + + + fileB + fichierB + + + + + Open clashing file + Ouvrir le fichier conflictuel + + + + Please enter a new name for the clashing file: + Veuillez saisir un nouveau nom pour le fichier conflictuel : + + + + New filename + Nouveau nom de fichier + + + + Rename file + Renomer le fichier + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Le fichier "%1" n'a pas pu être synchronisé à cause d'un conflit de casse avec un fichier existant dans ce système. + + + + %1 does not support equal file names with only letter casing differences. + %1 ne supporte pas les noms de fichiers identiques avec seulement des différences de casse de caractère. + + + + Filename contains leading and trailing spaces. + Le nom de fichier contient des espaces de début et de fin. + + + + Filename contains leading spaces. + Le nom de fichier contient des espaces de début. + + + + Filename contains trailing spaces. + Le nom de fichier contient des espaces de fin. + + + + Use invalid name + Nom invalide + + + + Filename contains illegal characters: %1 + Le nom du fichier contient des caractères illégaux : %1 OCC::CleanupPollsJob - + Error writing metadata to the database Erreur à l'écriture des métadonnées dans la base de données @@ -1016,12 +1250,12 @@ Vous prenez vos propres risques. Merci de saisir votre phrase secrète E2E : <br><br>Utilisateur : %2<br>Compte : %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Veuillez entrer votre phrase de passe de chiffrement de bout en bout :<br><br>Nom d'utilisateur : %2<br>Compte : %3<br> - + Enter E2E passphrase Entrez la phrase secrète E2E @@ -1197,8 +1431,8 @@ Vous prenez vos propres risques. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Erreur du serveur : La réponse PROPFIND n'est pas au format XML ! @@ -1206,27 +1440,27 @@ Vous prenez vos propres risques. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Erreur à l’ouverture du dossier %1 - + Directory not accessible on client, permission denied Dossier non accessible au client, permission refusée - + Directory not found: %1 Dossier non trouvé : %1 - + Filename encoding is not valid L’encodage du nom de fichier n’est pas valide - + Error while reading directory %1 Erreur de lecture du dossier %1 @@ -1234,91 +1468,91 @@ Vous prenez vos propres risques. OCC::EditLocallyJob - + Invalid token received. Jeton invalide reçu. - - - - - - + + + + + + Please try again. Merci de réessayer. - + Invalid file path was provided. Un chemin d'accès au fichier invalide a été fourni. - + Could not find an account for local editing. Impossible de trouver un compte pour l'édition locale. - - + + Could not validate the request to open a file from server. Impossible de valider la requête pour ouvrir un fichier du serveur. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Impossible de trouver le fichier pour l'édition locale. Assurez-vous que le chemin est valide et qu'il est synchronisé localement. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Impossible de trouver le fichier pour l'édition locale. Assurez-vous qu'il n'est pas exclus par un filtre de synchronisation. - + Server error: PROPFIND reply is not XML formatted! Erreur de serveur : La réponse de PROPFIND n'est pas formatée en XML ! - + Could not find a remote file info for local editing. Make sure its path is valid. Impossible de trouver une info fichier distante pour l'édition locale. Assurez-vous que son chemin est valide. - + Could not open %1 - + Impossible d'ouvrir %1 - + File %1 already locked. - + Fichier %1 déjà verrouillé. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Le verrouillage durera %1 minutes. Vous pouvez également déverrouiller ce fichier manuellement une fois que vous avez terminé l'édition. - + File %1 now locked. - + Fichier %1 désormais verrouillé. - + File %1 could not be locked. - + Impossible de verrouiller le fichier %1. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Impossible de générer les métadonnées pour le chiffrement, déverrouillage du dossier. @@ -1448,123 +1682,123 @@ Cela peut être un problème avec vos bibliothèques OpenSSL. OCC::Folder - + Local folder %1 does not exist. Le dossier local %1 n'existe pas. - + %1 should be a folder but is not. %1 devrait être un dossier mais ne l'est pas. - + %1 is not readable. %1 ne peut pas être lu. - + %1 and %n other file(s) have been removed. %1 a été supprimé.%1 et %n autres fichiers ont été supprimés.%1 et %n autres fichiers ont été supprimés. - + %1 has been removed. %1 names a file. %1 a été supprimé. - + %1 and %n other file(s) have been added. %1 et %n autre fichier ont été ajoutés.%1 et %n autres fichiers ont été ajoutés.%1 et %n autres fichiers ont été ajoutés. - + %1 has been added. %1 names a file. %1 a été ajouté. - + %1 and %n other file(s) have been updated. %1 a été mis à jour.%1 et %n autres fichiers ont été mis à jour.%1 et %n autres fichiers ont été mis à jour. - + %1 has been updated. %1 names a file. %1 a été mis à jour. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 a été renommé en %2.%1 a été renommé en %2 et %n autres fichiers ont été renommés.%1 a été renommé en %2 et %n autres fichiers ont été renommés. - + %1 has been renamed to %2. %1 and %2 name files. %1 a été renommé en %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 a été déplacé vers %2.%1 a été déplacé vers %2 et %n autres fichiers ont été déplacés.%1 a été déplacé vers %2 et %n autres fichiers ont été déplacés. - + %1 has been moved to %2. %1 a été déplacé vers %2. - + %1 has and %n other file(s) have sync conflicts. %1 a un conflit de synchronisation.%1 et %n autres fichiers ont des problèmes de synchronisation.%1 et %n autres fichiers ont des problèmes de synchronisation. - + %1 has a sync conflict. Please check the conflict file! %1 a un problème de synchronisation. Merci de vérifier le fichier conflit ! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 ne peut pas être synchronisé en raison d'erreurs. Consultez les logs pour les détails.%1 et %n autres fichiers n'ont pas pu être synchronisés en raison d'erreurs. Consultez les logs pour les détails.%1 et %n autres fichiers n'ont pas pu être synchronisés en raison d'erreurs. Consultez les logs pour les détails. - + %1 could not be synced due to an error. See the log for details. %1 n'a pu être synchronisé pour cause d'erreur. Consultez les logs pour les détails. - + %1 and %n other file(s) are currently locked. %1 et %n autre fichier sont verrouillés.%1 et %n autres fichiers sont verrouillés.%1 et %n autres fichiers sont verrouillés. - + %1 is currently locked. %1 est actuellement verrouillé. - + Sync Activity Activité de synchronisation - + Could not read system exclude file Impossible de lire le fichier d'exclusion du système - + A new folder larger than %1 MB has been added: %2. Un nouveau dossier de taille supérieure à %1 Mo a été ajouté : %2. - + A folder from an external storage has been added. Un nouveau dossier localisé sur un stockage externe a été ajouté. @@ -1572,22 +1806,22 @@ Cela peut être un problème avec vos bibliothèques OpenSSL. - + Please go in the settings to select it if you wish to download it. Merci d'aller dans les Paramètres pour indiquer si vous souhaitez le télécharger. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Le dossier %1 a été créé mais il était exclu de la synchronisation auparavant. Les données qu'il contient ne seront pas synchronisées. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Le fichier %1 a été créé mais il était exclu de la synchronisation auparavant. Il ne sera pas synchronisé. - + 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). @@ -1600,7 +1834,7 @@ Cela signifie que le client de synchronisation ne va pas téléverser immédiate %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ Si vous décidez de garder ces fichiers, ils seront resynchronisés avec le serv Si vous décidez de supprimer ces fichiers, ils ne vous seront plus accessibles à moins que vous en soyez le propriétaire. - + 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. @@ -1620,17 +1854,17 @@ If this was an accident and you decide to keep your files, they will be re-synce S'il s'agissait d'un accident et que vous choisissiez de conserver vos fichiers, ils seront synchronisés à nouveau depuis le serveur. - + Remove All Files? Supprimer tous les fichiers ? - + Remove all files Supprimer tous les fichiers - + Keep files Conserver les fichiers @@ -1666,22 +1900,22 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve OCC::FolderMan - + Could not reset folder state Impossible de réinitialiser l'état du dossier - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Un ancien fichier journal "%1" a été trouvé, mais ne peut être supprimé. Veuillez vous assurer qu’aucune application ne l'utilise en ce moment. - + (backup) (sauvegarde) - + (backup %1) (sauvegarde %1) @@ -1691,27 +1925,27 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve Statut indéfini. - + Undefined state. Statut indéfini. - + Waiting to start syncing. En attente de synchronisation. - + Preparing for sync. Préparation de la synchronisation. - + Sync is running. Synchronisation en cours - + Sync finished with unresolved conflicts. Synchronisation terminée avec des conflits non résolus. @@ -1731,62 +1965,62 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve Abandon par l'utilisateur. - + Last sync was successful. Synchronisation terminée avec succès - + Setup error. Erreur de paramétrage. - + Sync request was cancelled. La requête de synchronisation a été annulée. - + Sync is paused. La synchronisation est en pause. - + %1 (Sync is paused) %1 (Synchronisation en pause) - + No valid folder selected! Aucun dossier valable sélectionné ! - + The selected path does not exist! Le chemin sélectionné n'existe pas ! - + The selected path is not a folder! Le chemin sélectionné n'est pas un dossier ! - + You have no permission to write to the selected folder! Vous n'avez pas la permission d'écrire dans le dossier sélectionné ! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Le dossier local %1 contient un dossier déjà utilisé pour une synchronisation de dossiers. Veuillez en choisir un autre ! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Le dossier local %1 se trouve dans un dossier déjà configuré pour une synchronisation de dossier. Veuillez en choisir un autre ! - + There is already a sync from the server to this local folder. Please pick another local folder! Il y a déjà une synchronisation depuis le serveur vers ce dossier local. Merci de choisir un autre dossier local ! @@ -1799,7 +2033,7 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve Ajouter une synchronisation de dossier - + File Fichier @@ -1807,152 +2041,156 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve OCC::FolderStatusModel - + You need to be connected to add a folder Vous devez être connecté pour ajouter un dossier - + Click this button to add a folder to synchronize. Cliquez ce bouton pour ajouter un dossier à synchroniser. - - + + Could not decrypt! + Déchiffrage impossible ! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Une erreur est survenue lors du chargement de la liste des dossiers depuis le serveur. - + Fetching folder list from server … Récupération de la liste des dossiers depuis le serveur ... - + There are unresolved conflicts. Click for details. Il y a des conflits non résolus. Cliquez pour plus de détails. - + Virtual file support is enabled. Support des fichiers virtuels activé. - + Signed out Session fermée - + Synchronizing VirtualFiles with local folder Synchronisation des fichiers virtuels avec le dossier local - + Synchronizing with local folder Synchronisation avec le dossier local - + Checking for changes in remote "%1" Vérification des modifications dans "%1" distant - + Checking for changes in local "%1" Vérification des modifications dans "%1" local - + Reconciling changes Rapprochement des modifications - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synchronisation de %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) réception %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) Envoi %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 sur %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Quelques secondes restantes, %1 de %2, fichier %3 parmi %4 - + %5 left, %1 of %2, file %3 of %4 %5 restants, %1 sur %2, fichier %3 sur %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 sur %2, fichier %3 sur %4 - + file %1 of %2 fichier %1 sur %2 - + Waiting … En attente ... - + Waiting for %n other folder(s) … En attente de %n autre dossier ...En attente de %n autres dossiers ...En attente de %n autres dossiers ... - + Preparing to sync … Préparation de la synchronisation ... @@ -2183,13 +2421,13 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve - + stable stable - + beta bêta @@ -2241,32 +2479,32 @@ S'il s'agissait d'un accident et que vous choisissiez de conserve - + Create Debug Archive Création de l'archive de déboggage - + Server notifications that require attention. Les notifications du serveur requérant votre attention. - + Show call notification dialogs. Montre les fenêtres de notification d'appel. - + You cannot disable autostart because system-wide autostart is enabled. Vous ne pouvez pas désactiver le démarrage automatique parce que le démarrage automatique à l'échelle du système est activé. - + Change update channel? Changer de canal de mise à jour ? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Notez que cela ne permet seulement de sélectionner où sont récupérées les mises à jour et qu'il n'y a pas de possibilité de rétrograder : Ainsi, le retour du canal "bêta" au canal "stable" ne peut généralement pas être fait immédiatement et implique d'attendre une version stable plus récente que la version bêta actuellement installée. - + Change update channel Changer de canal de mise à jour - + Cancel Annuler - + Zip Archives Archives Zip - + Debug Archive Created Archive de déboggage créée - + Debug archive is created at %1 Archive de déboggage créée à %1 @@ -2303,22 +2541,22 @@ Notez que cela ne permet seulement de sélectionner où sont récupérées les m OCC::GetOrCreatePublicLinkShare - + Password for share required Mot de passe requis - + Please enter a password for your link share: Veuillez saisir un mot de passe pour votre lien partagé : - + Sharing error Erreur de partage - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Les éléments ayant l'option "Autoriser la suppression" pourront Close Fermer + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Notez que l'utilisation de toute option de ligne de commande de journalisat - + Use &virtual files instead of downloading content immediately %1 Utiliser les fichiers virtuels plutôt que de télécharger le contenu immédiatement %1 - + (experimental) (expérimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Les fichiers virtuels ne sont pas pris en charge pour les racines de partition Windows en tant que dossier local. Veuillez choisir un sous-dossier valide sous la lettre du lecteur. - + %1 folder "%2" is synced to local folder "%3" Le dossier %1 "%2" est synchronisé avec le dossier local "%3". - + Sync the folder "%1" Synchroniser le dossier "%1" - + Warning: The local folder is not empty. Pick a resolution! Avertissement : le dossier local n'est pas vide. Sélectionnez une résolution. - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB espace libre %1 - + Virtual files are not available for the selected folder Les fichiers virtuels ne sont pas disponibles pour le dossier sélectionné - + Local Sync Folder Dossier de synchronisation local - - + + (%1) (%1) - + There isn't enough free space in the local folder! L'espace libre dans le dossier local est insuffisant ! @@ -3016,7 +3259,8 @@ Notez que l'utilisation de toute option de ligne de commande de journalisat OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Impossible de récupérer la date de modification du fichier en conflit %1 @@ -3048,144 +3292,144 @@ Notez que l'utilisation de toute option de ligne de commande de journalisat OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Connecté avec succès à %1 : %2 version %3 (%4)</font><br/><br/> - + Invalid URL URL invalide - + Failed to connect to %1 at %2:<br/>%3 Échec de la connexion à %1 sur %2 :<br/>%3 - + Timeout while trying to connect to %1 at %2. Délai d'attente dépassé lors de la connexion à %1 sur %2. - + Trying to connect to %1 at %2 … Tentative de connexion à %1 sur %2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. La demande authentifiée au serveur a été redirigée vers "%1". L'URL est mauvaise, le serveur est mal configuré. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - Accès impossibe. Afin de vérifier l'accès au serveur, <a href="%1">cliquez ici</a> et connectez-vous au service avec votre navigateur web. + Accès impossible. Afin de vérifier l'accès au serveur, <a href="%1">cliquez ici</a> et connectez-vous au service avec votre navigateur web. - + There was an invalid response to an authenticated WebDAV request Il y a eu une réponse invalide à une demande WebDAV authentifiée - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Le dossier de synchronisation local %1 existe déjà, configuration de la synchronisation.<br/><br/> - + Creating local sync folder %1 … Création du dossier local de synchronisation %1 ... - + OK OK - + failed. échoué. - + Could not create local folder %1 Impossible de créer le dossier local %1 - + No remote folder specified! Aucun dossier distant spécifié ! - + Error: %1 Erreur : %1 - + creating folder on Nextcloud: %1 Création du dossier sur Nextcloud : %1 - + Remote folder %1 created successfully. Le dossier distant %1 a été créé avec succès. - + The remote folder %1 already exists. Connecting it for syncing. Le dossier distant %1 existe déjà. Connexion. - - + + The folder creation resulted in HTTP error code %1 La création du dossier a généré le code d'erreur HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> La création du dossier distant a échoué car les identifiants de connexion sont erronés !<br/>Veuillez revenir en arrière et vérifier ces derniers.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La création du dossier distant a échoué, probablement parce que les informations d'identification fournies sont fausses.</font><br/>Veuillez revenir en arrière et les vérifier.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. La création du dossier distant "%1" a échouée avec l'erreur <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Une synchronisation entre le dossier local %1 et le dossier distant %2 a été configurée. - + Successfully connected to %1! Connecté avec succès à %1 ! - + Connection to %1 could not be established. Please check again. La connexion à %1 n'a pu être établie. Veuillez réessayer. - + Folder rename failed Echec du renommage du dossier - + Cannot 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. Impossible de supprimer et sauvegarder le dossier parce que le dossier ou un fichier qu'il contient est ouvert dans un autre programme. Merci de fermer le dossier ou le fichier et recommencer ou annuler la configuration. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Dossier de synchronisation local %1 créé avec succès !</b></font> @@ -3208,12 +3452,12 @@ Notez que l'utilisation de toute option de ligne de commande de journalisat Annuler - + Enable experimental feature? Activer la fonction expérimentale ? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Le passage à ce mode annulera toute synchronisation en cours. Il s'agit d'un nouveau mode expérimental. Si vous décidez de l'utiliser, veuillez signaler tout problème qui surviendrait. - + Enable experimental placeholder mode Activer la fonction expérimentale de fichiers virtuels ? - + Stay safe Restez en sécurité @@ -3264,162 +3508,167 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Les liens symboliques ne sont pas pris en charge par la synchronisation. - + File is listed on the ignore list. Le fichier est présent dans la liste des fichiers ignorés. - + File names ending with a period are not supported on this file system. Les noms de fichier se terminant par un point ne sont pas pris en charge sur votre système. - + File names containing the character "%1" are not supported on this file system. Les noms de fichiers contenant le caractère "%1" ne sont pas pris en charge par ce système de fichiers. - + File name contains at least one invalid character Le nom du fichier contient au moins un caractère interdit - + The file name is a reserved name on this file system. Le nom du fichier est un nom réservé dans le système de fichier - + Filename contains trailing spaces. Le nom du fichier finit par des espaces. - + Filename contains leading spaces. Nom de fichier contenant des espaces au début. - + Filename contains leading and trailing spaces. Nom de fichier contenant des espaces au début et à la fin. - + Filename is too long. Le nom du fichier est trop long. - + File/Folder is ignored because it's hidden. Le fichier ou dossier a été ignoré car il est masqué. - + Stat failed. Stat échoué. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflit : La version du serveur a été téléchargée, la version locale renommée et non téléversée. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Conflit de casse : fichier serveur téléchargé et renommé pour éviter le conflit. + + + The filename cannot be encoded on your file system. Le nom de fichier ne peut pas être encodé sur votre système de fichiers. - + The filename is blacklisted on the server. Le nom du fichier est sur la liste noire du serveur. - + File has extension reserved for virtual files. Le fichier a une extension réservée pour les fichiers virtuels. - + size taille - + permission permission - + file id ID du fichier - + Server reported no %1 Le serveur n'a signalé aucun %1 - + Cannot sync due to invalid modification time Impossible de synchroniser à cause d'une date de modification invalide - + Error while deleting file record %1 from the database Erreur à la suppression de l'enregistrement du fichier %1 de la base de données - + Conflict when uploading a folder. It's going to get cleared! Conflit lors de l'envoi d'un dossier. Il va être supprimé ! - + Conflict when uploading a file. It's going to get removed! Conflit lors de l'envoi d'un fichier. Il va être supprimé ! - + Ignored because of the "choose what to sync" blacklist Ignoré en raison de la liste noire "Sélectionner le contenu à synchroniser". - + Not allowed because you don't have permission to add subfolders to that folder Non autorisé car vous n'avez pas la permission d'ajouter des sous-dossiers dans ce dossier - + Not allowed because you don't have permission to add files in that folder Non autorisé car vous n'avez pas la permission d'ajouter des fichiers dans ce dossier - + Not allowed to upload this file because it is read-only on the server, restoring - Non autorisé à envoyer ce fichier car il est en lecture seule sur le serveur. Restauration + Non autorisé à téléverser ce fichier, car il est en lecture seule sur le serveur. Restauration - + Moved to invalid target, restoring Déplacé vers une cible invalide, restauration - + Not allowed to remove, restoring Non autorisé à supprimer. Restauration - + Error while reading the database Erreur de lecture de la base de données - + Server replied with an error while reading directory "%1" : %2 Le serveur a répondu avec une erreur lors de la lecture du dossier "%1" : %2 @@ -3427,22 +3676,22 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::PropagateDirectory - + could not delete file %1 from local DB Impossible de supprimer le fichier %1 de la base de données locale - + Error updating metadata due to invalid modification time Erreur de mise à jour des métadonnées à cause d'une date de modification invalide - + Error updating metadata: %1 Erreur lors de la mise à jour des métadonnées : %1 - + File is currently in use Le fichier est actuellement en cours d'utilisation @@ -3455,19 +3704,19 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Impossible de récupérer le fichier %1 depuis la base de données locale - + File %1 cannot be downloaded because encryption information is missing. Le fichier %1 ne peut pas être téléchargé car les informations de chiffrement sont manquantes. - - + + File has changed since discovery Le fichier a changé depuis sa découverte - + Could not delete file record %1 from local DB Impossible de supprimer l'enregistrement du fichier %1 depuis la base de données locale @@ -3478,32 +3727,32 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Le fichier %1 ne peut pas être téléchargé en raison d'un conflit sur le nom de fichier local ! - + File %1 can not be downloaded because of a local file name clash! Le fichier %1 ne peut pas être téléchargé en raison d'un conflit sur le nom de fichier local. - + The download would reduce free local disk space below the limit Le téléchargement réduira l'espace disque libre en dessous de la limite - + Free space on disk is less than %1 Il y a moins de %1 d'espace libre sur le disque - + File was deleted from server Le fichier a été supprimé du serveur - + The file could not be downloaded completely. Le fichier n'a pas pu être téléchargé intégralement. - + The downloaded file is empty, but the server said it should have been %1. Le fichier téléchargé est vide bien que le serveur indique que sa taille devrait être de %1. @@ -3513,18 +3762,23 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Le fichier %1 n'a pas pu être sauvegardé en raison d'un conflit sur le nom du fichier local ! - - + + File %1 has invalid modified time reported by server. Do not save it. Le fichier %1 présente une date de modification invalide sur le serveur. Enregistrement impossible. - + + File %1 downloaded but it resulted in a local file name clash! + Fichier %1 téléchargé, mais a abouti à un conflit de casse du nom de fichier local ! + + + Error updating metadata: %1 Erreur lors de la mise à jour des métadonnées : %1 - + The file %1 is currently in use Le fichier %1 est en cours d'utilisation @@ -3545,7 +3799,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 impossible de supprimer le fichier %1. Erreur : %2 @@ -3556,16 +3810,21 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' + Folder %1 cannot be created because of a local file or folder name clash! + Le dossier %1 n'a pu être créé à cause d'un conflit local de nom de fichier ou de dossier ! + + + Could not create folder %1 Impossible de créer le dossier %1 - + Error updating metadata: %1 Erreur lors de la mise à jour des métadonnées : %1 - + The file %1 is currently in use Le fichier %1 est en cours d'utilisation @@ -3573,7 +3832,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Impossible de supprimer %1 à cause d'un conflit local de nom de fichier @@ -3586,46 +3845,51 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Le fichier %1 ne peut pas être renommé en %2 à cause d'un conflit local de nom de fichier - - - + + File %1 downloaded but it resulted in a local file name clash! + Fichier %1 téléchargé, mais a abouti à un conflit de casse du nom de fichier local ! + + + + + could not get file %1 from local DB Impossible de récupérer le fichier %1 depuis la base de données locale - + Error setting pin state Erreur lors de la modification de l'état du fichier - - + + Error updating metadata: %1 Erreur lors de la mise à jour des métadonnées : %1 - + The file %1 is currently in use Le fichier %1 est en cours d'utilisation - - + + Could not delete file record %1 from local DB Impossible de récupérer le fichier %1 depuis la base de données locale - + Failed to propagate directory rename in hierarchy Impossible de propager le renommage du dossier dans la hiérarchie - + Failed to rename file Échec lors du changement de nom du fichier @@ -3646,7 +3910,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Le code HTTP retourné par le serveur n'est pas valide. La valeur attendue est 204 mais la valeur retournée est "%1 %2". @@ -3659,12 +3923,12 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Le code HTTP retourné par le serveur n'est pas valide. La valeur attendue est 201 mais la valeur reçue est "%1 %2". - + Error writing metadata to the database: %1 Erreur d'écriture des métadonnées dans la base de données : %1 - + The file %1 is currently in use Le fichier %1 est en cours d'utilisation @@ -3672,42 +3936,42 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Impossible de renommer %1 en %2, erreur: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Le code HTTP retourné par le serveur n'est pas valide. La valeur attendue est 201 mais la valeur reçue est "%1 %2". - + could not get file %1 from local DB Impossible de récupérer le fichier %1 depuis la base de données locale - + Could not delete file record %1 from local DB Impossible de récupérer le fichier %1 depuis la base de données locale - + Error updating metadata: %1 Erreur lors de la mise à jour des métadonnées : %1 - + The file %1 is currently in use Le fichier %1 est en cours d'utilisation - + Error setting pin state Erreur lors de la modification de l'état du fichier - + Error writing metadata to the database Erreur à l'écriture des métadonnées dans la base de données @@ -3897,7 +4161,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::ServerNotificationHandler - + Reply Répondre @@ -3915,23 +4179,23 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Paramètres - + %1 Settings This name refers to the application name e.g Nextcloud %1 Paramètres - + General Paramètres - + Network Réseau - + Account Compte @@ -3939,17 +4203,22 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::ShareModel - + Share link Partager un lien - + Link share Lien de partage - + + Internal link + Lien interne + + + Enter a note for the recipient Saisissez un commentaire pour le destinataire @@ -4025,7 +4294,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,171 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::SocketApi - + + Failed to encrypt folder at "%1" + Échec du chiffrement du dossier à "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + Le compte %1 n'a pas de chiffrement de bout en bout configuré. Veuillez le configurer dans les paramètres de votre compte pour activer le chiffrement des dossiers. + + + + Failed to encrypt folder + Échec du chiffrement du dossier + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Impossible de chiffrer le dossier suivant : "%1". + +Le serveur a répondu avec l'erreur : %2 + + + + Folder encrypted successfully + Dossier chiffré avec succès + + + + The following folder was encrypted successfully: "%1" + Le dossier suivant a été chiffré avec succès : "%1" + + + Context menu share Partage du menu contextuel - + Select new location … Sélectionnez le nouvel emplacement ... - + I shared something with you J'ai partagé quelque chose avec vous - - + + Share options Options de partage - - + + Activity Activité - + Copy private link to clipboard Copier le lien privé dans le presse-papier - + Send private link by email … Envoyer le lien privé par e-mail ... + + + Expire in %1 minutes + remaining time before lock expire + Expire dans %1 minuteExpire dans %1 minutesExpire dans %1 minutes + - + Leave this share Quitter ce partage - + Resharing this file is not allowed Repartager ce fichier est interdit - + Resharing this folder is not allowed Repartager ce dossier est interdit - - + + Copy public link Copier le lien public - + Copy internal link Copier le lien interne - + + Encrypt + Chiffrer + + + Lock file Verrouiller le fichier - + Unlock file Déverrouiller le fichier - + Locked by %1 Verrouillé par %1 - - Expire in %1 minutes - remaining time before lock expire - Expire dans %1 minuteExpire dans %1 minutesExpire dans %1 minutes - - - + Expires in %1 minutes remaining time before lock expires Expire dans %1 minuteExpire dans %1 minutesExpire dans %1 minutes - + Edit Modifier - + Open in browser Ouvrir dans le navigateur - + Resolve conflict … Résoudre le conflit ... - + Move and rename … Déplacer et renommer... - + Move, rename and upload … - Déplacer, renommer et envoyer ... + Déplacer, renommer et téléverser… - + Delete local changes Supprimer les modifications locales - + Move and upload … - Déplacer et envoyer ... + Déplacer et téléverser… - + Delete Supprimer @@ -4377,63 +4685,63 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (ignoré à cause d'une précédente erreur, nouvel essai dans %2) - + Could not update file: %1 Impossible de mettre à jour le fichier : %1 - + Could not update virtual file metadata: %1 Impossible de mettre à jour les métadonnées du fichier virutel : %1 - + Could not update file metadata: %1 Impossible de mettre à jour les métadonnées du fichier : %1 - + Could not set file record to local DB: %1 Impossible de définir l'enregistrement du fichier dans la base de données locale : %1 - + Unresolved conflict. conflit non résolu. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Seulement %1 disponibles, il faut au moins %2 pour démarrer - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Impossible d'accéder ou de créer une base de données locale de synchronisation. Assurez vous de disposer des droits d'écriture dans le dossier de synchronisation. - + Using virtual files with suffix, but suffix is not set Utilisation de fichiers virtuels avec suffixe, mais le suffixe n'est pas défini - + Unable to read the blacklist from the local database Impossible de lire la liste noire de la base de données locale - + Unable to read from the sync journal. Impossible de lire le journal de synchronisation. - + Cannot open the sync journal Impossible d'ouvrir le journal de synchronisation @@ -4443,12 +4751,12 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' La synchronisation reprendra sous peu. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. L'espace disque est faible : les téléchargements qui amèneraient à réduire l'espace libre en dessous de %1 ont été ignorés. - + There is insufficient space available on the server for some uploads. Il n'y a pas suffisamment d’espace disponible sur le serveur pour certains envois. @@ -4517,59 +4825,59 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::Systray - + Download Télécharger - + Add account Ajouter un compte - + Open main dialog Ouvrir la fenêtre principale - - + + Pause sync Suspendre la synchro - - + + Resume sync Relancer la synchro - + Settings Paramètres - + Help Aide - + Exit %1 Quitter %1 - + Pause sync for all Suspendre toutes les synchros - + Resume sync for all Relancer toutes les synchros - + %1: %2 %1 : %2 @@ -4577,24 +4885,24 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Client de bureau %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Version %1. Pour plus d’informations, veuillez cliquer <a href='%2'>ici</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Utilise l'extension de fichiers virtuels : %1</small></p> - + <p>This release was supplied by %1</p> Cette version est fournie par %1. @@ -4602,22 +4910,22 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Échec de la récupération des fournisseurs. - + Failed to fetch search providers for '%1'. Error: %2 Échec de la récupération des fournisseurs de recherche pour '%1'. Erreur : %2 - + Search has failed for '%2'. La recherche de '%2' a échoué. - + Search has failed for '%1'. Error: %2 La recherche de '%1' a échoué. Erreur: %2 @@ -4625,30 +4933,36 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::User - + Retry all uploads Relancer tous les envois + + + + Resolve conflict + Conflit résolu + OCC::UserModel - + Confirm Account Removal Confirmer la suppression du compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Êtes-vous certain de vouloir retirer la connexion au compte <i>%1</i> ?</p><p><b>Note :</b> cette opération <b>ne supprimera aucun de vos fichiers</b> et ne supprimera pas non plus votre compte du serveur.</p> - + Remove connection Supprimer la connexion - + Cancel Annuler @@ -4786,8 +5100,8 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Erreur de mise à jour des métadonnées à cause d'une date de modification invalide @@ -4795,8 +5109,8 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Erreur de mise à jour des métadonnées à cause d'une date de modification invalide @@ -4894,123 +5208,123 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' OCC::ownCloudGui - + Unsupported Server Version Version du Serveur non prise en charge - + 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. Le serveur sur le compte %1 fonctionne avec une version non-supportée %2. Utiliser ce client avec des versions non-supportées du serveur n'est pas testé et est potentiellement dangereux. Procédez à vos risques et périls. - + Disconnected Déconnecté - + Disconnected from some accounts Déconnecté de certains comptes - + Disconnected from %1 Déconnecté de %1 - + Disconnected from accounts: Déconnecté des comptes : - + Account %1: %2 Compte %1 : %2 - + Please sign in Veuillez vous connecter - + Signed out Session fermée - + Account synchronization is disabled La synchronisation est en pause - - + + Synchronization is paused La synchronisation est en pause - + Folder %1: %2 Dossier %1 : %2 - + Unresolved conflicts Conflits non résolus - + Up to date À jour - + Error during synchronization Erreur durant la synchronisation - + There are no sync folders configured. Aucun dossier à synchroniser n'est configuré - + No sync folders configured Aucun dossier de synchronisation configuré - + Checking for changes in remote "%1" Vérification des modifications dans "%1" distant - + Checking for changes in local "%1" Vérification des modifications dans "%1" local - + Syncing %1 of %2 (%3 left) Synchronisation de %1 sur %2 (%3 restants) - + Syncing %1 of %2 Synchronisation %1 sur %2 - + Syncing %1 (%2 left) Synchronisation de %1 (%2 restants) - + Syncing %1 Synchronisation de %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5476,27 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Nouveau dossier - + You renamed %1 Vous avez renommé %1 - + You deleted %1 Vous avez supprimé %1 - + You created %1 Vous avez créé %1 - + You changed %1 Vous avez modifié %1 - + Synced %1 %1 a été synchronisé @@ -5248,30 +5562,106 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Marquer comme lu + + ShareDelegate + + + Create a new share link + Créer un nouveau lien de partage + + + + Copy share link location + Copier le lien de partage + + + + Share options + Options de partage + + + + ShareDetailsPage + + + An error occurred setting the share password. + Une erreur est survenue lors de la configuration du mot de passe de partage. + + + + Edit share + Modifier le partage + + + + Dismiss + Révoquer + + + + Share label + Libellé du partage + + + + Allow editing + Autoriser la modification + + + + Password protect + Protéger par mot de passe + + + + Set expiration date + Définir une date d'expiration + + + + Note to recipient + Note au destinataire + + + + Unshare + Cesser le partage + + + + Add another link + Ajouter un autre lien + + + + Copy share link + Copier le lien de partage + + ShareView - + Password required for new share Mot de passe requis pour le nouveau partage - + Share password Mot de passe du partage - + Sharing is disabled Le partage est désactivté - + This item cannot be shared. L'élément ne peut pas être partagé. - + Sharing is disabled. Le partage est désactivé. @@ -5287,7 +5677,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' SyncJournalDb - + Failed to connect database. Impossible de connecter la base de données. @@ -5345,6 +5735,22 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Charger plus de résultats + + UnifiedSearchResultNothingFound + + + No results for + Aucun résultat pour + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Section de résultats de recherche %1 + + UserLine @@ -5408,67 +5814,67 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' UserStatusSelector - + Online status Statut en ligne - + Online En ligne - + Away Absent(e) - + Do not disturb Ne pas déranger - + Mute all notifications Désactiver toutes les notifications - + Invisible Invisible - + Appear offline Apparaitre hors-ligne - + Status message Message de statut - + What is your status? Quel est votre statut ? - + Clear status message after Effacer le message de statut après - + Cancel Annuler - + Clear status message Effacer le message de statut - + Set status message Définir le message de statut @@ -5552,24 +5958,24 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Window - + Nextcloud desktop main dialog Boîte de dialogue principale du bureau Nextcloud - + Current account Compte actuel - - + + Resume sync for all Relancer toutes les synchronisations - - + + Pause sync for all Suspendre toutes les synchronisations @@ -5579,22 +5985,22 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Définir le statut de l'utilisateur - + Add account Ajouter un compte - + Add new account Ajouter un nouveau compte - + Settings Paramètres - + Exit Quitter @@ -5603,11 +6009,6 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Current user avatar Avatar de l'utilisateur courant - - - Current account avatar - Avatar actuel du compte - Current user status is online @@ -5619,70 +6020,75 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' Le statut actuel de l'utilisateur est ne pas déranger - + + Current account avatar + Avatar actuel du compte + + + Current account status is online Le statut actuel du compte est "en ligne" - + Current account status is do not disturb Le statut actuel du compte est "ne pas déranger" - + + %1 - File activity + %1 - Activité de fichier + + + Account switcher and settings menu Sélecteur de compte et menu des paramètres - + Open local folder of current account Ouvrir le dossier local de l'utilisateur courant - + Connected Connecté - + Disconnected Déconnecté - + Open Nextcloud Talk in browser Ouvrez Nextcloud Talk dans le navigateur - + More apps Plus d'applications - + Open %1 in browser Ouvrir %1 dans le navigateur - + Unified search results list Liste de résultats de recherche unifiée - - - %1 - File activity - %1 - Activité de fichier - main.cpp - + System Tray not available Zone de notification non disponible - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 nécessite une barre d'état système fonctionnelle. Si vous utiliser XFCE, veuillez suivre <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">ces instructions</a>. Sinon, installez une application de la barre d'état système telle que "trayer" et réessayez. @@ -5690,7 +6096,7 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Généré à partir de la révision Git <a href="%1">%2</a> du %3, %4 en utilisant Qt %5, %6</small></p> @@ -5724,72 +6130,77 @@ Il s'agit d'un nouveau mode expérimental. Si vous décidez de l' + Server version downloaded, copied changed local file into case conflict conflict file + La version du serveur est téléchargée, les changements locaux ont été copiés dans un fichier de conflit de casse. + + + Deleted Supprimé - + Moved to %1 Déplacé vers %1 - + Ignored Ignoré - + Filesystem access error Erreur d'accès au système de fichiers - + Error Erreur - + Updated local metadata Métadonnées locales mises à jour - + Unknown Inconnu - + downloading téléchargement de - + uploading envoi - + deleting suppression - + moving déplacement - + ignoring Ignore - + error erreur - + updating local metadata Mise à jour des métadonnées locales diff --git a/translations/client_gl.ts b/translations/client_gl.ts index 3fe510892..59c44a9d6 100644 --- a/translations/client_gl.ts +++ b/translations/client_gl.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Abrir %1 localmente - + In %1 En %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostrar máis accións @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista de actividades @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Limpar o menú de mensaxes de estado @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Mover ao lixo non está dispoñíbel nesta plataforma - + Error removing "%1": %2 Produciuse un erro ao retirar «%1»: %2 - + Could not remove folder "%1" Non foi posíbel retirar o cartafol «%1» @@ -321,7 +331,7 @@ O servidor devolveu código HTTP incorrecto. Agardábase 204, mais recibiuse «%1 %2». - + "%1 Failed to unlock encrypted folder %2". «%1 Produciuse un fallo ao crear o cartafol %2». @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. O ficheiro %1 xa está bloqueado por %2 - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Non cifrar cartafol - + Do not encrypt folder - + Encrypt folder Cifrar cartafol - + No account configured. Non hai contas configuradas. - - Display mnemonic - Amosar o mnemónico + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Amosar o mnemónico @@ -445,18 +455,23 @@ Activar o cifrado - + + End-to-end encryption has been enabled for this account + + + + Warning Advertencia - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Non pode cifrar un cartafol con contido, retire os ficheiros. @@ -469,121 +484,121 @@ Agarde a nova sincronización e logo cífreo. - + Encryption failed Fallou o cifrado - + Could not encrypt folder because the folder does not exist anymore Non foi posíbel cifrar o cartafol porque o cartafol xa non existe - - + + Open folder Abrir o cartafol - + Encrypt Cifrar - - + + Edit Ignored Files Editar ficheiros ignorados - - + + Create new folder Crear un cartafol novo - - + + Availability Dispoñíbilidade - + Choose what to sync Escolla que sincronizar - + Force sync now Forzar a sincronización - + Restart sync Reiniciar a sincronización - + Resume sync Continuar coa sincronización - + Pause sync Por en pausa a sincronización - + Remove folder sync connection Retirar a conexión da sincronización do cartafol - + Disable virtual file support … Desactivar a compatibilidade con ficheiros virtuais… - + Enable virtual file support %1 … Activar a compatibilidade con ficheiros virtuais %1… - + (experimental) (experimental) - + Folder creation failed Non foi posíbel crear o cartafol - + <p>Could not create local folder <i>%1</i>.</p> <p>Non foi posíbel crear o cartafol local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar a retirada da conexión da sincronización do cartafol - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Confirma que quere deixar de sincronizar o cartafol <i>%1</i>?</p><p><b>Aviso:</b> Isto <b>non</b> eliminará ningún ficheiro.</p> - + Remove Folder Sync Connection Retirar a conexión da sincronización do cartafol - + Disable virtual file support? Quere desactivar a compatibilidade con ficheiros virtuais? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ A única vantaxe de desactivar a compatibilidade con ficheiros virtuais é que v Esta acción interromperá calquera sincronización que estea a executarse actualmente. - + Disable support Desactivar a compatibilidade @@ -606,144 +621,176 @@ Esta acción interromperá calquera sincronización que estea a executarse actua - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronización en proceso - + The syncing operation is running.<br/>Do you want to terminate it? Estase a realizar a sincronización.<br/>Quere interrompela e rematala? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 en uso. Algúns cartafoles, incluíndo os compartidos e os montados en rede, poderían ter diferentes límites. - + %1 of %2 in use %1 de %2 en uso - + Currently there is no storage usage information available. Actualmente non hai dispoñíbel ningunha información sobre o uso do almacenamento. - + %1 in use %1 en uso - + %1 as %2 %1 como %2 - + The server version %1 is unsupported! Proceed at your own risk. Este servidor da versión %1 non ten asistencia técnica! Proceda baixo a súa propia responsabilidade. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. O servidor %1 non está dispoñíbel temporalmente. - + Server %1 is currently in maintenance mode. O servidor %1 neste momento está en modo de mantemento. - + Signed out from %1. Desconectado de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obtendo autorización dende o navegador. <a href='%1'>Prema aquí</a> para volver abrir o navegador. - + Connecting to %1 … Conectando con %1… - + No connection to %1 at %2. Non hai conexión con %1 en %2. - + Server configuration error: %1 at %2. Produciuse un erro de configuración do servidor: %1 en %2. - + No %1 connection configured. Non se configurou a conexión %1. - + There are folders that were not synchronized because they are too big: Hai cartafoles que non se sincronizaron por ser demasiado grandes: - + There are folders that were not synchronized because they are external storages: Hai cartafoles que non se sincronizaron porque son almacenamentos externos: - + There are folders that were not synchronized because they are too big or external storages: Hai cartafoles que non se sincronizaron porque son demasiado grandes ou almacenamentos externos: - + Confirm Account Removal Confirme a retirada da conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Confirma que quere retirar a conexión a conta <i>%1</i>?</p><p><b>Aviso:</b> Isto <b>non</b> eliminará ningún ficheiro.</p> - + Remove connection Retirar conexión - - + This account supports end-to-end encryption Esta conta admite o cifrado de extremo a extremo - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Esta acción interromperá calquera sincronización que estea a executarse actua OCC::ActivityListModel - + For more activities please open the Activity app. Para máis actividades, abra a aplicación Actividade. @@ -808,12 +855,12 @@ Esta acción interromperá calquera sincronización que estea a executarse actua A obter actividades... - + Fetching activities … A obter actividades... - + Files from the ignore list as well as symbolic links are not synced. Non se sincronizaran os ficheiros da lista de ignorados e as ligazóns simbólicas. @@ -864,32 +911,59 @@ Esta acción interromperá calquera sincronización que estea a executarse actua OCC::Application - + Continuing will mean <b>deleting these settings</b>. Continuar suporá <b>eliminar estes axustes</b>. - + Continuing will mean <b>ignoring these settings</b>. Continuar suporá <b>ignorar estes axustes</b>. - + 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>. Algúns axustes foron configuradas nas versións máis recentes deste cliente e usan funcións que non están dispoñíbeis nesta versión. <br><br>%1<br><br> Fíxose unha copia de seguridade do ficheiro de configuración actual <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Saír - + Continue Continuar - + Error accessing the configuration file Produciuse un erro ao acceder ao ficheiro de configuración @@ -899,12 +973,12 @@ Esta acción interromperá calquera sincronización que estea a executarse actua Produciuse un erro ao acceder ao ficheiro de configuración en %1. Asegúrese de que o ficheiro é accesíbel para o seu usuario. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Produciuse un erro ao acceder ao ficheiro de configuración en %1. Comprobe que é posíbel acceder ao ficheiro coa súa conta do sistema. - + Quit %1 Saír de %1 @@ -950,56 +1024,216 @@ Esta acción interromperá calquera sincronización que estea a executarse actua O ficheiro %1 ten unha data de modificación incorrecta. Non o envíe ao servidor. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. O ficheiro %1 ten unha data de modificación incorrecta. Non o envíe ao servidor. - + Local file changed during syncing. It will be resumed. O ficheiro local cambiou durante a sincronización. Retómase. - - + + Local file changed during sync. O ficheiro local cambiou durante a sincronización. - + Network error: %1 Produciuse un erro na rede: %1 - + Error updating metadata: %1 Produciuse un erro ao actualizar os metadatos: %1 - + The file %1 is currently in use O ficheiro %1 está en uso neste momento - + The local file was removed during sync. O ficheiro local foi retirado durante a sincronización. - + Restoration failed: %1 Produciuse un fallo na restauración: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Produciuse un erro ao escribir os metadatos na base de datos @@ -1017,12 +1251,12 @@ Esta acción interromperá calquera sincronización que estea a executarse actua Introduza a súa frase de paso de cifrado de extremo a extremo: <br><br>Usuario: %2<br>Conta: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Introduza a súa frase de paso de cifrado de extremo a extremo: <br><br>Usuario: %2<br>Conta: %3<br> - + Enter E2E passphrase Introduza a frase de paso E2E @@ -1198,8 +1432,8 @@ Esta acción interromperá calquera sincronización que estea a executarse actua OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Erro do servidor: a resposta PROPFIND non está formatada en XML. @@ -1207,27 +1441,27 @@ Esta acción interromperá calquera sincronización que estea a executarse actua OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Produciuse un erro ao abrir o directorio %1 - + Directory not accessible on client, permission denied Directorio non accesíbel no cliente, permiso denegado - + Directory not found: %1 Non se atopou o directorio: %1 - + Filename encoding is not valid O nome de ficheiro codificado non é correcto - + Error while reading directory %1 Produciuse un erro ao ler o directorio %1 @@ -1235,83 +1469,83 @@ Esta acción interromperá calquera sincronización que estea a executarse actua OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Esta acción interromperá calquera sincronización que estea a executarse actua OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Non foi posíbel xerar os metadatos para o cifrado, Desbloqueando o cartafol. @@ -1449,145 +1683,145 @@ Isto pode ser un problema coas súas bibliotecas OpenSSL. OCC::Folder - + Local folder %1 does not exist. O cartafol local %1 non existe. - + %1 should be a folder but is not. %1 debería ser un cartafol, mais non o é. - + %1 is not readable. %1 non é lexíbel. - + %1 and %n other file(s) have been removed. %1 e outro ficheiro foi retirado.%1 e outros %n ficheiros foron retirados. - + %1 has been removed. %1 names a file. Retirouse %1. - + %1 and %n other file(s) have been added. %1 e outro ficheiro foi actualizado.%1 e outros %n ficheiros foron engadidos. - + %1 has been added. %1 names a file. Engadíuse %1. - + %1 and %n other file(s) have been updated. %1 e outro ficheiro foi actualizado.%1 e outros %n ficheiros foron actualizados. - + %1 has been updated. %1 names a file. Enviouse %1. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 foi renomeado a %2 e outro ficheiro tamén foi renomeado.%1 foi renomeado a %2 e outros %n ficheiros tamén foron renomeados. - + %1 has been renamed to %2. %1 and %2 name files. %1 foi renomeado a %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 foi movido a %2 e outro ficheiro tamén foi movido.%1 foi movido a %2 e outros %n ficheiros tamén foron movidos. - + %1 has been moved to %2. %1 foi movido a %2. - + %1 has and %n other file(s) have sync conflicts. %1 e outro ficheiro tiveron conflitos ao sincronizar.%1 e outros %n ficheiros tiveron conflitos ao sincronizar. - + %1 has a sync conflict. Please check the conflict file! Produciuse un conflito ao sincronizar %1. Comprobe o ficheiro! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. Non foi posíbel sincronizar %1 e outro ficheiro por mor de erros. Vexa os detalles no rexistro.Non foi posíbel sincronizar %1 e outros %n ficheiros por mor de erros. Vexa os detalles no rexistro. - + %1 could not be synced due to an error. See the log for details. Non foi posíbel sincronizar %1 por mor dun erro. Vexa os detalles no rexistro. - + %1 and %n other file(s) are currently locked. %1 e outro %n ficheiro está bloqueado actualmente.%1 e outros %n ficheiros están bloqueados actualmente. - + %1 is currently locked. %1 está bloqueado actualmente. - + Sync Activity Actividade de sincronización - + Could not read system exclude file Non foi posíbel ler o ficheiro de exclusión do sistema - + A new folder larger than %1 MB has been added: %2. Foi engadido un cartafol maior de %1 MB: %2. - + A folder from an external storage has been added. Foi engadido un cartafol de almacenamento externo. - + Please go in the settings to select it if you wish to download it. Vaia a axustes a seleccionalo se quere descargar isto. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Creouse o cartafol %1 mais foi excluído da sincronización con anterioridade. Os datos no seu interior non se sincronizarán. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Creouse o ficheiro %1 mais foi excluído da sincronización con anterioridade. Non se sincronizará. - + 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). @@ -1600,7 +1834,7 @@ Isto significa que o cliente de sincronización podería non enviar os cambios i %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1608,24 +1842,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Retirar todos os ficheiros? - + Remove all files Retirar todos os ficheiros - + Keep files Conservar os ficheiros @@ -1661,22 +1895,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Non foi posíbel restabelecer o estado do cartafol - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (copia de seguridade) - + (backup %1) (copia de seguridade %1) @@ -1686,27 +1920,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado sen definir. - + Undefined state. Estado sen definir. - + Waiting to start syncing. Agardando para iniciar a sincronización. - + Preparing for sync. Preparando para sincronizar. - + Sync is running. Estase sincronizando. - + Sync finished with unresolved conflicts. A sincronización rematou con conflitos sen resolver. @@ -1726,62 +1960,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Interrompido polo usuario. - + Last sync was successful. A última sincronización fíxose correctamente. - + Setup error. Produciuse un erro de configuración. - + Sync request was cancelled. Cancelouse a solicitude de sincronización. - + Sync is paused. Sincronización en pausa. - + %1 (Sync is paused) %1 (sincronización en pausa) - + No valid folder selected! Non seleccionou ningún cartafol correcto! - + The selected path does not exist! A ruta seleccionada non éexiste! - + The selected path is not a folder! A ruta seleccionada non é un cartafol! - + You have no permission to write to the selected folder! Vostede non ten permiso para escribir neste cartafol! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! O cartafol local %1 xa contén un cartafol usado nunha conexión de sincronización de cartafoles. Escolla outro! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! O cartafol local %1 está dentro dun cartafol usado nunha conexión de sincronización de cartafoles. Escolla outro! - + There is already a sync from the server to this local folder. Please pick another local folder! Xa existe unha tarefa de sincronización entre o servidor e este cartafol. Escolla outro cartafol local! @@ -1794,7 +2028,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Engadir a conexión da sincronización do cartafol - + File Ficheiro @@ -1802,152 +2036,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Ten que estar conectado para engadir un cartafol - + Click this button to add a folder to synchronize. Prema nesta botón para engadir un cartafol para sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Produciuse un erro ao cargar a lista de cartafoles dende o servidor. - + Fetching folder list from server … Obtendo a lista de cartafoles do servidor... - + There are unresolved conflicts. Click for details. Hai conflitos sen resolver. Prema para obter máis detalles. - + Virtual file support is enabled. Está activada a compatibilidade con ficheiros virtuais. - + Signed out Desconectado - + Synchronizing VirtualFiles with local folder Sincronizando os ficheiros virtuais co cartafol local - + Synchronizing with local folder Sincronizando co cartafol local - + Checking for changes in remote "%1" Comprobando os cambios no cartafol remoto «%1» - + Checking for changes in local "%1" Comprobando os cambios no cartafol local «%1» - + Reconciling changes Reconciliando os cambios - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descargar %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) enviar %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Restan %5, %1 de %2, ficheiro %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, ficheiro %3 de %4 - + file %1 of %2 ficheiro %1 de %2 - + Waiting … Agardando… - + Waiting for %n other folder(s) … Agardando por outro cartafol…Agardando por outros %n cartafoles… - + Preparing to sync … Preparando para sincronizar… @@ -2178,13 +2416,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable estábel - + beta beta @@ -2236,32 +2474,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Crear arquivo de depuración - + Server notifications that require attention. Notificacións do servidor que requiren atención. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. Non pode desactivar o inicio automático porque o inicio automático de todo o sistema está activado. - + Change update channel? Cambiar canle de actualización? - + 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. 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. @@ -2270,27 +2508,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Teña en conta que isto só selecciona de que grupo se toman as actualizacións e que non hai reversións: polo tanto, volver da canle beta á canle estábel normalmente non se pode facer inmediatamente e significa agardar por unha versión estábel que sexa máis recente que a versión beta instalada actualmente. - + Change update channel Cambiar canle de actualización - + Cancel Cancelar - + Zip Archives Arquivos Zip - + Debug Archive Created Creose o arquivo de depuración - + Debug archive is created at %1 O arquivo de depuración creouse en %1 @@ -2298,22 +2536,22 @@ Teña en conta que isto só selecciona de que grupo se toman as actualizacións OCC::GetOrCreatePublicLinkShare - + Password for share required É necesario un contrasinal para compartir - + Please enter a password for your link share: Introduza un contrasinal para a súa ligazón de compartición: - + Sharing error Produciuse un erro ao compartir - + Could not retrieve or create the public link share. Error: %1 @@ -2551,6 +2789,11 @@ Os elementos onde se permite a eliminación eliminaranse se impiden que se elimi Close Pechar + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2886,60 +3129,60 @@ Teña en conta que o uso de calquera opción da liña de ordes anulara este axus - + Use &virtual files instead of downloading content immediately %1 Use ficheiros &virtuais no canto de descargar contido inmediatamente %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" Sincronizar o cartafol «%1» - + Warning: The local folder is not empty. Pick a resolution! Advertencia: o cartafol local non está baleiro. Escolla unha resolución. - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 de espazo libre - + Virtual files are not available for the selected folder Os ficheiros virtuais non están dispoñíbeis para o cartafol seleccionado - + Local Sync Folder Sincronización do cartafol local - - + + (%1) (%1) - + There isn't enough free space in the local folder! Non hai espazo libre abondo no cartafol local! @@ -3011,7 +3254,8 @@ Teña en conta que o uso de calquera opción da liña de ordes anulara este axus OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3043,144 +3287,144 @@ Teña en conta que o uso de calquera opción da liña de ordes anulara este axus OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectouse correctamente a %1: %2 versión %3 (%4)</font><br/><br/> - + Invalid URL URL incorrecto - + Failed to connect to %1 at %2:<br/>%3 Non foi posíbel conectar con %1 en %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Esgotouse o tempo tentando conectar con %1 en %2. - + Trying to connect to %1 at %2 … Tentando conectar con %1 en %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acceso prohibido polo servidor. Para comprobar que dispón do acceso axeitado, <a href="%1">prema aquí</a> para acceder ao servizo co seu navegador. - + There was an invalid response to an authenticated WebDAV request Deuse unha resposta incorrecta a unha solicitude de WebDAV autenticada - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> O cartafol de sincronización local %1 xa existe. Configurándoo para a sincronización.<br/><br/> - + Creating local sync folder %1 … Creando o cartafol local de sincronización %1… - + OK Aceptar - + failed. fallou. - + Could not create local folder %1 Non foi posíbel crear o cartafol local %1 - + No remote folder specified! Non se especificou o cartafol remoto! - + Error: %1 Erro: %1 - + creating folder on Nextcloud: %1 creando un cartafol no Nextcloud: %1 - + Remote folder %1 created successfully. O cartafol remoto %1 creouse correctamente. - + The remote folder %1 already exists. Connecting it for syncing. O cartafol remoto %1 xa existe. Conectándoo para a sincronización. - - + + The folder creation resulted in HTTP error code %1 A creación do cartafol resultou nun código de erro HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> A creación do cartafol remoto fracasou por mor de seren incorrectas as credenciais!<br/>Volva atrás e comprobe as súas credenciais.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">A creación do cartafol remoto fallou probabelmente debido a que as credenciais que se deron non foran as correctas.</font><br/>Volva atrás e comprobe as súas credenciais.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Produciuse un fallo ao crear o cartafol remoto %1 e dou o erro <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Estabeleceuse a conexión de sincronización de %1 ao directorio remoto %2. - + Successfully connected to %1! Conectou satisfactoriamente con %1! - + Connection to %1 could not be established. Please check again. Non foi posíbel estabelecer a conexión con %1. Compróbeo de novo. - + Folder rename failed Non foi posíbel renomear o cartafol - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>O cartafol local de sincronización %1 creouse correctamente!</b></font> @@ -3203,12 +3447,12 @@ Teña en conta que o uso de calquera opción da liña de ordes anulara este axus - + Enable experimental feature? Activar as funcionalidades experimentais? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3225,12 +3469,12 @@ Cambiar a este modo interromperá calquera sincronización que estea a executars Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe dos problemas que se presenten. - + Enable experimental placeholder mode Activar o modo de marcador de posición experimental - + Stay safe Permanecer seguro @@ -3259,162 +3503,167 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. As ligazóns simbolicas non son admitidas nas sincronizacións. - + File is listed on the ignore list. O ficheiro está na lista de ignorados. - + File names ending with a period are not supported on this file system. Os nomes de ficheiros que rematan cun punto non son compatíbeis con este sistema de ficheiros. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character O nome de ficheiro contén algún carácter incorrecto - + The file name is a reserved name on this file system. O nome do ficheiro é un nome reservado neste sistema de ficheiros. - + Filename contains trailing spaces. O nome do ficheiro contén espazos finais. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. O nome de ficheiro é longo de máis. - + File/Folder is ignored because it's hidden. O ficheiro/cartafol ignórase por estar agochado. - + Stat failed. Produciuse un fallo na obtención de estatísticas. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflito: Versión do servidor descargada, a copia local cambiou o nome e non se cargou. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. O nome do ficheiro non pode ser codificado no seu sistema de ficheiros. - + The filename is blacklisted on the server. O nome do ficheiro está na lista de bloqueo no servidor. - + File has extension reserved for virtual files. O ficheiro ten a extensión reservada para ficheiros virtuais. - + size tamaño - + permission permiso - + file id ID do ficheiro - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist Ignorado por mor da lista de bloqueo de «escolla que sincronizar» - + Not allowed because you don't have permission to add subfolders to that folder Non se lle permite porque vostede non ten permiso para engadir subcartafoles neste cartafol - + Not allowed because you don't have permission to add files in that folder Non se lle permite porque vostede non ten permiso para engadir ficheiros neste cartafol - + Not allowed to upload this file because it is read-only on the server, restoring Non está permitido o envío xa que o ficheiro é só de lectura no servidor, restaurando - + Moved to invalid target, restoring Moveuse a un destino non válido, restaurándo - + Not allowed to remove, restoring Non está permitido retiralo, restaurando - + Error while reading the database Produciuse un erro ao ler a base de datos - + Server replied with an error while reading directory "%1" : %2 @@ -3422,22 +3671,22 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3450,19 +3699,19 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery O ficheiro cambiou após ser atopado - + Could not delete file record %1 from local DB @@ -3473,32 +3722,32 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe - + File %1 can not be downloaded because of a local file name clash! Non é posíbel descargar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local! - + The download would reduce free local disk space below the limit A descarga reducirá o espazo libre local por baixo do límite - + Free space on disk is less than %1 O espazo libre no disco é inferior a %1 - + File was deleted from server O ficheiro vai ser eliminado do servidor - + The file could not be downloaded completely. Non foi posíbel descargar completamente o ficheiro. - + The downloaded file is empty, but the server said it should have been %1. @@ -3508,18 +3757,23 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe Non foi posíbel gardar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3540,7 +3794,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 non foi posíbel eliminar o ficheiro %1, erro: %2 @@ -3551,16 +3805,21 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3568,7 +3827,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Non é posíbel retirar %1 por mor dunha colisión co nome dun ficheiro local @@ -3581,46 +3840,51 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Produciuse un erro ao definir o estado do pin - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3641,7 +3905,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". O servidor devolveu código HTTP incorrecto. Agardábase 204, mais recibiuse «%1 %2». @@ -3654,12 +3918,12 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe O servidor devolveu código HTTP incorrecto. Agardábase 201, mais recibiuse «%1 %2». - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3667,42 +3931,42 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Non foi posíbel renomear %1 a %2, erro: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". O servidor devolveu código HTTP incorrecto. Agardábase 201, mais recibiuse «%1 %2». - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state Produciuse un erro ao definir o estado do pin - + Error writing metadata to the database Produciuse un erro ao escribir os metadatos na base de datos @@ -3892,7 +4156,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::ServerNotificationHandler - + Reply @@ -3910,23 +4174,23 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe Axustes - + %1 Settings This name refers to the application name e.g Nextcloud Axustes de %1 - + General Xeral - + Network Rede - + Account Conta @@ -3934,17 +4198,22 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4020,7 +4289,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4029,132 +4298,169 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Compartir o menú contextual - + Select new location … Seleccionar a nova localización… - + I shared something with you Compartín algo con vostede - - + + Share options Opcións da compartición - - + + Activity - + Copy private link to clipboard Copiar a ligazón privada no portapapeis - + Send private link by email … Enviar a ligazón privada por correo… + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Non está permitido volver compartir este ficheiro - + Resharing this folder is not allowed Non está permitido volver compartir este cartafol - - + + Copy public link Copiar a ligazón pública - + Copy internal link Copiar a ligazón interna - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Editar - + Open in browser Abrir no navegador - + Resolve conflict … Resolver conflitos… - + Move and rename … Mover e renomear… - + Move, rename and upload … Mover, renomear e enviar… - + Delete local changes Eliminar os cambios locais - + Move and upload … Mover e enviar… - + Delete Eliminar @@ -4372,63 +4678,63 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (omitido por mor do erro anterior, tentándoo de novo en %2) - + Could not update file: %1 Non foi posíbel actualizar o ficheiro: %1 - + Could not update virtual file metadata: %1 Non foi posíbel actualizar os metadatos do ficheiro virtual: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflito sen resolver. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Só %1 está dispoñíbel, necesita polo menos %2 para comezar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Non foi posíbel abrir ou crear a base de datos de sincronización local. Asegúrese de ter acceso de escritura no cartafol de sincronización. - + Using virtual files with suffix, but suffix is not set Usando ficheiros virtuais con sufixo, mais o sufixo non está definido - + Unable to read the blacklist from the local database Non foi posíbel ler a lista de bloqueo da base de datos local - + Unable to read from the sync journal. Non foi posíbel ler dende o diario de sincronización. - + Cannot open the sync journal Non foi posíbel abrir o diario de sincronización @@ -4438,12 +4744,12 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Pouco espazo dispoñíbel no disco: As descargas que reduzan o tamaño por baixo de %1 van ser omitidas. - + There is insufficient space available on the server for some uploads. Non hai espazo libre abondo no servisor para algúns envíos. @@ -4512,59 +4818,59 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::Systray - + Download - + Add account Engadir unha conta - + Open main dialog Abrir o diálogo principal - - + + Pause sync Por en pausa a sincronización - - + + Resume sync Continuar coa sincronización - + Settings Axustes - + Help - + Exit %1 Saír de %1 - + Pause sync for all Por en pausa a sincronización para todos - + Resume sync for all Continuar coa sincronización para todos - + %1: %2 %1: %2 @@ -4572,24 +4878,24 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Cliente de escritorio do %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versión %1. Para obter máis información prema <a href='%2'>aquí</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Esta versión foi fornecida por %1</p> @@ -4597,22 +4903,22 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4620,30 +4926,36 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::User - + Retry all uploads Tentar de novo todos os envíos + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Confirme a retirada da conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Confirma que quere retirar a conexión a conta <i>%1</i>?</p><p><b>Aviso:</b> Isto <b>non</b> eliminará ningún ficheiro.</p> - + Remove connection Retirar conexión - + Cancel Cancelar @@ -4781,8 +5093,8 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4790,8 +5102,8 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4889,123 +5201,123 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe OCC::ownCloudGui - + Unsupported Server Version Versión del servidor non admitida - + 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. O servidor na conta %1 executa unha versión non admitida (%2). O uso deste cliente con versións de servidor non admitidas non está probado e é potencialmente perigoso. Proceda baixo a súa propia responsabilidade. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado dalgunhas contas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado das contas: - + Account %1: %2 Conta %1: %2 - + Please sign in Ten que rexistrarse - + Signed out Desconectado - + Account synchronization is disabled A sincronización está desactivada - - + + Synchronization is paused A sincronización está en pausa - + Folder %1: %2 Cartafol %1: %2 - + Unresolved conflicts Conflitos sen resolver - + Up to date Actualizado - + Error during synchronization Produciuse un erro durante a sincronización - + There are no sync folders configured. Non existen cartafoles de sincronización configurados. - + No sync folders configured Non hai cartafoles de sincronización configurados - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Sincronizando %1 de %2 (restan %3) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (restan %2) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5157,27 +5469,27 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe Novo cartafol - + You renamed %1 - + You deleted %1 Vostede eliminou %1 - + You created %1 Vostede creou %1 - + You changed %1 Vostede cambiou %1 - + Synced %1 Sincronizou %1 @@ -5243,30 +5555,106 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe Marcar como lido + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5282,7 +5670,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe SyncJournalDb - + Failed to connect database. @@ -5340,6 +5728,22 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5403,67 +5807,67 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe UserStatusSelector - + Online status - + Online Conectado/a - + Away Ausente - + Do not disturb Non molestar - + Mute all notifications Silenciar todas as notificacións - + Invisible Invisíbel - + Appear offline Aparecer como sen conexión - + Status message Mensaxe de estado - + What is your status? Cal é o seu estado? - + Clear status message after Limpar a mensaxe de estado após - + Cancel - + Clear status message Limpar a mensaxe de estado - + Set status message Establecer a mensaxe de estado @@ -5547,24 +5951,24 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe Window - + Nextcloud desktop main dialog Diálogo principal do escritorio Nextcloud - + Current account Conta actual - - + + Resume sync for all Continuar coa sincronización para todos - - + + Pause sync for all Por en pausa a sincronización para todos @@ -5574,22 +5978,22 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe - + Add account Engadir unha conta - + Add new account Engadir unha conta nova - + Settings Axustes - + Exit Saír @@ -5598,11 +6002,6 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe Current user avatar Avatar do usuario actual - - - Current account avatar - - Current user status is online @@ -5614,70 +6013,75 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + %1 - Actividade de ficheiros + + + Account switcher and settings menu Cambiador de contas e menú de configuración - + Open local folder of current account Abrir o cartafol local da conta actual - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser Abrir o Nextcloud Talk no navegador - + More apps Máis aplicacións - + Open %1 in browser Abrir %1 nun navegador - + Unified search results list - - - %1 - File activity - %1 - Actividade de ficheiros - main.cpp - + System Tray not available Área de notificación non dispoñíbel - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5685,7 +6089,7 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Construido dende la revisión Git <a href="%1">%2</a> en %3, %4 usando Qt %5, %6</small></p> @@ -5719,72 +6123,77 @@ Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Eliminado - + Moved to %1 Movido a %1 - + Ignored Ignorado - + Filesystem access error Produciuse un erro de acceso ao sistema de ficheiros - + Error Produciuse un erro - + Updated local metadata Actualizados os metadatos locais - + Unknown Descoñecido - + downloading descargando - + uploading enviando - + deleting eliminando - + moving movendo - + ignoring ignorando - + error erro - + updating local metadata actualizando os metadatos locais diff --git a/translations/client_he.ts b/translations/client_he.ts index 3a70f4fc4..9da8603d6 100644 --- a/translations/client_he.ts +++ b/translations/client_he.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ העברה לסל המחזור לא אפשרית בפלטפורמה זו - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ השרת החזיר קוד HTTP שגוי. אמור היה להיות 204 אבל התקבל „%1 %2”. - + "%1 Failed to unlock encrypted folder %2". "%1 שחרור הצפנת התיקייה נכשל %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel ביטול @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ לא להצפין תיקייה - + Do not encrypt folder - + Encrypt folder הצפנת תיקייה - + No account configured. לא הוגדר חשבון. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ הפעלת הצפנה - + + End-to-end encryption has been enabled for this account + + + + Warning אזהרה - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. אין אפשרות להצפין תיקייה עם תכנים, נא להסיר את הקבצים. @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed ההצפנה נכשלה - + Could not encrypt folder because the folder does not exist anymore לא ניתן להצפין את התיקייה כיוון שהתיקייה לא קיימת עוד - - + + Open folder פתיחת תיקייה - + Encrypt הצפן - - + + Edit Ignored Files עריכת קבצים בהתעלמות - - + + Create new folder יצירת תיקייה חדשה - - + + Availability זמינות - + Choose what to sync לבחור מה לסנכרן - + Force sync now לאלץ סנכרון כעת - + Restart sync להפעיל את הסנכרון מחדש - + Resume sync להמשיך בסנכרון - + Pause sync השהיית סנכרון - + Remove folder sync connection הסרת חיבור סנכרון לתיקייה - + Disable virtual file support … השבתת תמיכה בקובץ וירטואלי… - + Enable virtual file support %1 … הפעלת תמיכה וירטואלית בקבצים %1… - + (experimental) (ניסיוני) - + Folder creation failed יצירת התיקייה נכשלה - + <p>Could not create local folder <i>%1</i>.</p> <p>לא ניתן ליצור תיקייה מקומית <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal אשר הסרת חיבור ל סנכרון תיקיות - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>האם ברצונך להפסיק את סנכרון התיקיה <i>%1</i>?</p><p><b>שים לב:</b> פעולה זו <b>לא </b> תמחק את הקבצים.</p> - + Remove Folder Sync Connection הסר חיבור ל סנכרון תיקיות - + Disable virtual file support? להשבית תמיכה בקובץ וירטואלי? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -592,7 +607,7 @@ This action will abort any currently running synchronization. - + Disable support השבתת התמיכה @@ -602,144 +617,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running סנכרון מופעל - + The syncing operation is running.<br/>Do you want to terminate it? הסנכרון מופעל.<br/>האם להפסיק את פעולתו ? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) מתוך %2 בשימוש. חלק מהתיקיות, ובכללן תיקיות רשת או משותפות, עלולות להיות בעלות מכסות שונות. - + %1 of %2 in use %1 מתוך %2 בשימוש - + Currently there is no storage usage information available. ברגע זה אין כל מידע זמין על השימוש באחסון. - + %1 in use %1 בשימוש - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. בוצע חיבור אל %1. - + Server %1 is temporarily unavailable. השרת %1 אינו זמין כרגע. - + Server %1 is currently in maintenance mode. השרת %1 כרגע במצב תחזוקה. - + Signed out from %1. יצאת מהשירות %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. מתבצעת בקשת אימות מהדפדפן. נא <a href='%1'>ללחוץ כאן</a> לפתיחה מחדש של הדפדפן. - + Connecting to %1 … מתבצעת התחברות אל %1… - + No connection to %1 at %2. אין חיבור אל %1 ב־%2. - + Server configuration error: %1 at %2. שגיאה בתצורת השרת: %1 ב־%2. - + No %1 connection configured. אין הגדרה לחיבור %1 - + There are folders that were not synchronized because they are too big: ישנן תיקיות שלא סונכרנו מפאת גודלן הרב: - + There are folders that were not synchronized because they are external storages: ישנן תיקיות שלא סונכרנו כיוון שהן נמצאות על אמצעי אחסון חיצוניים: - + There are folders that were not synchronized because they are too big or external storages: ישנן תיקיות שלא סונכרנו כיוון שהן גדולות מדי או באחסון חיצוני: - + Confirm Account Removal אישור הסרת חשבון - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>האם ברצונך להסיר את החיבור לחשבון <i>%1</i>?</p><p><b>שים לב:</b>פעולה זו <b>לא</b> תסיר את הקבצים.</p> - + Remove connection הסרת חיבור - - + This account supports end-to-end encryption חשבון זה תומך בהצפנה מקצה לקצה - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -794,7 +841,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. לפעילויות נוספות נא לפתוח את יישומון הפעילויות. @@ -804,12 +851,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -860,32 +907,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit יציאה - + Continue המשך - + Error accessing the configuration file אירעה שגיאה בגישה לקובץ ההגדרות @@ -895,12 +969,12 @@ This action will abort any currently running synchronization. איראה שגיאה בגישה לקובץ ההגדרות ב %1. אנא וודא כי הקובץ נגיש למשתמש שלך. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 צא מ %1 @@ -946,56 +1020,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database איראה שגיאה בעת כתיבת metadata ל מסד הנתונים @@ -1013,12 +1247,12 @@ This action will abort any currently running synchronization. נא להקליד את הססמא להצפנה מקצה לקצה:<br><br>משתמש: %2<br>חשבון: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase נא להקליד ססמת הצפנה קצה לקצה @@ -1194,8 +1428,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1203,27 +1437,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 תיקייה לא נמצאה: %1 - + Filename encoding is not valid קידוד שם הקובץ לא תקין - + Error while reading directory %1 שגיאה בקריאת התיקייה %1 @@ -1231,83 +1465,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1315,7 +1549,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1444,145 +1678,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. התיקייה המקומית %1 אינה קיימת. - + %1 should be a folder but is not. %1 אמורה להיות תיקייה אבל היא לא. - + %1 is not readable. %1 אינה ניתנת לקריאה. - + %1 and %n other file(s) have been removed. %1 וקובץ %n נוסף הוסר.%1 ו־%n קבצים נוספים הוסרו.%1 ו־%n קבצים נוספים הוסרו.%1 ו־%n קבצים נוספים הוסרו. - + %1 has been removed. %1 names a file. %1 הוסרה. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 וקובץ %n נוסף עודכנו.%1 ו־%n קבצים נוספים עודכנו.%1 ו־%n קבצים נוספים עודכנו.%1 ו־%n קבצים נוספים עודכנו. - + %1 has been updated. %1 names a file. %1 עודכנה. - + %1 has been renamed to %2 and %n other file(s) have been renamed. - + %1 has been renamed to %2. %1 and %2 name files. השם של %1 הוחלף בשם %2. - + %1 has been moved to %2 and %n other file(s) have been moved. - + %1 has been moved to %2. %1 הועברה אל %2. - + %1 has and %n other file(s) have sync conflicts. - + %1 has a sync conflict. Please check the conflict file! ל־%1 יש סתירת סנכרון. נא לבדוק את קובץ הסתירה! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. - + %1 could not be synced due to an error. See the log for details. לא ניתן לסנכרן את %1 עקב שגיאה. יש לעיין ביומן לקבלת פרטים. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. %1 נעולה כרגע. - + Sync Activity פעילות סנכרון - + Could not read system exclude file לא ניתן לקרוא את קובץ ההחרגה של המערכת. - + A new folder larger than %1 MB has been added: %2. נוספה תיקייה שגודלה הוא מעבר ל־%1 מ״ב: %2. - + A folder from an external storage has been added. נוספה תיקייה ממקור חיצוני. - + Please go in the settings to select it if you wish to download it. נא לגשת להגדרות כדי לבחור אם ברצונך להוריד אותה. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. התיקייה %1 נוצרה אך הוחרגה מהסנכרון בעבר. הנתונים שבתוכה לא יסונכרנו. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. הקובץ %1 נוצר אך הוחרג מהסנכרון בעבר. הוא לא יסונכרן. - + 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). @@ -1591,7 +1825,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1599,24 +1833,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? להסיר את כל הקבצים? - + Remove all files להסיר את כל הקבצים - + Keep files לשמור על הקבצים @@ -1652,22 +1886,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state לא ניתן לאפס את מצב התיקיים - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (גיבוי) - + (backup %1) (גיבוי %1) @@ -1677,27 +1911,27 @@ If this was an accident and you decide to keep your files, they will be re-synce מצב בלתי מוגדר. - + Undefined state. - + Waiting to start syncing. בהמתנה להתחלת סנכרון. - + Preparing for sync. בהכנות לסנכרון. - + Sync is running. מתבצע סנכרון. - + Sync finished with unresolved conflicts. הסנכרון הסתיים עם סתירות בלתי פתורות. @@ -1717,62 +1951,62 @@ If this was an accident and you decide to keep your files, they will be re-synce ביטול מצד המשתמש. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. הסנכרון מושהה. - + %1 (Sync is paused) %1 (הסנכרון מושהה) - + No valid folder selected! לא נבחרה תיקיית תקנית! - + The selected path does not exist! הנתיב הנבחר לא קיים! - + The selected path is not a folder! הנתיב שנבחר אינו מצביע על תיקייה! - + You have no permission to write to the selected folder! אין לך הרשאות לכתוב לתיקייה הנבחרת! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! @@ -1785,7 +2019,7 @@ If this was an accident and you decide to keep your files, they will be re-synce הוספת קישור לסנכרון תיקיות - + File קובץ @@ -1793,152 +2027,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder עליך להתחבר כדי להוסיף תיקייה - + Click this button to add a folder to synchronize. יש ללחוץ על הכפתור הזה כדי להוסיף תיקייה לסנכרון. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. שגיאה בעת טעינת רשימת התיקיות מהשרת. - + Fetching folder list from server … רשימת התיקיות מתקבלת מהשרת… - + There are unresolved conflicts. Click for details. יש סתירות שלא נפתרו. נא ללחוץ לקבלת פרטים. - + Virtual file support is enabled. מופעלת תמיכה בקבצים וירטואליים. - + Signed out יצאת - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" %1 מסונכרן - - + + , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) הורדה %1 לשנייה - + ↓ %1/s ↓ %1 לשנייה - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) העלאה %1 לשנייה - + ↑ %1/s ↑ %1 לשנייה - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %2 %1 (%3 מתוך %4) - + %1 %2 Example text: "uploading foobar.png" %2 %1 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 נותרו, %1 מתוך %2, קובץ %3 מתוך %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 מתוך %2, קובץ %3 מתוך %4 - + file %1 of %2 קובץ %1 מתוך %2 - + Waiting … בהמתנה… - + Waiting for %n other folder(s) … בהמתנה לתיקייה נוספת…בהמתנה ל־%n תיקיות נוספות…בהמתנה ל־%n תיקיות נוספות…בהמתנה ל־%n תיקיות נוספות… - + Preparing to sync … בהכנה לסנכרון… @@ -2169,13 +2407,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2227,59 +2465,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. התראות שרת שדורשות תשומת לב. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? להחליף את ערוץ העדכונים? - + 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. 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. - + Change update channel החלפת ערוץ העדכונים - + Cancel ביטול - + Zip Archives ארכיוני Zip - + Debug Archive Created - + Debug archive is created at %1 @@ -2287,22 +2525,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required נדרשת ססמה לשיתוף - + Please enter a password for your link share: נא למלא ססמה לשיתוף הקישור: - + Sharing error שגיאת שיתוף - + Could not retrieve or create the public link share. Error: %1 @@ -2538,6 +2776,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close סגירה + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2870,60 +3113,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (ניסיוני) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 מקום פנוי - + Virtual files are not available for the selected folder - + Local Sync Folder תיקיית סנכרון מקומית - - + + (%1) (%1) - + There isn't enough free space in the local folder! אין מספיק שטח פנוי בתיקייה המקומית! @@ -2995,7 +3238,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3027,144 +3271,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> - + Invalid URL כתובת שגויה - + Failed to connect to %1 at %2:<br/>%3 ההתחברות אל %1 ב־%2 נכשלה:<br/>%3 - + Timeout while trying to connect to %1 at %2. הזמן שהוקצב להתחברות אל %1 ב־%2 פג. - + Trying to connect to %1 at %2 … מתבצע ניסיון להתחבר אל %1 ב־%2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. הגישה נאסרה על ידי השרת. כדי לוודא שיש לך גישה כנדרש, עליך <a href="%1">ללחוץ כאן</a> כדי לגשת לשירות עם הדפדפן שלך. - + There was an invalid response to an authenticated WebDAV request התגובה לבקשת ה־WebDAV המאומתת שגויה - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> תיקיית הסנכרון המקומית %1 כבר קיימת, מוגדרת לסנכרון. <br/><br/> - + Creating local sync folder %1 … תיקיית הסנכרון המקומית %1 נוצרת… - + OK אישור - + failed. כשלון. - + Could not create local folder %1 לא ניתן ליצור את התיקייה המקומית %1 - + No remote folder specified! לא צוינה תיקייה מרוחקת! - + Error: %1 שגיאה: %1 - + creating folder on Nextcloud: %1 נוצרת תיקייה ב־Nextcloud:‏ %1 - + Remote folder %1 created successfully. התיקייה המרוחקת %1 נוצרה בהצלחה. - + The remote folder %1 already exists. Connecting it for syncing. התיקייה המרוחקת %1 כבר קיימת. היא מחוברת לטובת סנכרון. - - + + The folder creation resulted in HTTP error code %1 יצירת התיקייה הובילה לקוד שגיאה %1 ב־HTTP - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> יצירת התיקייה המרוחקת נכשלה כיוון שפרטי הגישה שסופקו שגויים!<br/>נא לחזור ולאמת את פרטי הגישה שלך.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. יצירת התיקייה המרוחקת %1 נכשלה עם השגיאה <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. הוקם חיבור סנכרון מצד %1 אל התיקייה המרוחקת %2. - + Successfully connected to %1! ההתחברות אל %1 הצליחה! - + Connection to %1 could not be established. Please check again. לא ניתן להקים את ההתחברות אל %1. נא לבדוק שוב. - + Folder rename failed שינוי שם התיקייה נכשל - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>תיקיית הסנכורן המקומי %1 נוצרה בהצלחה!</b></font> @@ -3187,12 +3431,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? להפעיל יכולת ניסיונית? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3203,12 +3447,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3237,162 +3481,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. שם הקובץ מכיל רווחים עוקבים. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. שם הקובץ ארוך מדי. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3400,22 +3649,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3428,19 +3677,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery הקובץ השתנה מאז שהתגלה - + Could not delete file record %1 from local DB @@ -3451,32 +3700,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! לא ניתן להוריד את הקובץ %1 עקב סתירה עם שם קובץ מקומי! - + The download would reduce free local disk space below the limit ההורדה תפחית את המקום הפנוי בכונן המקומי אל מתחת לסף - + Free space on disk is less than %1 המקום הפנוי בכונן קטן מ־%1 - + File was deleted from server הקובץ נמחק מהשרת - + The file could not be downloaded completely. לא ניתן להוריד את הקובץ במלואו. - + The downloaded file is empty, but the server said it should have been %1. @@ -3486,18 +3735,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss לא ניתן לשמור את הקובץ %1 עקב סתירה עם שם קובץ מקומי! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3518,7 +3772,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 לא ניתן למחוק את הקובץ %1, שגיאה: %2 @@ -3529,16 +3783,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3546,7 +3805,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash לא ניתן להסיר את %1 עקב סתירה עם שם קובץ מקומי @@ -3559,46 +3818,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3619,7 +3883,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3632,12 +3896,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss הוחזר קוד HTTP שגוי על ידי השרת. אמור היה להיות 201 אבל התקבל „%1 %2”. - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3645,42 +3909,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". הוחזר קוד HTTP שגוי על ידי השרת. אמור היה להיות 201 אבל התקבל „%1 %2”. - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database שגיאה בכתיבת נתוני על למסד הנתונים @@ -3870,7 +4134,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3888,23 +4152,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss הגדרות - + %1 Settings This name refers to the application name e.g Nextcloud - + General כללי - + Network רשת - + Account חשבון @@ -3912,17 +4176,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3998,7 +4267,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4007,132 +4276,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share שיתוף מתפריט הקשר - + Select new location … - + I shared something with you שיתפתי אתך משהו - - + + Share options אפשרויות שיתוף - - + + Activity - + Copy private link to clipboard העתקת שיעור פרטי ללוח הגזירים - + Send private link by email … שליחת קישור פרטי בדוא״ל… + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed אסור לשתף קובץ זה מחדש - + Resharing this folder is not allowed - - + + Copy public link העתקת קישור ציבורי - + Copy internal link העתקת קישור פנימי - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit עריכה - + Open in browser פתיחה בדפדפן - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete מחיקה @@ -4350,63 +4656,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. סתירה בלתי פתורה. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database לא ניתן לקרוא את רשימת החסימה ממסד הנתונים המקומי - + Unable to read from the sync journal. - + Cannot open the sync journal @@ -4416,12 +4722,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. אין די מקום פנוי בכונן: הורדות שעלולות להוריד את הנפח הפנוי מתחת לסף של %1 ידולגו. - + There is insufficient space available on the server for some uploads. אין מספיק מקום זה בשרת לחלק מההורדות. @@ -4439,7 +4745,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss All synced! - + הכל מסונכרן! @@ -4490,59 +4796,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account הוספת חשבון - + Open main dialog - + פתח חלון ראשי - - + + Pause sync - - + + Resume sync - + Settings הגדרות - + Help - + Exit %1 - + יציאה מ-%1 - + Pause sync for all - + עצור סנכרונים - + Resume sync for all - + %1: %2 %1: %2 @@ -4550,24 +4856,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 לקוח לשולחן העבודה</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>גרסה %1. למידע נוסף נא ללחוץ <a href='%2'>כאן</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>גרסה זו סופקה על ידי %1</p> @@ -4575,22 +4881,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4598,30 +4904,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads לנסות את כל ההורדות מחדש + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal אישור הסרת חשבון - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>להסיר את החיבור לחשבון <i>%1</i>?</p><p><b>לתשומת לבך:</b> פעולה זו <b>לא</b> תמחק אף קובץ.</p> - + Remove connection הסרת חיבור - + Cancel ביטול @@ -4759,8 +5071,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4768,8 +5080,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4867,123 +5179,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version גרסת השרת אינה נתמכת - + 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. - + Disconnected מנותק - + Disconnected from some accounts מנותק מכמה מהחשבונות - + Disconnected from %1 ניתוק מ־%1 - + Disconnected from accounts: מנותק מהחשבונות: - + Account %1: %2 חשבון %1: %2 - + Please sign in נא להיכנס - + Signed out יצאת - + Account synchronization is disabled סנכרון החשבון מושבת - - + + Synchronization is paused הסנכרון מושהה - + Folder %1: %2 תיקייה %1: %2 - + Unresolved conflicts סתירות בלתי פתורות - + Up to date עדכני - + Error during synchronization שגיאה במהלך הסנכרון - + There are no sync folders configured. לא מוגדרות תיקיות לסנכרון - + No sync folders configured לא הוגדרו תיקיות סנכרון - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) מסתנכרנים %1 מתוך %2 (%3 נותרו) - + Syncing %1 of %2 מסתנכרנים %1 מתוך %2 - + Syncing %1 (%2 left) מסתנכרן %1 (%2 נותרו) - + Syncing %1 %1 מסתנכרן - + %1 (%2, %3) %1 (%2, %3) @@ -5135,27 +5447,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5221,30 +5533,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5260,7 +5648,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5291,7 +5679,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Search files, messages, events … - + חיפוש קבצים, הודעות, אירועים ... @@ -5318,6 +5706,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5381,67 +5785,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5525,26 +5929,26 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account חשבון נוכחי - - + + Resume sync for all - - + + Pause sync for all - + עצור סנכרונים @@ -5552,22 +5956,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account הוספת חשבון - + Add new account - + Settings הגדרות - + Exit יציאה @@ -5576,11 +5980,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5592,70 +5991,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected מחובר - + Disconnected מנותק - + Open Nextcloud Talk in browser - + More apps יישומים נוספים - + Open %1 in browser פתיחת %1 בדפדפן - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available מגש המערכת אינו זמין - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5663,7 +6067,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>נבנה מהמהדורה <a href="%1">%2</a> ב־Git ב־%3, %4 באמצעות Qt %5, %6</small></p> @@ -5697,72 +6101,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted - + Moved to %1 הועבר אל %1 - + Ignored - + Filesystem access error שגיאת גישה למערכת הקבצים - + Error שגיאה - + Updated local metadata נתוני העל המקומיים עודכנו - + Unknown לא ידוע - + downloading - + uploading - + deleting - + moving - + ignoring - + error שגיאה - + updating local metadata נתוני העל המקומיים מתעדכנים diff --git a/translations/client_hr.ts b/translations/client_hr.ts index 1551988fa..5dbda651a 100644 --- a/translations/client_hr.ts +++ b/translations/client_hr.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Otvori %1 lokalno - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Popis aktivnosti @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Premještanje u koš za smeće nije implementirano na ovoj platformi - + Error removing "%1": %2 Pogreška prilikom uklanjanja „%1”: %2 - + Could not remove folder "%1" Nije moguće ukloniti mapu „%1” @@ -321,7 +331,7 @@ Poslužitelj je vratio pogrešnu HTTP šifru. Očekivana je 204, ali je primljena „%1 %2”. - + "%1 Failed to unlock encrypted folder %2". „%1 Nije uspjelo otključavanje šifrirane mape %2.” @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Odustani @@ -400,12 +410,12 @@ Čini se da ste omogućili značajku virtualnih datoteka za ovu mapu. U ovom trenutku nije moguće implicitno preuzeti virtualne datoteke koje su cjelovito šifrirane. Za najbolje iskustvo korištenja virtualnih datoteka i cjelovitog šifriranja provjerite je li šifrirana mapa označena s „Učini uvijek dostupnim lokalno”. - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Nemoj šifrirati mapu - + Do not encrypt folder - + Encrypt folder Šifriraj mapu - + No account configured. Račun nije konfiguriran. - - Display mnemonic - Prikaži mnemoničku oznaku + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Prikaži mnemoničku oznaku @@ -445,18 +455,23 @@ Omogući šifriranje - + + End-to-end encryption has been enabled for this account + + + + Warning Upozorenje - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Ne možete šifrirati mapu sa sadržajem, prvo uklonite datoteke. @@ -469,121 +484,121 @@ Pričekajte novu sinkronizaciju, a zatim je šifrirajte. - + Encryption failed Šifriranje nije uspjelo - + Could not encrypt folder because the folder does not exist anymore Nije moguće šifrirati mapu jer mapa više ne postoji - - + + Open folder Otvori mapu - + Encrypt Šifriraj - - + + Edit Ignored Files Uredi zanemarene datoteke - - + + Create new folder Stvori novu mapu - - + + Availability Raspoloživost - + Choose what to sync Odaberite što sinkronizirati - + Force sync now Sinkroniziraj sada - + Restart sync Ponovno pokreni sinkronizaciju - + Resume sync Nastavi sinkronizaciju - + Pause sync Pauziraj sinkronizaciju - + Remove folder sync connection Uklonite poveznicu za sinkronizaciju mape - + Disable virtual file support … Onemogućite podršku za virtualne datoteke... - + Enable virtual file support %1 … Omogućite podršku za virtualne datoteke %1… - + (experimental) (eksperimentalan) - + Folder creation failed Neuspješna izrada mape - + <p>Could not create local folder <i>%1</i>.</p> <p>Nije moguće stvoriti lokalnu mapu <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Potvrdi uklanjanje poveznice za sinkronizaciju mape - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Želite li zaista prekinuti sinkronizaciju mape <i>%1</i>?</p><p><b>Napomena:</b> time <b>nećete</b> izbrisati datoteke.</p> - + Remove Folder Sync Connection Uklonite poveznicu za sinkronizaciju mape - + Disable virtual file support? Onemogućiti podršku za virtualne datoteke? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Jedina prednost onemogućavanja podrške za virtualne datoteke je ta što će po Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. - + Disable support Onemogući podršku @@ -606,144 +621,176 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sinkronizacija u tijeku - + The syncing operation is running.<br/>Do you want to terminate it? Sinkronizacija je pokrenuta.<br/>Želite li je prekinuti? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) od %2 u upotrebi. Neke mape, uključujući mrežne ili dijeljene mape, mogu imati različita ograničenja. - + %1 of %2 in use %1 od %2 u upotrebi - + Currently there is no storage usage information available. Trenutno nema dostupnih podataka o uporabi pohrane. - + %1 in use %1 u upotrebi - + %1 as %2 %1 kao %2 - + The server version %1 is unsupported! Proceed at your own risk. Inačica poslužitelja %1 nije podržana! Nastavite na vlastitu odgovornost. - + Connected to %1. Povezano s %1. - + Server %1 is temporarily unavailable. Poslužitelj %1 privremeno nije dostupan. - + Server %1 is currently in maintenance mode. Poslužitelj %1 trenutno je u načinu održavanja. - + Signed out from %1. Odjavili ste se iz %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Dobivanje autorizacije od preglednika. <a href='%1'>Kliknite ovdje</a> za ponovno otvaranje preglednika. - + Connecting to %1 … Povezivanje s %1… - + No connection to %1 at %2. Ne postoji veza s %1 na %2. - + Server configuration error: %1 at %2. Pogreška konfiguracije poslužitelja: %1 na %2. - + No %1 connection configured. Nije konfigurirana veza %1. - + There are folders that were not synchronized because they are too big: Ove mape nisu sinkronizirane jer su prevelike: - + There are folders that were not synchronized because they are external storages: Ove mape nisu sinkronizirane jer su vanjski prostori za pohranu: - + There are folders that were not synchronized because they are too big or external storages: Ove mape nisu sinkronizirane jer su prevelike ili su vanjski prostori za pohranu: - + Confirm Account Removal Potvrdi brisanje računa - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Želite li zaista ukloniti vezu s računom <i>%1</i>?</p><p><b>Napomena:</b> time <b>nećete</b> izbrisati datoteke.</p> - + Remove connection Ukloni vezu - - + This account supports end-to-end encryption Ovaj račun podržava cjelovito šifriranje - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. OCC::ActivityListModel - + For more activities please open the Activity app. Više aktivnosti možete pronaći u aplikaciji Activity. @@ -808,12 +855,12 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Ne sinkroniziraju se datoteke s popisa za zanemarivanje kao ni simboličke poveznice. @@ -864,32 +911,59 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Nastavak znači <b>brisanje ovih postavki</b>. - + Continuing will mean <b>ignoring these settings</b>. Nastavak znači <b>zanemarivanje ovih postavki</b>. - + 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>. Neke su postavke konfigurirane u novijim inačicama ovog klijenta i upotrebljavaju značajke koje nisu raspoložive u ovoj inačici.<br><br>%1<br><br>Sigurnosna kopija trenutačne konfiguracijske datoteke već je pohranjena na <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Izađi - + Continue Nastavi - + Error accessing the configuration file Pogreška pri pristupanju konfiguracijskoj datoteci @@ -899,12 +973,12 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. Došlo je do pogreške prilikom pristupanja konfiguracijskoj datoteci na %1. Provjerite može li korisnik pristupiti datoteci. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Zatvori %1 @@ -950,56 +1024,216 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Pogreška pri pisanju metapodataka u bazu podataka @@ -1017,12 +1251,12 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. Unesite zaporku za cjelovito šifriranje: <br><br>Korisnik: %2<br>Račun: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Unesite zaporku za E2E @@ -1198,8 +1432,8 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Pogreška poslužitelja: PROPFIND odgovor nije formatiran u XML-u! @@ -1207,27 +1441,27 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Pogreška pri otvaranju direktorija %1 - + Directory not accessible on client, permission denied Direktorij nije raspoloživ na klijentu, dopuštenje je odbijeno - + Directory not found: %1 Direktorij nije pronađen: %1 - + Filename encoding is not valid Nevažeće kodiranje naziva datoteke - + Error while reading directory %1 Pogreška pri čitanju direktorija %1 @@ -1235,83 +1469,83 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Ova će radnja prekinuti bilo koju trenutačnu sinkronizaciju. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Generiranje metapodataka za šifriranje nije uspjelo, u tijeku je otključavanje mape. @@ -1449,145 +1683,145 @@ Možda se radi o pogrešci u radu OpenSSL biblioteka. OCC::Folder - + Local folder %1 does not exist. Lokalna mapa %1 ne postoji. - + %1 should be a folder but is not. %1 bi trebao biti mapa, ali nije. - + %1 is not readable. %1 nije čitljiva. - + %1 and %n other file(s) have been removed. %1 i %n drugih datoteka su uklonjene.%1 i %n drugih datoteka su uklonjene.%1 i %n drugih datoteka su uklonjene. - + %1 has been removed. %1 names a file. %1 je uklonjena. - + %1 and %n other file(s) have been added. %1 i %n druga datoteka su dodane.%1 i %n druge datoteke su dodane.%1 i %n drugih datoteka su dodane. - + %1 has been added. %1 names a file. %1 je dodana. - + %1 and %n other file(s) have been updated. %1 i %n drugih datoteka su ažurirane.%1 i %n drugih datoteka su ažurirane.%1 i %n drugih datoteka su ažurirane. - + %1 has been updated. %1 names a file. %1 je ažurirana. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 je preimenovana u %2 i %n drugih datoteka je preimenovano.%1 je preimenovana u %2 i %n drugih datoteka je preimenovano.%1 je preimenovana u %2 i %n drugih datoteka je preimenovano. - + %1 has been renamed to %2. %1 and %2 name files. %1 je preimenovana u %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 je premještena u %2 i %n drugih datoteka je premješteno.%1 je premještena u %2 i %n drugih datoteka je premješteno.%1 je premještena u %2 i %n drugih datoteka je premješteno. - + %1 has been moved to %2. %1 je premještena u %2. - + %1 has and %n other file(s) have sync conflicts. Postoji nepodudaranje u sinkronizaciji za %1 i %n drugih datoteka.Postoji nepodudaranje u sinkronizaciji za %1 i %n drugih datoteka.Postoji nepodudaranje u sinkronizaciji za %1 i %n drugih datoteka. - + %1 has a sync conflict. Please check the conflict file! Postoji nepodudaranje u sinkronizaciji za %1. Provjerite datoteku nepodudaranja! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 i %n drugih datoteka nije moguće sinkronizirati zbog pogrešaka. Pojedinosti potražite u zapisu pogreške.%1 i %n drugih datoteka nije moguće sinkronizirati zbog pogrešaka. Pojedinosti potražite u zapisu pogreške.%1 i %n drugih datoteka nije moguće sinkronizirati zbog pogrešaka. Pojedinosti potražite u zapisu pogreške. - + %1 could not be synced due to an error. See the log for details. %1 nije moguće sinkronizirati zbog pogreške. Pojedinosti potražite u zapisu pogreške. - + %1 and %n other file(s) are currently locked. %1 i %n druga datoteka trenutno su zaključane.%1 i %n druge datoteke trenutno su zaključane.%1 i %n drugih datoteka trenutno su zaključane. - + %1 is currently locked. %1 trenutno je zaključan. - + Sync Activity Aktivnost sinkronizacije - + Could not read system exclude file Nije moguće pročitati datoteku izuzetka iz sustava - + A new folder larger than %1 MB has been added: %2. Dodana je nova mapa veća od %1 MB: %2. - + A folder from an external storage has been added. Dodana je mapa iz vanjskog prostora za pohranu. - + Please go in the settings to select it if you wish to download it. Idite u postavke kako biste je odabrali ako je želite preuzeti. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Mapa %1 je stvorena, ali je prethodno isključena iz sinkronizacije. Podaci unutar nje neće se sinkronizirati. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Datoteka %1 je stvorena, ali je prethodno isključena iz sinkronizacije. Neće se sinkronizirati. - + 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). @@ -1600,7 +1834,7 @@ To znači da klijent za sinkronizaciju možda neće odmah otpremiti lokalne prom %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ Ako odlučite vratiti datoteke, ponovno će se sinkronizirati s poslužiteljem a Ako odlučite izbrisati datoteke, one će vam biti nedostupne ako niste njihov vlasnik. - + 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. @@ -1620,17 +1854,17 @@ Jeste li sigurni da želite sinkronizirati te radnje s poslužiteljem? Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovno će se sinkronizirati s poslužitelja. - + Remove All Files? Ukloniti sve datoteke? - + Remove all files Ukloni sve datoteke - + Keep files Zadrži datoteke @@ -1666,22 +1900,22 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn OCC::FolderMan - + Could not reset folder state Stanje mape nije moguće vratiti - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Pronađen je stari sinkronizacijski dnevnik „%1” ali ga nije moguće ukloniti. Provjerite koristi li ga trenutno neka druga aplikacija. - + (backup) (sigurnosna kopija) - + (backup %1) (sigurnosna kopija %1) @@ -1691,27 +1925,27 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn Nedefinirano stanje. - + Undefined state. - + Waiting to start syncing. Čeka se početak sinkronizacije. - + Preparing for sync. Priprema za sinkronizaciju. - + Sync is running. Sinkronizacija je pokrenuta. - + Sync finished with unresolved conflicts. Sinkronizacija je završena uz neriješena nepodudaranja. @@ -1731,62 +1965,62 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn Prekinuo korisnik. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sinkronizacija je pauzirana. - + %1 (Sync is paused) %1 (Sinkronizacija je pauzirana) - + No valid folder selected! Nije odabrana nijedna valjana mapa! - + The selected path does not exist! Odabrani put ne postoji! - + The selected path is not a folder! Odabran put nije mapa! - + You have no permission to write to the selected folder! Nemate dopuštenje za pisanje u odabranu mapu! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Lokalna mapa %1 već sadrži mapu koja se upotrebljava u poveznici za sinkronizaciju mape. Odaberite drugu mapu! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Lokalna mapa %1 već je sadržana u mapi koja se upotrebljava u poveznici za sinkronizaciju mape. Odaberite drugu mapu! - + There is already a sync from the server to this local folder. Please pick another local folder! Već postoji sinkronizacija između poslužitelja i te lokalne mape. Odaberite drugu lokalnu mapu! @@ -1799,7 +2033,7 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn Dodaj poveznicu za sinkronizaciju mape - + File Datoteka @@ -1807,152 +2041,156 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn OCC::FolderStatusModel - + You need to be connected to add a folder Morate biti povezani kako biste dodali mapu - + Click this button to add a folder to synchronize. Kliknite ovaj gumb kako biste dodali mapu za sinkronizaciju. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Pogreška prilikom učitavanja popisa mapa s poslužitelja. - + Fetching folder list from server … Dohvaćanje popisa mapa s poslužitelja… - + There are unresolved conflicts. Click for details. Postoje neriješena nepodudaranja. Kliknite za pojedinosti. - + Virtual file support is enabled. Podrška za virtualne datoteke je omogućena. - + Signed out Odjavljen - + Synchronizing VirtualFiles with local folder Sinkroniziranje VirtualFiles s lokalnom mapom - + Synchronizing with local folder Sinkroniziranje s lokalnom mapom - + Checking for changes in remote "%1" Provjera za promjene u udaljenom „%1” - + Checking for changes in local "%1" Provjera za promjene u lokalnom „%1” - + Reconciling changes Usklađivanje promjena - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sinkronizacija %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) preuzimanje %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) otpremanje %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 od %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 preostalo, %1 od %2, datoteka %3 od %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 od %2, datoteka %3 od %4 - + file %1 of %2 datoteka %1 od %2 - + Waiting … Čekanje… - + Waiting for %n other folder(s) … Čeka se %n druga mapa…Čekaju se %n druge mape…Čeka se %n drugih mapa… - + Preparing to sync … Priprema za sinkronizaciju… @@ -2183,13 +2421,13 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn - + stable stabilna - + beta beta @@ -2241,32 +2479,32 @@ Ako ste slučajno odabrali ovu radnju i želite zadržati svoje datoteke, ponovn - + Create Debug Archive Stvori arhivu otklanjanja pogrešaka - + Server notifications that require attention. Obavijesti poslužitelja koje zahtijevaju pažnju. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. Ne možete onemogućiti automatsko pokretanje jer je omogućeno automatsko pokretanje na razini cijelog sustava. - + Change update channel? Promijeniti kanal za ažuriranje? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Imajte na umu da se ovime odabire samo kategorija iz koje dolaze nadogradnje i da nema vraćanja na stare inačice: stoga se povratak s beta kanala na stabilni kanal obično ne može odmah izvršiti, već je potrebno pričekati stabilnu inačicu koja je novija od trenutačno instalirane beta inačice. - + Change update channel Promijeni kanal za ažuriranje - + Cancel Odustani - + Zip Archives Zip arhive - + Debug Archive Created Arhiva otklanjanja pogrešaka je stvorena - + Debug archive is created at %1 Arhiva otklanjanja pogrešaka je stvorena na %1 @@ -2303,22 +2541,22 @@ Imajte na umu da se ovime odabire samo kategorija iz koje dolaze nadogradnje i d OCC::GetOrCreatePublicLinkShare - + Password for share required Potrebna je zaporka za dijeljenje - + Please enter a password for your link share: Unesite zaporku svoje poveznice dijeljenja: - + Sharing error Pogreška dijeljenja - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Stavke za koje je dopušteno brisanje bit će izbrisane ako sprječavaju uklanja Close Zatvori + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Imajte na umu da će uporaba bilo koje opcije naredbenog retka u vezi sa zapisim - + Use &virtual files instead of downloading content immediately %1 Upotrijebi &virtualne datoteke umjesto trenutnog preuzimanja sadržaja %1 - + (experimental) (eksperimentalan) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Virtualne datoteke nisu podržane za lokalne mape koje se upotrebljavaju kao korijenske mape particije sustava Windows. Odaberite važeću podmapu ispod slova diskovne particije. - + %1 folder "%2" is synced to local folder "%3" %1 mapa „%2” sinkronizirana je s lokalnom mapom „%3” - + Sync the folder "%1" Sinkroniziraj mapu „%1” - + Warning: The local folder is not empty. Pick a resolution! Upozorenje: lokalna mapa nije prazna. Odaberite razlučivost! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 slobodnog prostora - + Virtual files are not available for the selected folder Virtualne datoteke nisu raspoložive za odabranu mapu - + Local Sync Folder Mapa za lokalnu sinkronizaciju - - + + (%1) (%1) - + There isn't enough free space in the local folder! Nema dovoljno slobodnog prostora u lokalnoj mapi! @@ -3016,7 +3259,8 @@ Imajte na umu da će uporaba bilo koje opcije naredbenog retka u vezi sa zapisim OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3048,144 +3292,144 @@ Imajte na umu da će uporaba bilo koje opcije naredbenog retka u vezi sa zapisim OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Uspješno povezivanje s %1: %2 inačicom %3 (%4)</font><br/><br/> - + Invalid URL Neispravan URL - + Failed to connect to %1 at %2:<br/>%3 Neuspješno povezivanje s %1 na %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Istek vremena tijekom povezivanja s %1 na %2. - + Trying to connect to %1 at %2 … Pokušaj povezivanja s %1 na %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Autorizirani zahtjev poslužitelju preusmjeren je na „%1”. URL je neispravan, poslužitelj je pogrešno konfiguriran. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Poslužitelj je zabranio pristup. Kako biste provjerili imate li ispravan pristup, <a href="%1">kliknite ovdje</a> kako biste pristupili servisu putem preglednika. - + There was an invalid response to an authenticated WebDAV request Došlo je do nevažećeg odgovora na autorizirani zahtjev protokola WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Mapa za lokalnu sinkronizaciju %1 već postoji, postavljanje za sinkronizaciju.<br/><br/> - + Creating local sync folder %1 … Stvaranje mape za lokalnu sinkronizaciju %1… - + OK U redu - + failed. neuspješno. - + Could not create local folder %1 Nije moguće stvoriti lokalnu mapu %1 - + No remote folder specified! Nije navedena nijedna udaljena mapa! - + Error: %1 Pogreška: %1 - + creating folder on Nextcloud: %1 stvaranje mape na Nextcloudu: %1 - + Remote folder %1 created successfully. Uspješno je stvorena udaljena mapa %1. - + The remote folder %1 already exists. Connecting it for syncing. Udaljena mapa %1 već postoji. Povezivanje radi sinkronizacije. - - + + The folder creation resulted in HTTP error code %1 Stvaranje mape rezultiralo je HTTP šifrom pogreške %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Stvaranje udaljene mape nije uspjelo jer su navedene vjerodajnice pogrešne!<br/>Vratite se i provjerite svoje vjerodajnice.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color=“red“>Stvaranje udaljene mape nije uspjelo vjerojatno zbog pogrešnih unesenih vjerodajnica.</font><br/>Vratite se i provjerite vjerodajnice.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Stvaranje udaljene mape %1 nije uspjelo, pogreška: <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Postavljena je sinkronizacijska veza od %1 do udaljenog direktorija %2. - + Successfully connected to %1! Uspješno povezivanje s %1! - + Connection to %1 could not be established. Please check again. Veza s %1 nije uspostavljena. Provjerite opet. - + Folder rename failed Preimenovanje mape nije uspjelo - + Cannot 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. Nije moguće ukloniti i izraditi sigurnosnu kopiju mape jer je mapa ili datoteka u njoj otvorena u drugom programu. Zatvorite mapu ili datoteku i pritisnite Pokušaj ponovo ili otkažite postavljanje. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color=“green“><b>Mapa za lokalnu sinkronizaciju %1 uspješno je stvorena!</b></font> @@ -3208,12 +3452,12 @@ Imajte na umu da će uporaba bilo koje opcije naredbenog retka u vezi sa zapisim - + Enable experimental feature? Omogućiti eksperimentalne značajke? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Prebacivanjem u ovaj način rada poništavaju se sve sinkronizacije koje se tren Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijavite sve probleme s kojima se susretnete. - + Enable experimental placeholder mode Omogući eksperimentalni način rada sa zamjenskim datotekama - + Stay safe Zadrži stari @@ -3264,162 +3508,167 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Simboličke poveznice nisu podržane u sinkronizaciji. - + File is listed on the ignore list. Datoteka je navedena na popisu za zanemarivanje. - + File names ending with a period are not supported on this file system. Nazivi datoteka koji završavaju točkom nisu podržani u ovom datotečnom sustavu. - + File names containing the character "%1" are not supported on this file system. Nazivi datoteka koji sadrže znak „%1” nisu podržani u ovom datotečnom sustavu. - + File name contains at least one invalid character Naziv datoteke sadrži barem jedan nevažeći znak - + The file name is a reserved name on this file system. Naziv datoteke je rezervirani naziv u ovom datotečnom sustavu. - + Filename contains trailing spaces. Naziv datoteke sadrži završne praznine. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Naziv datoteke je predugačak. - + File/Folder is ignored because it's hidden. Datoteka/mapa se zanemaruje jer je skrivena. - + Stat failed. Stat nije uspio. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Nepodudaranje: preuzeta inačica poslužitelja, lokalna kopija preimenovana i nije otpremljena. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Naziv datoteke ne može se kodirati u vašem datotečnom sustavu. - + The filename is blacklisted on the server. Ovaj naziv datoteke je blokiran na poslužitelju. - + File has extension reserved for virtual files. Datoteka ima nastavak koji je rezerviran za virtualne datoteke. - + size veličina - + permission dopuštenje - + file id id datoteke - + Server reported no %1 Poslužitelj javlja da nema %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! Došlo je do nepodudaranja pri otpremanju mape. Nepodudarne mape će biti izbrisane! - + Conflict when uploading a file. It's going to get removed! Došlo je do nepodudaranja pri otpremanju datoteke. Nepodudarna datoteka će biti uklonjena! - + Ignored because of the "choose what to sync" blacklist Zanemareno zbog crne liste „odaberi što će se sinkronizirati” - + Not allowed because you don't have permission to add subfolders to that folder Nije dopušteno jer nemate dopuštenje za dodavanje podmapa u tu mapu - + Not allowed because you don't have permission to add files in that folder Nije dopušteno jer nemate dopuštenje za dodavanje datoteka u tu mapu - + Not allowed to upload this file because it is read-only on the server, restoring Nije dopušteno otpremiti ovu datoteku jer je dostupna samo za čitanje na poslužitelju, vraćanje - + Moved to invalid target, restoring Premješteno na nevažeće odredište, vraćanje - + Not allowed to remove, restoring Nije dopušteno uklanjanje, vraćanje - + Error while reading the database Pogreška pri čitanju baze podataka - + Server replied with an error while reading directory "%1" : %2 Poslužitelj je javio pogrešku pri čitanju direktorija „%1” : %2 @@ -3427,22 +3676,22 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 Pogreška pri ažuriranju metapodataka: %1 - + File is currently in use Datoteka je trenutno u upotrebi @@ -3455,19 +3704,19 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav - + File %1 cannot be downloaded because encryption information is missing. Datoteka %1 ne može se preuzeti jer nedostaju informacije o šifriranju. - - + + File has changed since discovery Datoteka se promijenila od njenog otkrića - + Could not delete file record %1 from local DB @@ -3478,32 +3727,32 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Datoteka %1 ne može se preuzeti zbog nepodudaranja naziva lokalne datoteke! - + File %1 can not be downloaded because of a local file name clash! Datoteka %1 ne može se preuzeti zbog nepodudaranja naziva lokalne datoteke! - + The download would reduce free local disk space below the limit Preuzimanje bi smanjilo slobodni prostor na lokalnom disku ispod granice - + Free space on disk is less than %1 Slobodan prostor na disku manji je od %1 - + File was deleted from server Datoteka je izbrisana s poslužitelja - + The file could not be downloaded completely. Datoteku nije moguće u potpunosti preuzeti. - + The downloaded file is empty, but the server said it should have been %1. Preuzeta datoteka je prazna, ali poslužitelj je javio da treba biti %1. @@ -3513,18 +3762,23 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Datoteka %1 ne može se spremiti zbog nepodudaranja naziva lokalne datoteke! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Pogreška pri ažuriranju metapodataka: %1 - + The file %1 is currently in use Datoteka %1 je trenutno u upotrebi @@ -3545,7 +3799,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 nije moguće izbrisati datoteku %1, pogreška: %2 @@ -3556,16 +3810,21 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Nije moguće stvoriti mapu %1 - + Error updating metadata: %1 Pogreška pri ažuriranju metapodataka: %1 - + The file %1 is currently in use Datoteka %1 je trenutno u upotrebi @@ -3573,7 +3832,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Nije moguće ukloniti %1 zbog nepodudaranja naziva lokalne datoteke @@ -3586,46 +3845,51 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Datoteka %1 ne može se preimenovati u %2 zbog nepodudaranja naziva lokalne datoteke - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Pogreška pri postavljanju stanja šifre - - + + Error updating metadata: %1 Pogreška pri ažuriranju metapodataka: %1 - + The file %1 is currently in use Datoteka %1 je trenutno u upotrebi - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Preimenovanje datoteke nije uspjelo @@ -3646,7 +3910,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Poslužitelj je vratio pogrešnu HTTP šifru. Očekivana je 204, ali je primljena „%1 %2”. @@ -3659,12 +3923,12 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Poslužitelj je vratio pogrešnu HTTP šifru. Očekivana je 201, ali je primljena „%1 %2”. - + Error writing metadata to the database: %1 Pogreška pri pisanju metapodataka u bazu podataka: %1 - + The file %1 is currently in use Datoteka %1 je trenutno u upotrebi @@ -3672,42 +3936,42 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Preimenovanje %1 u %2 nije uspjelo, pogreška: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Poslužitelj je vratio pogrešnu HTTP šifru. Očekivana je 201, ali je primljena „%1 %2”. - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Pogreška pri ažuriranju metapodataka: %1 - + The file %1 is currently in use Datoteka %1 je trenutno u upotrebi - + Error setting pin state Pogreška pri postavljanju stanja šifre - + Error writing metadata to the database Pogreška pri pisanju metapodataka u bazu podataka @@ -3897,7 +4161,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::ServerNotificationHandler - + Reply @@ -3915,23 +4179,23 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Postavke - + %1 Settings This name refers to the application name e.g Nextcloud %1 Postavke - + General Općenito - + Network Mreža - + Account Račun @@ -3939,17 +4203,22 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4025,7 +4294,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,169 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Dijeljenje kontekstnog izbornika - + Select new location … Odaberi novu lokaciju… - + I shared something with you Dijelim nešto s vama - - + + Share options Mogućnosti dijeljenja - - + + Activity Aktivnost - + Copy private link to clipboard Kopiraj privatnu poveznicu u međuspremnik - + Send private link by email … Pošalji privatnu poveznicu e-poštom… + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Dijeljenje ove datoteke nije dopušteno - + Resharing this folder is not allowed Ponovno dijeljenje ove mape nije dopušteno - - + + Copy public link Kopiraj javnu poveznicu - + Copy internal link Kopiraj internu poveznicu - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Uredi - + Open in browser Otvori u pregledniku - + Resolve conflict … Riješi nepodudaranje… - + Move and rename … Premjesti i preimenuj… - + Move, rename and upload … Premjesti, preimenuj i otpremi… - + Delete local changes Izbriši lokalne promjene - + Move and upload … Premjesti i otpremi… - + Delete Izbriši @@ -4377,63 +4683,63 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (preskočeno zbog prethodne pogreške, pokušajte ponovno za %2) - + Could not update file: %1 Neuspješno ažuriranje datoteke: %1 - + Could not update virtual file metadata: %1 Nije uspjelo ažuriranje metapodataka virtualne datoteke: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Neriješeno nepodudaranje. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Dostupno je samo %1, za pokretanje je potrebno najmanje %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Nije moguće otvoriti ili stvoriti lokalnu sinkronizacijsku bazu podataka. Provjerite imate li pristup pisanju u mapi za sinkronizaciju. - + Using virtual files with suffix, but suffix is not set Upotrebljavaju se virtualne datoteke sa sufiksom, ali sufiks nije određen - + Unable to read the blacklist from the local database Nije moguće pročitati crnu listu iz lokalne baze podataka - + Unable to read from the sync journal. Nije moguće čitati iz sinkronizacijskog dnevnika. - + Cannot open the sync journal Nije moguće otvoriti sinkronizacijski dnevnik @@ -4443,12 +4749,12 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Sinkronizacija će se uskoro nastaviti. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Premalo prostora na disku: preskočena su preuzimanja koja bi smanjila slobodni prostor ispod %1. - + There is insufficient space available on the server for some uploads. Na nekim poslužiteljima nema dovoljno slobodnog prostora za određene otpreme. @@ -4517,59 +4823,59 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::Systray - + Download - + Add account Dodaj račun - + Open main dialog Otvori glavni dijaloški okvir - - + + Pause sync Pauziraj sinkronizaciju - - + + Resume sync Nastavi sinkronizaciju - + Settings Postavke - + Help - + Exit %1 Izlaz %1 - + Pause sync for all Pauziraj sinkronizaciju za sve - + Resume sync for all Nastavi sinkronizaciju za sve - + %1: %2 %1: %2 @@ -4577,24 +4883,24 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Klijent za osobna računala</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Inačica %1. Za više informacija kliknite <a href=’%2’>ovdje</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Upotreba dodatka za virtualne datoteke: %1</small></p> - + <p>This release was supplied by %1</p> <p>Ovo izdanje isporučuje %1</p> @@ -4602,22 +4908,22 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Dohvaćanje davatelja nije uspjelo. - + Failed to fetch search providers for '%1'. Error: %2 Nije uspjelo dohvaćanje davatelja usluga pretraživanja za '%1'. Pogreška: %2 - + Search has failed for '%2'. Pretraživanje za „%2“ nije uspjelo. - + Search has failed for '%1'. Error: %2 Pretraživanje za „%1” nije uspjelo. Pogreška: %2 @@ -4625,30 +4931,36 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::User - + Retry all uploads Ponovno pokreni sve otpreme + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Potvrdi brisanje računa - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Želite li zaista ukloniti vezu s računom <i>%1</i>?</p><p><b>Napomena:</b> time <b>nećete</b> izbrisati datoteke.</p> - + Remove connection Ukloni vezu - + Cancel Odustani @@ -4786,8 +5098,8 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4795,8 +5107,8 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4894,123 +5206,123 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav OCC::ownCloudGui - + Unsupported Server Version Nepodržana inačica poslužitelja - + 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. Poslužitelj na računu %1 koristi se nepodržanom inačicom %2. Upotreba ovog klijenta s nepodržanim inačicama poslužitelja nije testirana i potencijalno je opasna. Nastavite na vlastitu odgovornost. - + Disconnected Odspojen - + Disconnected from some accounts Odspojen od nekih računa - + Disconnected from %1 Odspojen od %1 - + Disconnected from accounts: Odspojen od računa: - + Account %1: %2 Račun %1: %2 - + Please sign in Prijavite se - + Signed out Odjavljen - + Account synchronization is disabled Sinkronizacija računa je onemogućena - - + + Synchronization is paused Sinkronizacija je pauzirana - + Folder %1: %2 Mapa %1: %2 - + Unresolved conflicts Neriješena nepodudaranja - + Up to date Ažurno - + Error during synchronization Pogreška tijekom sinkronizacije - + There are no sync folders configured. Nema konfiguriranih mapa za sinkronizaciju. - + No sync folders configured Nije konfigurirana nijedna mapa za sinkronizaciju - + Checking for changes in remote "%1" Provjera za promjene u udaljenom „%1” - + Checking for changes in local "%1" Provjera za promjene u lokalnom „%1” - + Syncing %1 of %2 (%3 left) Sinkronizacija %1 od %2 (preostalo %3) - + Syncing %1 of %2 Sinkronizacija %1 od %2 - + Syncing %1 (%2 left) Sinkronizacija %1 (preostalo %2) - + Syncing %1 Sinkronizacija %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5474,27 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Nova mapa - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5248,30 +5560,106 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5287,7 +5675,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav SyncJournalDb - + Failed to connect database. Povezivanje baze podataka nije uspjelo. @@ -5345,6 +5733,22 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Učitaj više rezultata + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5408,67 +5812,67 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav UserStatusSelector - + Online status Status na mreži - + Online Na mreži - + Away Odsutan - + Do not disturb Ne ometaj - + Mute all notifications - + Invisible Nevidljiv - + Appear offline - + Status message Poruka statusa - + What is your status? Koji je vaš status? - + Clear status message after Izbriši poruku statusa nakon - + Cancel - + Clear status message Izbriši poruku statusa - + Set status message Postavi poruku statusa @@ -5552,24 +5956,24 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Window - + Nextcloud desktop main dialog Glavni dijaloški okvir Nextclouda - + Current account Trenutni račun - - + + Resume sync for all Nastavi sinkronizaciju za sve - - + + Pause sync for all Pauziraj sinkronizaciju za sve @@ -5579,22 +5983,22 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Postavi status korisnika - + Add account Dodaj račun - + Add new account Dodaj novi račun - + Settings Postavke - + Exit Izlaz @@ -5603,11 +6007,6 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Current user avatar Avatar trenutnog korisnika - - - Current account avatar - - Current user status is online @@ -5619,70 +6018,75 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav Trenutni status korisnika je „ne ometaj“ - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + %1 – aktivnost datoteke + + + Account switcher and settings menu Izmjenjivač računa i izbornik postavki - + Open local folder of current account Otvori lokalnu mapu trenutnog računa - + Connected Povezan - + Disconnected Odspojen - + Open Nextcloud Talk in browser Otvori Nextcloud Talk u pregledniku - + More apps Više aplikacija - + Open %1 in browser Otvori %1 u pregledniku - + Unified search results list Objedinjen popis rezultata pretraživanja - - - %1 - File activity - %1 – aktivnost datoteke - main.cpp - + System Tray not available Ladica sustava nije dostupna - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 je tražen na radnoj ladici sustava. Ako upotrebljavate XFCE, slijedite <a href=“http://docs.xfce.org/xfce/xfce4-panel/systray“>ove upute</a>. U suprotnom instalirajte aplikaciju ladice sustava kao što je „trayer” i pokušajte ponovno. @@ -5690,7 +6094,7 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Izrađeno iz revizije Gita <a href="%1“>%2</a>na %3, %4 s pomoću Qt %5, %6</small></p> @@ -5724,72 +6128,77 @@ Ovo je novi, eksperimentalni način rada. Ako se odlučite aktivirati ga, prijav + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Izbrisano - + Moved to %1 Premješteno u %1 - + Ignored Zanemareno - + Filesystem access error Pogreška pristupa datotečnom sustavu - + Error Pogreška - + Updated local metadata Ažurirani lokalni metapodaci - + Unknown Nepoznato - + downloading preuzimanje - + uploading otpremanje - + deleting brisanje - + moving premještanje - + ignoring zanemarivanje - + error pogreška - + updating local metadata ažuriranje lokalnih metapodataka diff --git a/translations/client_hu.ts b/translations/client_hu.ts index a3ede9a5a..f440816c5 100644 --- a/translations/client_hu.ts +++ b/translations/client_hu.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally %1 megnyitása helyben - + In %1 Itt: %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions További műveletek megjelenítése @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Mellőzés + + + Open file details + Fájl részleteinek megnyitása + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Tevékenységlista @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Állapotüzenet-menü ürítése @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Eltüntetés + + + Activity Tevékenység - + Sharing Megosztás @@ -226,12 +236,12 @@ A kuka áthelyezése nincs megvalósítva ezen a platformon - + Error removing "%1": %2 Hiba a(z) „%1” eltávolításakor: %2 - + Could not remove folder "%1" A(z) „%1” mappa nem távolítható el @@ -321,7 +331,7 @@ A kiszolgáló helytelen HTTP-kódot adott vissza. 204-re várt, de a következőt kapta: „%1 %2”. - + "%1 Failed to unlock encrypted folder %2". „%1 nem sikerült feloldani a(z) %2 titkosított mappát”. @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. A(z) %1 fájlt %2 már zárolta. - + Lock operation on %1 failed with error %2 A(z) %1 zárolási művelete sikertelen a következő hibával: %2 - + Unlock operation on %1 failed with error %2 A(z) %1 feloldási művelete sikertelen a következő hibával: %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Mégse @@ -400,12 +410,12 @@ Úgy néz ki, hogy engedélyezte a Virtuális fájlok funkciót ezen a mappán. Pillanatnyilag nem lehet implicit módon olyan virtuális fájlokat letölteni, melyek végpontok közti titkosítással vannak ellátva. A legjobb élmény érdekében győződjön meg róla, hogy a titkosított mappa meg legyen jelölve, hogy mindig elérhető legyen helyben is. - + End-to-end Encryption with Virtual Files Végpontok közti titkosítás virtuális fájlokkal - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Úgy néz ki, hogy engedélyezte a Virtuális fájlok funkciót ezen a mappán. Pillanatnyilag nem lehet implicit módon olyan virtuális fájlokat letölteni, melyek végpontok közti titkosítással vannak ellátva. A legjobb élmény érdekében győződjön meg róla, hogy a titkosított mappa meg legyen jelölve, hogy mindig elérhető legyen helyben is. @@ -415,29 +425,29 @@ Ne titkosítsa a mappát - + Do not encrypt folder Ne titkosítsa a mappát - + Encrypt folder Mappa titkosítása - + No account configured. Nincs fiók beállítva. - - Display mnemonic - Mnemonikus kód megjelenítése + + Disable encryption + - End-to-end encryption has been enabled for this account - A végpontok közötti titkosítás engedélyezett ennél a fióknál + Display mnemonic + Mnemonikus kód megjelenítése @@ -445,19 +455,24 @@ Titkosítás engedélyezése - + + End-to-end encryption has been enabled for this account + A végpontok közötti titkosítás engedélyezett ennél a fióknál + + + Warning Figyelmeztetés - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? A végpontok közti titkosítás nincs beállítva ezen az eszközön. Ha beállította, akkor titkosíthatja ezt a mappát. Szeretné beállítani a végpontok közti titkosítást? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Nem titkosíthat egy fájlokat tartalmazó mappát. Távolítsa el a fájlokat. @@ -470,121 +485,121 @@ Várja meg az új szinkronizálást, majd titkosítsa. Ez a fiók támogatja a végpontok közti titkosítást - + Encryption failed Titkosítás sikertelen - + Could not encrypt folder because the folder does not exist anymore Nem lehetett titkosítani a mappát, mert már nem létezik - - + + Open folder Mappa megnyitása - + Encrypt Titkosítás - - + + Edit Ignored Files Kihagyott fájlok szerkesztése - - + + Create new folder Új mappa létrehozása - - + + Availability Elérhetőség - + Choose what to sync Szinkronizálandó elemek kiválasztása - + Force sync now Szinkronizálás azonnal - + Restart sync Szinkronizálás újraindítása - + Resume sync Szinkronizálás folytatása - + Pause sync Szinkronizálás szüneteltetése - + Remove folder sync connection Mappa szinkronizálási kapcsolatának eltávolítása - + Disable virtual file support … A virtuális fájl támogatásának letiltása… - + Enable virtual file support %1 … A(z) %1 virtuális fájl támogatás engedélyezése… - + (experimental) (kísérleti) - + Folder creation failed Mappa létrehozása sikertelen - + <p>Could not create local folder <i>%1</i>.</p> <p>A helyi mappa nem hozható létre: <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Mappa szinkronizációs kapcsolatának eltávolításának megerősítése - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Tényleg leállítja a(z) <i>%1</i> mappa szinkronizálását?</p><p><b>Megjegyzés:</b> Ez <b>nem</b> töröl fájlokat.</p> - + Remove Folder Sync Connection Mappa szinkronizálási kapcsolatának eltávolítása - + Disable virtual file support? Letiltja a virtuális fájlok támogatását? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ A virtuális fájltámogatás letiltásának egyetlen előnye, hogy a szelektív Ez a művelet megszakítja a jelenleg futó szinkronizálást. - + Disable support Támogatás letiltása @@ -607,145 +622,177 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. Végpontok közti titkosítás mnemonikus kódja - + End-to-end encryption mnemonic Végpontok közötti titkosítás mnemonikus kódja - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). A kriptográfiai személyazonossága megvédéséhez, egy 12 szótári szóból álló mnemonikus kóddal titkosítjuk. Jegyezze meg ezeket, és tartsa azokat biztonságban. Szüksége lesz rájuk, ha egy új eszközt akar hozzáadni a fiókjához (például a mobiltelefonját vagy a laptopját). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running A szinkronizálás fut - + The syncing operation is running.<br/>Do you want to terminate it? A szinkronizálás folyamatban van. <br/>Megszakítja? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) / %2 használatban. Néhány mappa – beleértve a hálózati megosztásokat és a megosztott könyvtárakat – eltérő korlátozással rendelkezhet. - + %1 of %2 in use %1 / %2 használatban - + Currently there is no storage usage information available. Jelenleg nem érhetőek el a tárhelyhasználati információk. - + %1 in use %1 használatban - + %1 as %2 %1 mint %2 - + The server version %1 is unsupported! Proceed at your own risk. A(z) %1 kiszolgálóverzió nem támogatott. Folyatás csak saját felelősségre. - + Connected to %1. Kapcsolódva ehhez: %1. - + Server %1 is temporarily unavailable. A(z) %1 kiszolgáló jelenleg nem érhető el. - + Server %1 is currently in maintenance mode. A(z) %1 kiszolgáló jelenleg karbantartási módban van. - + Signed out from %1. Kijelentkezve innen: %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Engedély kérése a böngészőtől. <a href='%1'>Kattintson ide</a> a böngésző újranyitásához. - + Connecting to %1 … Kapcsolódás ehhez: %1… - + No connection to %1 at %2. Nincs kapcsolat ehhez: %1, itt: %2. - + Server configuration error: %1 at %2. Kiszolgáló konfigurációs hiba: %1, itt: %2. - + No %1 connection configured. Nincs %1 kapcsolat beállítva. - + There are folders that were not synchronized because they are too big: Az alábbi mappák nem lettek szinkronizálva, mert túl nagyok: - + There are folders that were not synchronized because they are external storages: Az alábbi mappák nem lettek szinkronizálva, mert külső tárolók: - + There are folders that were not synchronized because they are too big or external storages: Az alábbi mappák nem lettek szinkronizálva, mert túl nagyok, vagy külső tárolók: - + Confirm Account Removal Fiók törlésének megerősítése - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Tényleg törölni szeretné a kapcsolatot a(z) <i>%1</i> fiókkal?</p><p><b>Megjegyzés:</b> Ez <b>nem</b> töröl fájlokat.</p> - + Remove connection Kapcsolat eltávolítása - - + This account supports end-to-end encryption Ez a fiók támogatja a végpontok közötti titkosítást - + Set up encryption Titkosítás beállítása - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - A végpontok közti titkosítás egy másik eszközről engedélyezve lett ezen a fiókon.<br>A mnemonikus kód megadásával ezen az eszközön is engedélyezheti. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + A végpontok közti titkosítás egy másik eszközről engedélyezve lett ezen a fiókon.<br>A mnemonikus kód megadásával ezen az eszközön is engedélyezheti.<br>Ez engedélyezi a meglévő titkosított mappák szinkronizációját. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + A hitelesített kiszolgálókérés át lett irányítva ide: „%1”. A webcím hibás, a kiszolgáló rosszul van beállítva. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + A hozzáférést megtagadta a kiszolgáló. Annak ellenőrzéséhez, hogy a megfelelő hozzáféréssel rendelkezik, <a href="%1">kattintson ide</a> a szolgáltatás böngészőből történő eléréséhez. + + + + There was an invalid response to an authenticated WebDAV request + Érvénytelen válasz érkezett a hitelesített WebDAV kérésre @@ -799,7 +846,7 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. OCC::ActivityListModel - + For more activities please open the Activity app. További tevékenységekhez nyissa meg a Tevékenységek alkalmazást. @@ -809,12 +856,12 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. Tevékenységek lekérése… - + Fetching activities … Tevékenységek lekérése… - + Files from the ignore list as well as symbolic links are not synced. A mellőzési listából származó fájlok, valamint a szimbolikus linkek nincsenek szinkronizálva. @@ -865,32 +912,59 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. OCC::Application - + Continuing will mean <b>deleting these settings</b>. A folytatás azt jelenti, hogy <b>törli ezeket a beállításokat</b>. - + Continuing will mean <b>ignoring these settings</b>. A folytatás azt jelenti, hogy <b>figyelmen kívül hagyja ezeket a beállításokat</b>. - + 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>. Néhány beállítást a kliens újabb verzióiban konfiguráltak, és olyan funkciókat használnak, amelyek ebben a verzióban nem érhetők el. <br> <br>%1<br><br>Az aktuális konfigurációs fájlról már készült biztonsági másolat: <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Kilépés - + Continue Folytatás - + Error accessing the configuration file Hiba a konfigurációs fájl elérésekor @@ -900,12 +974,12 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. Hiba történt a következő konfigurációs fájl elérésekor: %1. Győződjön meg róla, hogy a fájlt eléri a felhasználója. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Hiba történt a következő konfigurációs fájl elérésekor: %1. Győződjön meg róla, hogy a fájlt eléri a rendszerfiók. - + Quit %1 %1 kilépés @@ -951,56 +1025,216 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. A(z) %1 fájl módosítási ideje érvénytelen. Ne töltse fel a kiszolgálóra. - + File Removed (start upload) %1 Fájl eltávolítva (feltöltés indítása) %1 - + File %1 has invalid modification time. Do not upload to the server. A(z) %1 fájl módosítási ideje érvénytelen. Ne töltse fel a kiszolgálóra. - + Local file changed during syncing. It will be resumed. A helyi fájl megváltozott a szinkronizálás során. Folytatva lesz. - - + + Local file changed during sync. A helyi fájl megváltozott szinkronizálás közben. - + Network error: %1 Hálózati hiba: %1 - + Error updating metadata: %1 Hiba a metaadatok frissítésekor: %1 - + The file %1 is currently in use A(z) %1 fájl épp használatban van - + The local file was removed during sync. A helyi fájl el lett távolítva szinkronizálás közben. - + Restoration failed: %1 Helyreállítás sikertelen: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Hiba a metaadatok adatbázisba írásakor @@ -1018,12 +1252,12 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. Adja meg a végpontok közötti titkosítási jelmondatát:<br><br>Felhasználó: %2<br>Fiók: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Adja meg a végpontok közötti titkosítási jelmondatát:<br><br>Felhasználónév: %2<br>Fiók: %3<br> - + Enter E2E passphrase Adja meg az E2E jelmondatot @@ -1199,8 +1433,8 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Kiszolgálóhiba: A PROPFIND válasz nem XML formátumú! @@ -1208,27 +1442,27 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Hiba történt a(z) %1 könyvtár megnyitásakor - + Directory not accessible on client, permission denied A könyvtár nem érhető el a kliensen, az engedély megtagadva - + Directory not found: %1 A könyvtár nem található: %1 - + Filename encoding is not valid A fájlnév kódolása érvénytelen - + Error while reading directory %1 Hiba történt a(z) %1 könyvtár olvasása során @@ -1236,91 +1470,91 @@ Ez a művelet megszakítja a jelenleg futó szinkronizálást. OCC::EditLocallyJob - + Invalid token received. Érvénytelen token. - - - - - - + + + + + + Please try again. Próbálja újra. - + Invalid file path was provided. Érvénytelen fájlútvonal lett megadva. - + Could not find an account for local editing. Nem található fiók a helyi szerkesztéshez. - - + + Could not validate the request to open a file from server. Nem sikerült ellenőrizni a kiszolgálón lévő fájl megnyitására vonatkozó kérést. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Nem található fájl a helyi szerkesztéshez. Győződjön meg róla, hogy az útvonala helyes, és helyben szinkronizált-e. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Nem található fájl a helyi szerkesztéshez. Győződjön meg róla, hogy nem zárja-e ki a szelektív szinkronizáció. - + Server error: PROPFIND reply is not XML formatted! - + Kiszolgálóhiba: A PROPFIND válasz nem XML formátumú! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Nem található a távoli fájl a helyi szerkesztéshez. Győződjön meg róla, hogy az útvonala helyes. - + Could not open %1 - + A(z) %1 nem nyitható meg. - + File %1 already locked. - + A(z) %1 fájl már zárolva van. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + A zárolás %1 percig fog tartani. Kézzel is feloldhatja a fájlt, amint befejezte a szerkesztést. - + File %1 now locked. - + A(z) %1 fájl most zárolva van. - + File %1 could not be locked. - + A(z) %1 fájl nem zárolható. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Nem sikerült előállítani a metaadatokat a titkosításhoz. A mappa feloldásra kerül. @@ -1450,145 +1684,145 @@ Ezt a problémát valószínűleg az OpenSSL programkönyvtárakban kell keresni OCC::Folder - + Local folder %1 does not exist. A(z) %1 helyi mappa nem létezik. - + %1 should be a folder but is not. A(z) %1 könyvtár kellene legyen, de nem az. - + %1 is not readable. A(z) %1 nem olvasható. - + %1 and %n other file(s) have been removed. A(z) %1 és %d további fájl törölve.A(z) %1 és %d további fájl törölve. - + %1 has been removed. %1 names a file. A(z) %1 sikeresen eltávolítva. - + %1 and %n other file(s) have been added. A(z) %1 és %n további fájl hozzáadva.A(z) %1 és %n további fájl hozzáadva. - + %1 has been added. %1 names a file. %1 hozzáadva. - + %1 and %n other file(s) have been updated. A(z) %1 és %n további fájl feltöltve.A(z) %1 és %n további fájl feltöltve. - + %1 has been updated. %1 names a file. A(z) %1 sikeresen feltöltve. - + %1 has been renamed to %2 and %n other file(s) have been renamed. A(z) %1 átnevezve erre: %2, és még %n további fájl lett átnevezve.A(z) %1 átnevezve erre: %2, és még %n további fájl lett átnevezve. - + %1 has been renamed to %2. %1 and %2 name files. A(z) %1 átnevezve erre: %2. - + %1 has been moved to %2 and %n other file(s) have been moved. A(z) %1 áthelyezve ide: %2, és még %n további fájl áthelyezve.A(z) %1 áthelyezve ide: %2, és még %n további fájl áthelyezve. - + %1 has been moved to %2. A(z) %1 áthelyezve ide: %2. - + %1 has and %n other file(s) have sync conflicts. A(z) %1 és %n további fájl szinkronizálási ütközéssel rendelkezik.A(z) %1 és %n további fájl szinkronizálási ütközéssel rendelkezik. - + %1 has a sync conflict. Please check the conflict file! A(z) %1 fájl szinkronizálási ütközéssel rendelkezik. Ellenőrizze az ütközési fájlt! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. A(z) %1 és %n további fájl hibák miatt nem szinkronizálható. Bővebb információk a naplófájlban.A(z) %1 és %n további fájl hibák miatt nem szinkronizálható. Bővebb információk a naplófájlban. - + %1 could not be synced due to an error. See the log for details. A(z) %1 hiba miatt nem szinkronizálható. Bővebb információk a naplófájlban. - + %1 and %n other file(s) are currently locked. A(z) %1 és %n további fájl zárolt.A(z) %1 és %n további fájl zárolt. - + %1 is currently locked. A(z) %1 jelenleg zárolt. - + Sync Activity Szinkronizálási tevékenység - + Could not read system exclude file Nem lehetett beolvasni a rendszer kizárási fájlját - + A new folder larger than %1 MB has been added: %2. Egy %1 MB méretet meghaladó mappa lett hozzáadva: %2. - + A folder from an external storage has been added. Egy külső tárolóból származó mappa lett hozzáadva. - + Please go in the settings to select it if you wish to download it. A beállításoknál válassza ki, ha le szeretné tölteni. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. A(z) %1 mappa létre lett hozva, de előzőleg ki lett hagyva a szinkronizálásból. A benne lévő adatok nem lesznek szinkronizálva. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. A(z) %1 fájl létre lett hozva, de előzőleg ki lett hagyva a szinkronizálásból. Nem lesz szinkronizálva. - + 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). @@ -1601,7 +1835,7 @@ Ez azt jelenti, hogy a szinkronizációs kliens lehet, hogy nem fogja azonnal fe %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ Ha úgy dönt, hogy visszaállítja a fájlokat, akkor újra fel lesznek töltve Ha úgy dönt, hogy törli ezeket a fájlokat, akkor többé nem fogja azokat elérni, hacsak nem Ön a tulajdonos. - + 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. @@ -1621,17 +1855,17 @@ Biztos, hogy szinkronizálni akarja ezeket a változásokat a kiszolgálóval? Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor újra letöltésre kerülnek a kiszolgálóról. - + Remove All Files? Eltávolítja az összes fájlt? - + Remove all files Összes fájl eltávolítása - + Keep files Fájlok megtartása @@ -1667,22 +1901,22 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor OCC::FolderMan - + Could not reset folder state A mappa állapotát nem lehet visszállítani - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Egy régi szinkronizálási naplófájl található: „%1”, de az nem törölhető. Győződjön meg róla, hogy jelenleg egy alkalmazás sem használja. - + (backup) (biztonsági mentés) - + (backup %1) (biztonsági mentés: %1) @@ -1692,27 +1926,27 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor Ismeretlen állapot. - + Undefined state. Nem definiált állapot. - + Waiting to start syncing. Várakozás a szinkronizálás elindítására. - + Preparing for sync. Előkészítés a szinkronizáláshoz. - + Sync is running. A szinkronizálás fut. - + Sync finished with unresolved conflicts. A szinkronizálás befejeződött, feloldatlan ütközések vannak. @@ -1732,62 +1966,62 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor Felhasználó megszakította. - + Last sync was successful. A legutolsó szinkronizálás sikeres volt. - + Setup error. Beállítási hiba. - + Sync request was cancelled. Szinkronizálási kérés megszakítva. - + Sync is paused. Szinkronizálás megállítva. - + %1 (Sync is paused) %1 (szinkronizálás megállítva) - + No valid folder selected! Nincs érvényes mappa kiválasztva! - + The selected path does not exist! A kiválasztott útvonal nem létezik! - + The selected path is not a folder! A kiválasztott elérési út nem mappa! - + You have no permission to write to the selected folder! Nincs joga a kiválasztott mappa írásához! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! A(z) %1 helyi mappa már tartalmaz olyan mappát, amely mappa szinkronizálási kapcsolathoz használt. Válasszon egy másikat. - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! A(z) %1 helyi mappa már egy olyan mappában van, amely mappa szinkronizálási kapcsolathoz használt. Válasszon egy másikat. - + There is already a sync from the server to this local folder. Please pick another local folder! Már van egy szinkronizálási mappa a kiszolgálóról ebben a helyi mappában. Válasszon egy másik mappát. @@ -1800,7 +2034,7 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor Mappa szinkronizálási kapcsolat hozzáadása - + File Fájl @@ -1808,152 +2042,156 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor OCC::FolderStatusModel - + You need to be connected to add a folder A mappa hozzáadásához kapcsolódnia kell - + Click this button to add a folder to synchronize. Kattintson erre a gombra egy szinkronizálandó mappa hozzáadásához. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Hiba történt a kiszolgálón levő mappák listájának betöltésekor. - + Fetching folder list from server … Mappalista letöltése a kiszolgálóról… - + There are unresolved conflicts. Click for details. Feloldatlan ütközések vannak. Kattintson a részletekért. - + Virtual file support is enabled. A virtuális fájl támogatás engedélyezett. - + Signed out Kijelentkezve - + Synchronizing VirtualFiles with local folder A VirtualFiles szinkronizálása a helyi mappával - + Synchronizing with local folder Szinkronizálás a helyi mappával - + Checking for changes in remote "%1" Változások keresése a(z) „%1” távoli mappában - + Checking for changes in local "%1" Változások keresése a(z) „%1” helyi mappában - + Reconciling changes Változások egyeztetése - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" %1 szinkronizálása - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) letöltés: %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) feltöltés: %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 / %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Néhány másodperc van hátra, %1 / %2, %3 / %4 fájl - + %5 left, %1 of %2, file %3 of %4 %5 van hátra, %1 / %2, %3 / %4 fájl - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 / %2, %3 / %4 fájl - + file %1 of %2 %1 / %2 fájl - + Waiting … Várakozás ... - + Waiting for %n other folder(s) … Várakozás %n további mappára…Várakozás %n további mappára… - + Preparing to sync … Felkészülés a szinkronizálásra… @@ -2184,13 +2422,13 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor - + stable stabil - + beta béta @@ -2242,32 +2480,32 @@ Ha ez véletlen volt, és úgy dönt, hogy megtartja ezeket a fájlokat, akkor - + Create Debug Archive Hibakeresési archívum létrehozása - + Server notifications that require attention. Kiszolgálóértesítések, melyek a figyelmét kérik. - + Show call notification dialogs. Hívásértesítési párbeszédablakok megjelenítése. - + You cannot disable autostart because system-wide autostart is enabled. Az automatikus indítást nem tilthatja le, mert az egész rendszerre kiterjedő automatikus indítás engedélyezett. - + Change update channel? Módosítja a frissítési csatornát? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Ne feledje, hogy ez csak azt választja ki, hogy a frissítések milyen készletből származnak, és hogy régebbi verzióra nem lehet visszaállni: tehát a béta csatornáról a stabil csatornára való visszatérés általában nem azonnali, vagyis várni kell egy stabil verzióra, amely újabb, mint a jelenleg telepített béta változat. - + Change update channel Frissítési csatorna módosítása - + Cancel Mégse - + Zip Archives Zip archívumok - + Debug Archive Created Hibakeresési archívum létrehozva - + Debug archive is created at %1 A hibakeresési archívum itt lett létrehozva: %1 @@ -2304,22 +2542,22 @@ Ne feledje, hogy ez csak azt választja ki, hogy a frissítések milyen készlet OCC::GetOrCreatePublicLinkShare - + Password for share required A megosztáshoz jelszó szükséges - + Please enter a password for your link share: Adjon meg egy jelszót a megosztási hivatkozásához: - + Sharing error Megosztási hiba - + Could not retrieve or create the public link share. Error: %1 @@ -2557,6 +2795,11 @@ Ahol a törlés engedélyezett, ott az elemek törölve lesznek, ha megakadályo Close Bezárás + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2893,60 +3136,60 @@ Ne feledje, hogy a naplózás parancssori kapcsolóinak használata felülbírá - + Use &virtual files instead of downloading content immediately %1 &Virtuális fájlok használata a tartalom azonnali letöltése helyett %1 - + (experimental) (kísérleti) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. A virtuális fájlok nem támogatottak a windowsos partíciók gyökerében helyi mappaként. Válasszon érvényes almappát a meghajtó betűjele alatt. - + %1 folder "%2" is synced to local folder "%3" A(z) „%2” %1 mappa szinkronizálva van a(z) „%3” helyi mappába - + Sync the folder "%1" A(z) „%1” mappa szinkronizálása - + Warning: The local folder is not empty. Pick a resolution! Figyelem: A helyi mappa nem üres. Válasszon egy megoldást! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 szabad hely - + Virtual files are not available for the selected folder A virtuális fájlok nem érhetők el a kiválasztott mappához - + Local Sync Folder Helyi szinkronizálási mappa - - + + (%1) (%1) - + There isn't enough free space in the local folder! Nincs elég szabad hely a helyi mappában. @@ -3018,7 +3261,8 @@ Ne feledje, hogy a naplózás parancssori kapcsolóinak használata felülbírá OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 A(z) %1 ütköző fájl módosítási idejének lekérése lehetetlen @@ -3050,144 +3294,144 @@ Ne feledje, hogy a naplózás parancssori kapcsolóinak használata felülbírá OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Sikeresen kapcsolódott ehhez: %1: %2 %3 verzió (%4)</font><br/><br/> - + Invalid URL Érvénytelen URL - + Failed to connect to %1 at %2:<br/>%3 A kapcsolódás sikertelen ehhez: %1, itt: %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Időtúllépés az ehhez kapcsolódás közben: %1, itt: %2. - + Trying to connect to %1 at %2 … Kapcsolódási kísérlet ehhez: %1, itt: %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. A hitelesített kiszolgálókérés át lett irányítva ide: „%1”. Az URL hibás, a kiszolgáló rosszul van beállítva. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. A hozzáférést megtagadta a kiszolgáló. Annak ellenőrzéséhez, hogy a megfelelő hozzáféréssel rendelkezik, <a href="%1">kattintson ide</a> a szolgáltatás böngészőből történő eléréséhez. - + There was an invalid response to an authenticated WebDAV request Érvénytelen válasz érkezett a hitelesített WebDAV kérésre - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> A helyi %1 mappa már létezik, állítsa be a szinkronizálását.<br/><br/> - + Creating local sync folder %1 … A(z) %1 helyi szinkronizálási mappa létrehozása… - + OK OK - + failed. sikertelen. - + Could not create local folder %1 A(z) %1 helyi mappa nem hozható létre - + No remote folder specified! Nincs távoli mappa megadva! - + Error: %1 Hiba: %1 - + creating folder on Nextcloud: %1 mappa létrehozása a Nextcloudon: %1 - + Remote folder %1 created successfully. A(z) %1 távoli mappa sikeresen létrehozva. - + The remote folder %1 already exists. Connecting it for syncing. A(z) %1 távoli mappa már létezik. Kapcsolódás a szinkronizáláshoz. - - + + The folder creation resulted in HTTP error code %1 A könyvtár létrehozása HTTP %1 hibakódot eredményezett - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> A távoli mappa létrehozása meghiúsult, mert a megadott hitelesítő adatok hibásak.<br/>Lépjen vissza, és ellenőrizze az adatait.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">A távoli mappa létrehozása sikertelen, valószínűleg azért, mert hibás hitelesítési adatokat adott meg.</font><br/>Lépjen vissza, és ellenőrizze az adatait.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. A távoli %1 mappa létrehozása meghiúsult, hibaüzenet: <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. A szinkronizálási kapcsolat a(z) %1 és a(z) %2 távoli mappa között létrejött. - + Successfully connected to %1! Sikeresen kapcsolódva ehhez: %1! - + Connection to %1 could not be established. Please check again. A kapcsolat a(z) %1 kiszolgálóval nem hozható létre. Ellenőrizze újra. - + Folder rename failed A mappa átnevezése nem sikerült - + Cannot 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. Nem távolíthatja el és készíthet biztonsági másolatot egy mappáról, mert a mappa, vagy egy benne lévő fájl meg van nyitva egy másik programban. Zárja be a mappát vagy fájlt, és nyomja meg az újrapróbálkozást, vagy szakítsa meg a beállítást. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>A(z) %1 helyi szinkronizációs mappa sikeresen létrehozva.</b></font> @@ -3210,12 +3454,12 @@ Ne feledje, hogy a naplózás parancssori kapcsolóinak használata felülbírá Mégse - + Enable experimental feature? Engedélyezi a kísérleti funkciót? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3232,12 +3476,12 @@ Erre az üzemmódra váltás megszakítja a jelenleg futó szinkronizálást. Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nekünk a felmerülő problémákat. - + Enable experimental placeholder mode Kísérleti helykitöltő mód engedélyezése - + Stay safe Maradjon biztonságban @@ -3266,162 +3510,167 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. A szimbolikus linkek nem támogatottak a szinkronizálás során. - + File is listed on the ignore list. A fájl a mellőzési listán szerepel. - + File names ending with a period are not supported on this file system. A pontokkal végződő fájlneveket ez a fájlrendszer nem támogatja. - + File names containing the character "%1" are not supported on this file system. A(z) „%1” karaktert tartalmazó fájlnevek nem támogatottak ezen a fájlrendszeren. - + File name contains at least one invalid character A fájlnév legalább egy érvénytelen karaktert tartalmaz - + The file name is a reserved name on this file system. A fájlnév egy fenntartott név ezen a fájlrendszeren. - + Filename contains trailing spaces. A fájlnév záró szóközt tartalmaz. - + Filename contains leading spaces. A fájlnév kezdő szóközt tartalmaz. - + Filename contains leading and trailing spaces. A fájlnév kezdő és záró szóközt tartalmaz. - + Filename is too long. A fájlnév túl hosszú. - + File/Folder is ignored because it's hidden. A fájl/mappa figyelmen kívül hagyva, mert rejtett. - + Stat failed. Az elem kizárás vagy hiba miatt kihagyva. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Ütközés: A kiszolgáló verziója letöltve, a helyi példány átnevezve és nem lett feltöltve. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. A fájlnév nem kódolható a fájlrendszeren. - + The filename is blacklisted on the server. A fájlnév feketelistára került a kiszolgálón. - + File has extension reserved for virtual files. A fájlnak virtuális fájlok számára fenntartott kiterjesztése van. - + size méret - + permission jogosultság - + file id fájlazonosító - + Server reported no %1 Kiszolgáló jelentése: hiányzó %1 - + Cannot sync due to invalid modification time Az érvénytelen módosítási idő miatt nem lehet szinkronizálni - + Error while deleting file record %1 from the database Hiba történt a(z) %1 fájlrekord adatbázisból törlése során - + Conflict when uploading a folder. It's going to get cleared! Ütközés a mappa feltöltésekor. Törölve lesz! - + Conflict when uploading a file. It's going to get removed! Ütközés a fájl feltöltésekor. Törölve lesz! - + Ignored because of the "choose what to sync" blacklist A „válassza ki a szinkronizálni kívánt elemeket” feketelista miatt figyelmen kívül hagyva - + Not allowed because you don't have permission to add subfolders to that folder Nem engedélyezett, mert nincs engedélye almappák hozzáadásához az adott a mappához - + Not allowed because you don't have permission to add files in that folder Nem engedélyezett, mert nincs engedélye fájlok hozzáadására az adott mappában - + Not allowed to upload this file because it is read-only on the server, restoring Ezt a fájlt nem lehet feltölteni, mert csak olvasható a kiszolgálón, helyreállítás - + Moved to invalid target, restoring Érvénytelen célba mozgatás, helyreállítás - + Not allowed to remove, restoring Az eltávolítás nem engedélyezett, helyreállítás - + Error while reading the database Hiba történt az adatbázis olvasása során - + Server replied with an error while reading directory "%1" : %2 A kiszolgáló a következő hibával válaszolt a(z) „%1” könyvtár olvasása során: %2 @@ -3429,22 +3678,22 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::PropagateDirectory - + could not delete file %1 from local DB a(z) %1 fájl törlése a helyi adatbázisból nem sikerült - + Error updating metadata due to invalid modification time Az érvénytelen módosítási idő miatt hiba történt a metaadatok frissítése során - + Error updating metadata: %1 Hiba a metaadatok frissítésekor: %1 - + File is currently in use A fájl jelenleg használatban van @@ -3457,19 +3706,19 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek a(z) %1 fájl lekérése a helyi adatbázisból nem sikerült - + File %1 cannot be downloaded because encryption information is missing. A(z) %1 fájl nem tölthető le, mert hiányoznak a titkosítási információk. - - + + File has changed since discovery A fájl változott a felfedezése óta - + Could not delete file record %1 from local DB A(z) %1 fájlrekord törlése a helyi adatbázisból nem sikerült @@ -3480,32 +3729,32 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek A(z) %1 fájl nem tölthető le, mert ütközik egy helyi fájl nevével. - + File %1 can not be downloaded because of a local file name clash! A(z) %1 fájl nem tölthető le, mert ütközik egy helyi fájl nevével. - + The download would reduce free local disk space below the limit A letöltés a korlát alá csökkentené a szabad helyi tárterületet - + Free space on disk is less than %1 A lemezen lévő szabad hely kevesebb mint %1 - + File was deleted from server A fájl törlésre került a kiszolgálóról - + The file could not be downloaded completely. A fájl nem tölthető le teljesen. - + The downloaded file is empty, but the server said it should have been %1. A letöltött fájl üres, de a kiszolgáló szerint %1 méretűnek kellene lennie. @@ -3515,18 +3764,23 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek A(z) %1 fájl nem menthető, mert ütközik egy helyi fájl nevével. - - + + File %1 has invalid modified time reported by server. Do not save it. A(z) %1 fájl módosítási ideje a kiszolgáló szerint érvénytelen. Ne mentse el. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Hiba a metaadatok frissítésekor: %1 - + The file %1 is currently in use A(z) %1 fájl épp használatban van @@ -3547,7 +3801,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 a(z) %1 fájl nem törölhető, hiba: %2 @@ -3558,16 +3812,21 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 A(z) %1 mappa nem hozható létre - + Error updating metadata: %1 Hiba a metaadatok frissítésekor: %1 - + The file %1 is currently in use A(z) %1 fájl jelenleg használatban van @@ -3575,7 +3834,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash A(z) %1 nem távolítható el egy helyi fájl névütközése miatt @@ -3588,46 +3847,51 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash A(z) %1 fájl egy helyi fájl névütközése miatt nem nevezhető ár erre: %2, - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB a(z) %1 fájl lekérése a helyi adatbázisból nem sikerült - + Error setting pin state Hiba a tű állapotának beállításakor - - + + Error updating metadata: %1 Hiba a metaadatok frissítésekor: %1 - + The file %1 is currently in use A(z) %1 fájl épp használatban van - - + + Could not delete file record %1 from local DB A(z) %1 fájlrekord törlése a helyi adatbázisból nem sikerült - + Failed to propagate directory rename in hierarchy A könyvtár átnevezésének átvezetése a hierarchiában sikertelen - + Failed to rename file A fájl átnevezése sikertelen @@ -3648,7 +3912,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". A kiszolgáló helytelen HTTP-kódot adott vissza. 204-et várt, de az érték "%1 %2" volt. @@ -3661,12 +3925,12 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek A kiszolgáló hibás HTTP kódot adott vissza. 201-es kód várt, de ez érkezett: „%1 %2”. - + Error writing metadata to the database: %1 Hiba a metaadatok adatbázisba írásakor: %1 - + The file %1 is currently in use A(z) %1 fájl épp használatban van @@ -3674,42 +3938,42 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 A(z) %1 nem nevezhető át erre: %2, hiba: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". A kiszolgáló hibás HTTP kódot adott vissza. 201-es kód várt, de ez érkezett: „%1 %2”. - + could not get file %1 from local DB a(z) %1 fájl lekérése a helyi adatbázisból nem sikerült - + Could not delete file record %1 from local DB A(z) %1 fájlrekord törlése a helyi adatbázisból nem sikerült - + Error updating metadata: %1 Hiba a metaadatok frissítésekor: %1 - + The file %1 is currently in use A(z) %1 fájl jelenleg használatban van - + Error setting pin state Hiba a tű állapotának beállításakor - + Error writing metadata to the database Hiba a metaadatok adatbázisba írásakor @@ -3899,7 +4163,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::ServerNotificationHandler - + Reply Válasz @@ -3917,23 +4181,23 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Beállítások - + %1 Settings This name refers to the application name e.g Nextcloud %1 beállítások - + General Általános - + Network Hálózat - + Account Fiók @@ -3941,17 +4205,22 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::ShareModel - + Share link Megosztási hivatkozás - + Link share Megosztás hivatkozása - + + Internal link + Belső hivatkozás + + + Enter a note for the recipient Adjon meg egy megjegyzést a címzett számára @@ -4027,7 +4296,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4036,132 +4305,171 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::SocketApi - + + Failed to encrypt folder at "%1" + A következő helyen lévő mappa titkosítása sikertelen: „%1” + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + A(z) %1 fióknál nincs beállítva a végpontok közti titkosítás. A mappatitkosítás engedélyezéséhez állítsa be a fiókbeállításaiban. + + + + Failed to encrypt folder + A mappa titkosítása sikertelen + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Nem sikerült a következő mappa titkosítása: „%1”. + +A kiszolgáló hibával válaszolt: %2 + + + + Folder encrypted successfully + A mappa sikeresen titkosítva + + + + The following folder was encrypted successfully: "%1" + A következő mappa sikeresen titkosítva lett: „%1” + + + Context menu share Megosztás a helyi menüből - + Select new location … Új hely kiválasztása… - + I shared something with you Megosztottam Önnel valamit - - + + Share options Megosztási beállítások - - + + Activity Tevékenység - + Copy private link to clipboard Személyes hivatkozás másolása a vágólapra - + Send private link by email … Személyes hivatkozás küldése e-mailben… + + + Expire in %1 minutes + remaining time before lock expire + %1 perc múlva lejár%1 perc múlva lejár + - + Leave this share Megosztás elhagyása - + Resharing this file is not allowed Ezt a fájlt nem lehet újra megosztani - + Resharing this folder is not allowed A mappa továbbosztása nem megengedett - - + + Copy public link Nyilvános hivatkozás másolása - + Copy internal link Belső hivatkozás másolása - + + Encrypt + Titkosítás + + + Lock file Fájl zárolása - + Unlock file Fájl feloldása - + Locked by %1 %1 zárolta - - Expire in %1 minutes - remaining time before lock expire - %1 perc múlva lejár%1 perc múlva lejár - - - + Expires in %1 minutes remaining time before lock expires %1 perc múlva lejár%1 perc múlva lejár - + Edit Szerkesztés - + Open in browser Megnyitás böngészőben - + Resolve conflict … Konfliktus feloldása… - + Move and rename … Áthelyezés és átnevezés… - + Move, rename and upload … Áthelyezés, átnevezés és feltöltés… - + Delete local changes Helyi módosítások törlése - + Move and upload … Áthelyezés és feltöltés… - + Delete Törlés @@ -4379,63 +4687,63 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (egy korábbi hiba miatt kihagyva, újrapróbálkozás %s múlva) - + Could not update file: %1 Nem sikerült frissíteni a fájlt: %1 - + Could not update virtual file metadata: %1 Nem sikerült frissíteni a virtuális fájl metaadatait: %1 - + Could not update file metadata: %1 Nem sikerült frissíteni a fájl metaadatait: %1 - + Could not set file record to local DB: %1 A fájlrekord beállítása a helyi adatbázisban nem sikerült: %1 - + Unresolved conflict. Nem feloldott ütközés. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Csak %1 érhető el, de legalább %2 kell az indításhoz - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. A helyi szinkronizálási adatbázis nem nyitható meg, vagy nem hozható létre. Győződjön meg róla, hogy rendelkezik-e írási joggal a szinkronizálási mappán. - + Using virtual files with suffix, but suffix is not set Virtuális fájlok használata utótaggal, de az utótag nincs beállítva - + Unable to read the blacklist from the local database Nem lehet kiolvasni a tiltólistát a helyi adatbázisból - + Unable to read from the sync journal. Nem lehet olvasni a szinkronizálási naplóból. - + Cannot open the sync journal A szinkronizálási napló nem nyitható meg @@ -4445,12 +4753,12 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek A szinkronizálás rövidesen folytatódik. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Túl kevés a tárterület: A letöltések, melyek %1 alá csökkentették volna a szabad tárhelyet, kihagyásra kerültek. - + There is insufficient space available on the server for some uploads. Egyes feltöltésekhez nincs elég hely a kiszolgálón. @@ -4519,59 +4827,59 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::Systray - + Download Letöltés - + Add account Fiók hozzáadása - + Open main dialog Főablak megnyitása - - + + Pause sync Szinkronizálás felfüggesztése - - + + Resume sync Szinkronizálás folytatása - + Settings Beállítások - + Help Súgó - + Exit %1 Kilépés a %1ból - + Pause sync for all Szinkronizálás szüneteltetése mindenkinek - + Resume sync for all Szinkronizálás folytatása mindenkinek - + %1: %2 %1: %2 @@ -4579,24 +4887,24 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 asztali kliens</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Verzió: %1. További információkért kattintson <a href='%2'>ide</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Virtuális fájlok bővítmény használata: %1</small></p> - + <p>This release was supplied by %1</p> <p>Ezt a kiadást a %1 biztosította</p> @@ -4604,22 +4912,22 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. A szolgáltatók lekérése sikertelen - + Failed to fetch search providers for '%1'. Error: %2 A(z) „%1” keresésszolgáltatóinak lekérése sikertelen. Hiba: %2 - + Search has failed for '%2'. A keresés a következőre sikertelen: „%2”. - + Search has failed for '%1'. Error: %2 A keresés a következőre sikertelen: „%1”. Hiba: %2 @@ -4627,30 +4935,36 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::User - + Retry all uploads Összes feltöltés újrapróbálása + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Fiók törlésének megerősítése - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Biztos, hogy eltávolítja a kapcsolatot a(z) <i>%1</i> fiókkal?</p><p><b>Megjegyzés:</b> Ez <b>nem</b> töröl fájlokat.</p> - + Remove connection Kapcsolat eltávolítása - + Cancel Mégse @@ -4788,8 +5102,8 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Az érvénytelen módosítási idő miatt hiba történt a metaadatok frissítése során @@ -4797,8 +5111,8 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Az érvénytelen módosítási idő miatt hiba történt a metaadatok frissítése során @@ -4896,123 +5210,123 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek OCC::ownCloudGui - + Unsupported Server Version Nem támogatott kiszolgálóverzió - + 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. A(z) %1 fiók kiszolgálója nem támogatott verziót (%2) futtat. Ennek a kliensnek a nem támogatott kiszolgálóverziókkal történő használata nem tesztelt és potenciálisan veszélyes. Folytatás kizárólag saját felelősségére. - + Disconnected Kapcsolat bontva - + Disconnected from some accounts Kapcsolat bontva néhány fióknál - + Disconnected from %1 Kapcsolat bontva a %1dal - + Disconnected from accounts: Kapcsolat bontva a fiókokkal: - + Account %1: %2 %1 fiók: %2 - + Please sign in Jelentkezzen be - + Signed out Kijelentkezve - + Account synchronization is disabled Fiók szinkronizálás letiltva - - + + Synchronization is paused Szinkronizálás szüneteltetve - + Folder %1: %2 %1 mappa: %2 - + Unresolved conflicts Nem feloldott ütközések - + Up to date Naprakész - + Error during synchronization Hiba a szinkronizáláskor - + There are no sync folders configured. Nincsenek szinkronizálandó mappák beállítva. - + No sync folders configured Nincs szinkronizációs könyvtár beállítva - + Checking for changes in remote "%1" Változások keresése a(z) „%1” távoli mappában - + Checking for changes in local "%1" Változások keresése a(z) „%1” helyi mappában - + Syncing %1 of %2 (%3 left) %1 / %2 szinkronizálása (%3 maradt) - + Syncing %1 of %2 %1 / %2 szinkronizálása - + Syncing %1 (%2 left) %1 szinkronizálása (%2 maradt) - + Syncing %1 %1 szinkronizálása - + %1 (%2, %3) %1 (%2, %3) @@ -5164,27 +5478,27 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Új mappa - + You renamed %1 Átnevezte: %1 - + You deleted %1 Törölte: %1 - + You created %1 Létrehozta: %1 - + You changed %1 Megváltoztatta: %1 - + Synced %1 Szinkronizálta: %1 @@ -5250,30 +5564,106 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Megjelölés olvasottként + + ShareDelegate + + + Create a new share link + Új megosztási hivatkozás létrehozása + + + + Copy share link location + Megosztási hivatkozás helyének másolása + + + + Share options + Megosztási beállítások + + + + ShareDetailsPage + + + An error occurred setting the share password. + Hiba történt a megosztási jelszó beállítása során. + + + + Edit share + Megosztás szerkesztése + + + + Dismiss + Eltüntetés + + + + Share label + Megosztás címkéje + + + + Allow editing + Szerkesztés engedélyezése + + + + Password protect + Jelszavas védelem + + + + Set expiration date + Lejárati idő beállítása + + + + Note to recipient + Jegyzet a címzettnek + + + + Unshare + Megosztás visszavonása + + + + Add another link + További hivatkozás hozzáadása + + + + Copy share link + Megosztási hivatkozás másolása + + ShareView - + Password required for new share Jelszó szükséges az új megosztáshoz - + Share password Megosztás jelszava - + Sharing is disabled Megosztás letiltva - + This item cannot be shared. Ez az elem nem osztható meg. - + Sharing is disabled. A megosztás le van tiltva. @@ -5289,7 +5679,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek SyncJournalDb - + Failed to connect database. Az adatbázishoz való kapcsolódás sikertelen. @@ -5347,6 +5737,22 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek További találatok betöltése + + UnifiedSearchResultNothingFound + + + No results for + Nincs találat a következőre: + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Keresési találatok %1 szakasza + + UserLine @@ -5410,67 +5816,67 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek UserStatusSelector - + Online status Online állapot - + Online Online - + Away Távol - + Do not disturb Ne zavarjanak - + Mute all notifications Összes értesítés némítása - + Invisible Láthatatlan - + Appear offline Megjelenés nem kapcsolódottként - + Status message Állapotüzenet - + What is your status? Mi az állapota? - + Clear status message after Állapotüzenet törlése ennyi idő után: - + Cancel Mégse - + Clear status message Állapotüzenet törlése - + Set status message Állapotüzenet beállítása @@ -5554,24 +5960,24 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Window - + Nextcloud desktop main dialog A Nextcloud asztali alkalmazás főablaka - + Current account Jelenlegi fiók - - + + Resume sync for all Szinkronizálás folytatása mindenkinek - - + + Pause sync for all Szinkronizálás szüneteltetése mindenkinek @@ -5581,22 +5987,22 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Felhasználó állapotának beállítása - + Add account Fiók hozzáadása - + Add new account Új fiók hozzáadása - + Settings Beállítások - + Exit Kilépés @@ -5605,11 +6011,6 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Current user avatar Jelenlegi felhasználói profilkép - - - Current account avatar - Jelenlegi fiókprofilkép - Current user status is online @@ -5621,70 +6022,75 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek Jelenlegi felhasználói állapot: ne zavarjanak - + + Current account avatar + Jelenlegi fiókprofilkép + + + Current account status is online Jelenlegi fiókállapot: online - + Current account status is do not disturb Jelenlegi fiókállapot: ne zavarjanak - + + %1 - File activity + %1 – Fájl tevékenység + + + Account switcher and settings menu Fiókváltó és beállítások menü - + Open local folder of current account A jelenlegi fiók helyi mappájának megnyitása - + Connected Kapcsolódva - + Disconnected Kapcsolat bontva - + Open Nextcloud Talk in browser A Nextcloud Beszélgetés alkalmazás megnyitása böngészőben - + More apps További alkalmazások - + Open %1 in browser A(z) %1 megnyitása böngészőben - + Unified search results list Egyesített keresési találatlista - - - %1 - File activity - %1 – Fájl tevékenység - main.cpp - + System Tray not available Nem érhető el értesítési terület - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. A(z) %1 használatához működő értesítési területre van szükség. Ha XFCE-t használ, akkor kövesse <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">ezt az útmutatót</a>. Egyébként, telepítsen egy értesítési terület alkalmazást – mint például a „trayer” – és próbálja újra. @@ -5692,7 +6098,7 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Összeállítva a(z) <a href="%1">%2</a> Git verzióból, ekkor: %3, %4, Qt %5 (%6) használatával</small></p> @@ -5726,72 +6132,77 @@ Ez egy új, kísérleti mód. Ha úgy dönt, hogy használja, akkor jelezze nek + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Törölve - + Moved to %1 Áthelyezve ide: %1 - + Ignored Kihagyva - + Filesystem access error Fájlrendszer hozzáférési hiba - + Error Hiba - + Updated local metadata Helyi metaadatok frissítve - + Unknown Ismeretlen - + downloading letöltés - + uploading feltöltés - + deleting törlés - + moving áthelyezés - + ignoring kihagyás - + error hiba - + updating local metadata helyi metaadatok frissítése diff --git a/translations/client_id.ts b/translations/client_id.ts index 9d47d0467..d51925248 100644 --- a/translations/client_id.ts +++ b/translations/client_id.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Memindahkan tempat sampat tidak diimplementasikan pada platform ini - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Batal @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Belum ada akun terkonfigurasi - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Hidupkan enkripsi - + + End-to-end encryption has been enabled for this account + + + + Warning Peringatan - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Buka folder - + Encrypt Enkrip - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Pilih apa yang akan disinkron - + Force sync now Paksa sinkronisasi sekarang - + Restart sync Ulang sinkronisasi - + Resume sync Lanjutkan sinkron - + Pause sync Jeda sinkron - + Remove folder sync connection Hapus koneksi sinkronisasi folder - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Pembuatan Folder gagal - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Konfirmasi Penghapusan Koneksi Sinkronisasi Folder - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p> Apakah Anda ingin menghentikan sinkronisasi folder <i>%1</i>?</p><p><b> Catatan:</b> Aksi ini tidak akan menghapus berkas apapun.</p> - + Remove Folder Sync Connection Hapus Koneksi Sinkronisasi Folder - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sinkronisasi berlangsung - + The syncing operation is running.<br/>Do you want to terminate it? Operasi sinkronisasi sedang berjalan. <br/>Apakah Anda ingin membatalkannya? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) dari %2 sedang digunakan. Beberapa folder, termasuk jaringan yang terpasang atau folder yang telah dibagikan, kemungkinan mempunyai beberapa keterbatasan. - + %1 of %2 in use %1 dari %2 sedang digunakan - + Currently there is no storage usage information available. Saat ini tidak ada informasi penggunaan ruang yang tersedia. - + %1 in use %1 digunakan - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Tersambung ke %1. - + Server %1 is temporarily unavailable. Peladen %1 sementara tidak tersedia. - + Server %1 is currently in maintenance mode. Peladen %1 sementara dalam moda pemeliharaan. - + Signed out from %1. Log keluar dari %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Mendapatkan autorisasi dari browser. <a href='%1'>Klik disini</a> untuk membuka ulang browser. - + Connecting to %1 … - + No connection to %1 at %2. Tidak ada koneksi ke %1 di %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. Tidak ada koneksi %1 yang dikonfigurasi. - + There are folders that were not synchronized because they are too big: Terdapat folder tidak tersinkronisasi karena terlalu besar: - + There are folders that were not synchronized because they are external storages: Terdapat folder tidak tersinkronisasi karena penyimpanan eksternal: - + There are folders that were not synchronized because they are too big or external storages: Terdapat folder tidak tersinkronisasi karena terlalu besar atau penyimpanan ekternal: - + Confirm Account Removal Konfirmasi pemutusan akun - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p> Apakah Anda ingin menghapus koneksi untuk akun <i> %1</i>?</p> <p><b> Catatan: </b> Aksi ini tidak akan menghapus berkas apapun.</p> - + Remove connection Hapus koneksi - - + This account supports end-to-end encryption Akun ini mendukung enkripsi end-to-end - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Galat saat mengakses berkas konfigurasi @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. Terdapat kesalahan saat mengakses berkas konfigurasi pada %1. Mohon untuk memastikan berkas dapat diakses oleh pengguna Anda. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Keluar dari %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Kesalahan saat menulis metadata ke database @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. Mohon untuk memasukkan kata sandi (passphrase) enkripsi end to end Anda: <br><br>Pengguna: %2<br>Akun: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Masukkan kata sandi (passphrase) E2E @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Tidak ditemukan folder lokal %1. - + %1 should be a folder but is not. %1 seharusnya sebuah folder namun ini bukan. - + %1 is not readable. %1 tidak dapat dibaca. - + %1 and %n other file(s) have been removed. %1 dan %n berkas lainnya telah dihapus. - + %1 has been removed. %1 names a file. %1 telah dihapus. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 dan %n berkas lainnya telah diperbaharui. - + %1 has been updated. %1 names a file. %1 telah diperbaharui. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 dan %n berkas lainnya telah dinamai ulang. - + %1 has been renamed to %2. %1 and %2 name files. %1 telah diubah namanya ke %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 telah dipindah ke %2 dan juga %n berkas lainnya telah dipindah. - + %1 has been moved to %2. %1 telah dipindah ke %2. - + %1 has and %n other file(s) have sync conflicts. %1 dan %n berkas lainnya mempunyai konflik sinkronisasi. - + %1 has a sync conflict. Please check the conflict file! %1 memiliki konflik sinkronisasi. Mohon cek kembali berkasnya! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 dan %n berkas lainnya tidak dapat disinkronisasi disebabkan kesalahan. Lihat catatan log untuk lebih lanjut. - + %1 could not be synced due to an error. See the log for details. %1 tidak dapat disinkronisasi disebabkan kesalahan. Lihat catatan log untuk lebih lanjut. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Aktivitas Sinkronisasi - + Could not read system exclude file Tidak dapat membaca berkas sistem yang dikecualikan - + A new folder larger than %1 MB has been added: %2. Sebuah folder baru lebih dari %1 MB telah ditambahkan: %2. - + A folder from an external storage has been added. Sebuah folder dari luar ruang penyimpanan telah ditambahkan. - + Please go in the settings to select it if you wish to download it. Mohon untuk ke pengaturan untuk memilihnya jika Anda ingin mengunduhnya. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Folder %1 telah dibuat namun dikecualikan dari sinkronisasi sebelumnya. Data yang ada di dalamnya tidak akan disinkronisasi. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Berkas %1 telah dibuat namun dikecualikan dari sinkronisasi sebelumnya. Data yang ada di dalamnya tidak akan disinkronisasi. - + 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). @@ -1592,7 +1826,7 @@ Ini artinya sinkronisasi klien mungkin tidak menggunggah perubahan lokal seseger %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1600,24 +1834,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? - + Remove all files - + Keep files @@ -1653,22 +1887,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Tidak dapat mereset keadaan folder - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (cadangan) - + (backup %1) (cadangkan %1) @@ -1678,27 +1912,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Kondisi Yang Tidak Ditentukan - + Undefined state. - + Waiting to start syncing. Menunggu untuk memulai sinkronisasi. - + Preparing for sync. Persiapan untuk sinkronisasi. - + Sync is running. Sinkronisasi sedang berjalan. - + Sync finished with unresolved conflicts. @@ -1718,62 +1952,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Pengguna Batalkan. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sinkronisasi dijeda. - + %1 (Sync is paused) %1 (Sinkronisasi dijeda) - + No valid folder selected! Tidak ada folder yang valid dipilih! - + The selected path does not exist! - + The selected path is not a folder! Jalur yang dipilih bukanlah sebuah folder! - + You have no permission to write to the selected folder! Anda tidak memiliki ijin untuk menulis ke folder yang dipilih! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Folder lokal %1 sudah terdapat sebuah folder yang digunakan di dalam sebuah koneksi sinkronisasi folder. Mohon pilih yang lainnya! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Folder lokal %1 sudah terdapat sebuah folder yang digunakan di dalam sebuah koneksi sinkronisasi folder. Mohon pilih yang lainnya! - + There is already a sync from the server to this local folder. Please pick another local folder! Sudah ada sinkronisasi dari server ke folder lokal ini. Mohon pilih folder lokal lainnya! @@ -1786,7 +2020,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Tambah Koneksi Sinkronisasi Folder - + File Berkas @@ -1794,152 +2028,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Anda diharuskan terhubung untuk menambahkan sebuah folder - + Click this button to add a folder to synchronize. Klik tombol ini untuk menambahkan sebuah folder untuk disinkronisasi. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Galat saat memuat daftar folder dari server. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Terdapat konflik yang belum diselesaikan. Klik untuk detilnya. - + Virtual file support is enabled. - + Signed out Telah keluar - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Mencocokkan perubahan - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Mensinkronisasi %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) unduhan %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) unggahan %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 dari %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Sisa %5, %1 dari %2, berkas ke %3 dari %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 dari %2, berkas ke %3 dari %4 - + file %1 of %2 Berkas %1 dari %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2170,13 +2408,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2228,59 +2466,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Notifikasi server yang memerlukan perhatian. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2288,22 +2526,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error Gagal berbagi - + Could not retrieve or create the public link share. Error: %1 @@ -2539,6 +2777,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Tutup + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2871,60 +3114,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Folder Sinkronisasi Lokal - - + + (%1) (%1) - + There isn't enough free space in the local folder! Tidak ada ruang bebas yang cukup di folder lokal! @@ -2996,7 +3239,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3028,144 +3272,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Sukses terhubung ke %1: %2 versi %3 (%4)</font><br/><br/> - + Invalid URL URL Tidak Valid - + Failed to connect to %1 at %2:<br/>%3 Gagal terhubung ke %1 di %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Waktu habis saat mencoba untuk menghubungkan ke %1 di %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Akses ditolak dari server. Untuk memverifikasi bahwa Anda memiliki akses yang benar, <a href="%1">klik disini</a> untuk akses ke layanan dengan peramban Anda. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Folder sinkronisasi lokal %1 sudah ada, mengatur untuk disinkronisasi.<br/><br/> - + Creating local sync folder %1 … - + OK - + failed. gagal. - + Could not create local folder %1 Tidak dapat membuat folder lokal %1 - + No remote folder specified! Tidak ada folder remote yang ditentukan! - + Error: %1 Galat: %1 - + creating folder on Nextcloud: %1 Membuat folder di Nextcloud: %1 - + Remote folder %1 created successfully. Folder remote %1 sukses dibuat. - + The remote folder %1 already exists. Connecting it for syncing. Folder remote %1 sudah ada. Menghubungkan untuk sinkronisasi. - - + + The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! - + Connection to %1 could not be established. Please check again. - + Folder rename failed - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> @@ -3188,12 +3432,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3204,12 +3448,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3238,162 +3482,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3401,22 +3650,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3429,19 +3678,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery - + Could not delete file record %1 from local DB @@ -3452,32 +3701,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 - + File was deleted from server - + The file could not be downloaded completely. - + The downloaded file is empty, but the server said it should have been %1. @@ -3487,18 +3736,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3519,7 +3773,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 @@ -3530,16 +3784,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3547,7 +3806,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3560,46 +3819,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3620,7 +3884,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3633,12 +3897,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3646,42 +3910,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database @@ -3871,7 +4135,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3889,23 +4153,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + %1 Settings This name refers to the application name e.g Nextcloud - + General - + Network - + Account @@ -3913,17 +4177,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3999,7 +4268,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4008,132 +4277,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you - - + + Share options - - + + Activity - + Copy private link to clipboard - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link Salin tautan publik - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Hapus @@ -4349,63 +4655,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal @@ -4415,12 +4721,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4489,59 +4795,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Tambah akun - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Setelan - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 @@ -4549,24 +4855,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4574,22 +4880,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4597,30 +4903,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4758,8 +5070,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4767,8 +5079,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4866,123 +5178,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version - + 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. - + Disconnected - + Disconnected from some accounts - + Disconnected from %1 - + Disconnected from accounts: - + Account %1: %2 - + Please sign in - + Signed out - + Account synchronization is disabled - - + + Synchronization is paused - + Folder %1: %2 - + Unresolved conflicts - + Up to date - + Error during synchronization - + There are no sync folders configured. - + No sync folders configured - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 - + Syncing %1 (%2 left) - + Syncing %1 - + %1 (%2, %3) @@ -5134,27 +5446,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5220,30 +5532,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5259,7 +5647,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5317,6 +5705,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5380,67 +5784,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb Jangan diganggu - + Mute all notifications Bisukan semua notifikasi - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message Tetapkan status pesan @@ -5524,24 +5928,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Akun sekarang - - + + Resume sync for all - - + + Pause sync for all @@ -5551,22 +5955,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Tetapkan status pengguna - + Add account Tambah akun - + Add new account - + Settings Setelan - + Exit @@ -5575,11 +5979,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5591,70 +5990,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Tersambung - + Disconnected Terputus - + Open Nextcloud Talk in browser - + More apps Aplikasi lainnya - + Open %1 in browser - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5662,7 +6066,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5696,72 +6100,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted - + Moved to %1 - + Ignored - + Filesystem access error - + Error Galat - + Updated local metadata - + Unknown - + downloading - + uploading - + deleting - + moving - + ignoring - + error galat - + updating local metadata diff --git a/translations/client_is.ts b/translations/client_is.ts index a2770f358..8ffdf6467 100644 --- a/translations/client_is.ts +++ b/translations/client_is.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -354,9 +364,9 @@ - - - + + + Cancel Hætta við @@ -401,12 +411,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -416,28 +426,28 @@ - + Do not encrypt folder - + Encrypt folder Dulrita möppu - + No account configured. Enginn aðgangur stilltur. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -446,18 +456,23 @@ Virkja dulritun - + + End-to-end encryption has been enabled for this account + + + + Warning Aðvörun - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -469,122 +484,122 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Opna möppu - + Encrypt Dulrita - - + + Edit Ignored Files Breyta hunsuðum skrám - - + + Create new folder - - + + Availability - + Choose what to sync Veldu það sem á að samstilla - + Force sync now Þvinga samstillingu núna - + Restart sync Endurræsa samstillingu - + Resume sync Halda samstillingu áfram - + Pause sync Gera hlé á samstillingu - + Remove folder sync connection Fjarlægja samstillingartengingu möppu - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Gerð möppu mistókst - + <p>Could not create local folder <i>%1</i>.</p> <p>Gat ekki búið til staðværa möppu <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Staðfesta fjarlægingu á samstillingartengingu möppu - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Viltu í alvörunni hætta að samstilla möppuna <i>%1</i>?</p><p><b>Athugið:</b> Þetta mun <b>ekki</b> eyða neinum skrám.</p> - + Remove Folder Sync Connection Fjarlægja samstillingartengingu möppu - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -593,7 +608,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -603,147 +618,179 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Samstilling er keyrandi - + The syncing operation is running.<br/>Do you want to terminate it? Aðgerðin sem samstillir er í gangi.<br/>Viltu stöðva hana? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) af %2 í notkun. Sumar möppur, þar með taldar netmöppur tengdar í skráakerfið eða sameignarmöppur, gætu verið með önnur takmörk. - + %1 of %2 in use %1 af %2 í notkun - + Currently there is no storage usage information available. Það eru engar upplýsingar um gagnamagn fáanlegar í augnablikinu. - + %1 in use %1 í notkun - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Tengdur við %1. - + Server %1 is temporarily unavailable. Þjónninn %1 er ekki tiltækur í augnablikinu. - + Server %1 is currently in maintenance mode. Þjónninn %1 er í viðhaldsham. - + Signed out from %1. Skráður út af %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1 … Tengist við %1 … - + No connection to %1 at %2. Engin tenging við %1 á %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. Engin %1 tenging skilgreind. - + There are folders that were not synchronized because they are too big: Það eru möppur sem ekki eru samstilltar því þær eru of stórar: - + There are folders that were not synchronized because they are external storages: Það eru möppur sem ekki eru samstilltar því þær ytri eru gagnageymslur: - + There are folders that were not synchronized because they are too big or external storages: Það eru möppur sem ekki eru samstilltar því þær eru of stórar eða eru ytri gagnageymslur: - + Confirm Account Removal Staðfesta fjarlægingu aðgangs - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Viltu í alvörunni fjarlægja tenginguna við aðganginn <i>%1</i>?</p><p><b>Athugið:</b> Þetta mun <b>ekki</b> eyða neinum skrám.</p> - + Remove connection Fjarlægja tengingu - - + This account supports end-to-end encryption Þessi aðgangur styður enda-í-enda dulritun - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ gagnageymslur: OCC::ActivityListModel - + For more activities please open the Activity app. @@ -808,12 +855,12 @@ gagnageymslur: - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -864,32 +911,59 @@ gagnageymslur: OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Villa við að nálgast stillingaskrána @@ -899,12 +973,12 @@ gagnageymslur: Það kom upp villa við að nálgast stillingaskrána á %1. Gakktu úr skugga um að notandinn hafi heimild til að vinna með skrána. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Hætta í %1 @@ -950,56 +1024,216 @@ gagnageymslur: - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Villa við ritun lýsigagna í gagnagrunninn @@ -1017,12 +1251,12 @@ gagnageymslur: Settu inn lykilorð fyrir enda-í-enda dulritun:<br><br>Notandi: %2<br>Aðgangur: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Settu inn EíE-lykilorð @@ -1196,8 +1430,8 @@ gagnageymslur: OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1205,27 +1439,27 @@ gagnageymslur: OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1233,83 +1467,83 @@ gagnageymslur: OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1317,7 +1551,7 @@ gagnageymslur: OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1446,147 +1680,147 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Staðvær mappa %1 er ekki til. - + %1 should be a folder but is not. %1 ætti að vera mappa en er það ekki. - + %1 is not readable. %1 er ekki lesanleg. - + %1 and %n other file(s) have been removed. %1 og %n skrá til viðbótar hafa verið fjarlægðar.%1 og %n skrár til viðbótar hafa verið fjarlægðar. - + %1 has been removed. %1 names a file. %1 hefur verið fjarlægð. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 og %n skrár til viðbótar hafa verið uppfærðar.%1 og %n skrár til viðbótar hafa verið uppfærðar. - + %1 has been updated. %1 names a file. %1 var uppfærð. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 var endurnefnd sem %2 og %n skrá til viðbótar var líka endurnefnd.%1 var endurnefnd sem %2 og %n skrár til viðbótar voru líka endurnefndar. - + %1 has been renamed to %2. %1 and %2 name files. %1 hefur verið endurnefnd sem %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 var færð í %2 og %n skrár til viðbótar voru líka færðar.%1 var færð í %2 og %n skrár til viðbótar voru líka færðar. - + %1 has been moved to %2. %1 hefur verið færð í %2. - + %1 has and %n other file(s) have sync conflicts. %1 og %n skrá til viðbótar eru með árekstra við samstillingu.%1 og %n skrár til viðbótar eru með árekstra við samstillingu. - + %1 has a sync conflict. Please check the conflict file! %1 er með árekstra við samstillingu. Skoðaðu yfirlitsskrána fyrir árekstra! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 og %n skrá til viðbótar var ekki hægt að samstilla vegna villu sem kom upp. Skoðaðu annálinn fyrir nánari upplýsingar.%1 og %n skrár til viðbótar var ekki hægt að samstilla vegna villu sem kom upp. Skoðaðu annálinn fyrir nánari upplýsingar. - + %1 could not be synced due to an error. See the log for details. %1 var ekki hægt að samstilla vegna villu sem kom upp Skoðaðu annálinn fyrir nánari upplýsingar. - + %1 and %n other file(s) are currently locked. %1 og %n skrár til viðbótar eru læstar.%1 og %n skrár til viðbótar eru læstar. - + %1 is currently locked. %1 er núna læst. - + Sync Activity Virkni samstillingar - + Could not read system exclude file Gat ekki lesið kerfisútilokunarskrána - + A new folder larger than %1 MB has been added: %2. Nýrri möppu stærri en %1 MB var bætt við: %2. - + A folder from an external storage has been added. Möppu úr ytri gagnageymslu var bætt við. - + Please go in the settings to select it if you wish to download it. Farðu í stillingarnar til að velja hana ef þú vilt sækja hana. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1595,7 +1829,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1603,24 +1837,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Fjarlægja allar skrár? - + Remove all files Fjarlægja allar skrár - + Keep files Halda skrám @@ -1656,22 +1890,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Gat ekki núllstillt stöðu á möppu - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (öryggisafrit) - + (backup %1) (öryggisafrita %1) @@ -1681,27 +1915,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Óskilgreind staða. - + Undefined state. - + Waiting to start syncing. Bíð eftir að samstilling ræsist. - + Preparing for sync. Undirbý samstillingu. - + Sync is running. Samstilling er keyrandi. - + Sync finished with unresolved conflicts. @@ -1721,62 +1955,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Notandi hætti við. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Samstilling er í bið. - + %1 (Sync is paused) %1 (samstilling er í bið) - + No valid folder selected! Engin gild mappa valin! - + The selected path does not exist! - + The selected path is not a folder! Valin slóð er ekki mappa! - + You have no permission to write to the selected folder! Þú hefur ekki réttindi til að skrifa í valda möppu! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! @@ -1789,7 +2023,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Bæta við samstillingartengingu möppu - + File Skrá @@ -1797,152 +2031,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Þú þarft að vera tengd(ur) til að bæta við möppu - + Click this button to add a folder to synchronize. Smelltu á þennan hnapp til að bæta við möppu til samstillingar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Villa við að hlaða inn lista yfir möppur frá vefþjóninum. - + Fetching folder list from server … Sæki lista yfir möppur frá þjóni … - + There are unresolved conflicts. Click for details. Það eru óleystir árekstrar. Smelltu til að skoða nánar. - + Virtual file support is enabled. - + Signed out Skráð(ur) út - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Samþætti breytingar - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Samstilli %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) sæki %1/sek - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) sendi inn %1/sek - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 af %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 eftir, %1 af %2, skrá %3 af %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 af %2, skrá %3 af %4 - + file %1 of %2 skrá %1 af %2 - + Waiting … Bíð … - + Waiting for %n other folder(s) … Bíð eftir %n möppu til viðbótar …Bíð eftir %n möppum til viðbótar … - + Preparing to sync … Undirbý samstillingu … @@ -2173,13 +2411,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2231,59 +2469,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Tilkynningar frá þjóni sem krefjast athugunar. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2291,22 +2529,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Krafist er lykilorðs fyrir sameign - + Please enter a password for your link share: - + Sharing error Villa við deilingu - + Could not retrieve or create the public link share. Error: %1 @@ -2540,6 +2778,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Loka + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2873,60 +3116,60 @@ niðurhals. Uppsetta útgáfan er %3.</p> - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Staðvær samstillingarmappa - - + + (%1) (%1) - + There isn't enough free space in the local folder! Það er ekki nægilegt laust pláss eftir í staðværu möppunni! @@ -2998,7 +3241,8 @@ niðurhals. Uppsetta útgáfan er %3.</p> OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3030,145 +3274,145 @@ niðurhals. Uppsetta útgáfan er %3.</p> OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Tókst að tengjast við %1: %2 útgáfa %3 (%4)</font><br/><br/> - + Invalid URL Ógild slóð - + Failed to connect to %1 at %2:<br/>%3 Tókst ekki að tengjast %1 á %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Féll á tíma þegar reynt var að tengjast við %1 á %2. - + Trying to connect to %1 at %2 … Reyni að tengjast við %1 á %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> - + Creating local sync folder %1 … Bý til staðværu samstillingarmöppuna %1 … - + OK - + failed. mistókst. - + Could not create local folder %1 Gat ekki búið til staðværu möppuna %1 - + No remote folder specified! Engin fjartengd mappa tilgreind! - + Error: %1 Villa: %1 - + creating folder on Nextcloud: %1 bý til möppu á Nextcloud: %1 - + Remote folder %1 created successfully. Það tókst að búa til fjartengdu möppuna %1. - + The remote folder %1 already exists. Connecting it for syncing. - - + + The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! Tenging við %1 tókst! - + Connection to %1 could not be established. Please check again. Ekki tókst að koma á tengingu við %1. Prófaðu aftur. - + Folder rename failed Endurnefning möppu mistókst - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Það tókst að búa til staðværu möppuna %1!</b></font> @@ -3191,12 +3435,12 @@ niðurhals. Uppsetta útgáfan er %3.</p> - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3207,12 +3451,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3241,162 +3485,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3404,22 +3653,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3432,19 +3681,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Skráin hefur breyst síðan hún fannst - + Could not delete file record %1 from local DB @@ -3455,32 +3704,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 Laust pláss á diski er minna en %1 - + File was deleted from server Skrá var eytt af þjóninum - + The file could not be downloaded completely. Ekki var hægt að sækja skrána að fullu. - + The downloaded file is empty, but the server said it should have been %1. @@ -3490,18 +3739,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3522,7 +3776,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 tókst ekki að eyða skránni %1, villa: %2 @@ -3533,16 +3787,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3550,7 +3809,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3563,46 +3822,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3623,7 +3887,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3636,12 +3900,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Fékk rangan HTTP-kóða frá þjóni. Átti von á 201, en fékk "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3649,42 +3913,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Fékk rangan HTTP-kóða frá þjóni. Átti von á 201, en fékk "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Villa við ritun lýsigagna í gagnagrunninn @@ -3874,7 +4138,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3892,23 +4156,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Stillingar - + %1 Settings This name refers to the application name e.g Nextcloud - + General Almennt - + Network Netkerfi - + Account Aðgangur @@ -3916,17 +4180,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4002,7 +4271,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4011,132 +4280,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Deila í samhengisvalmynd - + Select new location … - + I shared something with you Ég deildi einhverju með þér - - + + Share options Valkostir sameigna - - + + Activity - + Copy private link to clipboard Afrita einkatengil á klippispjald - + Send private link by email … Senda einkatengil með tölvupósti … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Endurdeiling þessarar skráar er ekki leyfð - + Resharing this folder is not allowed - - + + Copy public link Afrita opinberan tengil - + Copy internal link Afrita innri tengil - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Breyta - + Open in browser Opna í vafra - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Eyða @@ -4354,63 +4660,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Óleystur árekstur. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Einungis %1 eru tiltæk, þarf a.m.k. %2 til að ræsa - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Mistókst að opna eða búa til atvikaskrána. Gakktu úr skugga um að þú hafir les- og skrifheimildir í staðværu samstillingarmöppunni á tölvunni. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. Tekst ekki að lesa úr atvikaskrá samstillingar. - + Cannot open the sync journal Tekst ekki að opna atvikaskrá samstillingar @@ -4420,12 +4726,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4494,59 +4800,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Bæta við notandaaðgangi - + Open main dialog Opna aðalglugga - - + + Pause sync - - + + Resume sync - + Settings Stillingar - + Help - + Exit %1 Loka %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4554,24 +4860,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 skjáborðsforrit</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Þessi útgáfa var gefin út af %1</p> @@ -4579,22 +4885,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4602,31 +4908,37 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Prófa aftur allar innsendingar + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Staðfesta fjarlægingu aðgangs - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Viltu í alvörunni fjarlægja tenginguna við aðganginn <i>%1</i>?</p><p><b>Athugið:</b> Þetta mun <b>ekki</b> eyða neinum skrám.</p> - + Remove connection Fjarlægja tengingu - + Cancel Hætta við @@ -4764,8 +5076,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4773,8 +5085,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4872,123 +5184,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Óstudd útgáfa vefþjóns - + 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. - + Disconnected Aftengt - + Disconnected from some accounts Aftengt frá sumum notendaaðgöngum - + Disconnected from %1 Aftengdist %1 - + Disconnected from accounts: Aftengdist á notendareikningum: - + Account %1: %2 Aðgangur %1: %2 - + Please sign in Skráðu þig inn - + Signed out Skráð/ur út - + Account synchronization is disabled Samstilling aðgangs er óvirk - - + + Synchronization is paused Samstilling er í bið - + Folder %1: %2 Mappa %1: %2 - + Unresolved conflicts Óleystir árekstrar - + Up to date Allt uppfært nú þegar - + Error during synchronization Villa við samstillingu - + There are no sync folders configured. Það eru engar samstillingarmöppur stilltar. - + No sync folders configured Engar samstillingarmöppur stilltar - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Samstilli %1 af %2 (%3 eftir) - + Syncing %1 of %2 Samstilli %1 af %2 - + Syncing %1 (%2 left) Samstilli %1 (%2 eftir) - + Syncing %1 Samstilli %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5140,27 +5452,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5226,30 +5538,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5265,7 +5653,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5323,6 +5711,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5386,67 +5790,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5530,24 +5934,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Núverandi notandaaðgangur - - + + Resume sync for all Halda samstillingu áfram fyrir allt - - + + Pause sync for all Gera hlé á samstillingu fyrir allt @@ -5557,22 +5961,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Bæta við notandaaðgangi - + Add new account - + Settings Stillingar - + Exit Fara út @@ -5581,11 +5985,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5597,70 +5996,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Tengt - + Disconnected Aftengt - + Open Nextcloud Talk in browser - + More apps Fleiri forrit - + Open %1 in browser Opna %1 í vafra - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Kerfisbakki ekki tiltækur - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5668,7 +6072,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Byggt með Git revision <a href="%1">%2</a> á %3, %4 með Qt %5, %6</small></p> @@ -5703,72 +6107,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Eytt - + Moved to %1 Fært í %1 - + Ignored Hunsað - + Filesystem access error Villa við aðgang að skráakerfi - + Error Villa - + Updated local metadata Uppfærði staðvær lýsigögn - + Unknown Óþekkt - + downloading sæki - + uploading sendi inn - + deleting eyði - + moving færi - + ignoring hunsa - + error villa - + updating local metadata uppfæri staðvær lýsigögn diff --git a/translations/client_it.ts b/translations/client_it.ts index d60e20604..e4693760e 100644 --- a/translations/client_it.ts +++ b/translations/client_it.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Apri %1 localmente - + In %1 In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostra altre azioni @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Annulla + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista attività @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Cancella il messaggio di stato @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Lo spostamento nel cestino non è implementato su questa piattaforma - + Error removing "%1": %2 Errore durante la rimozione di "%1": %2 - + Could not remove folder "%1" Impossibile rimuovere la cartella "%1" @@ -321,7 +331,7 @@ Codice HTTP errato restituito dal server. Atteso 204, ma ricevuto "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Impossibile sbloccare la cartella cifrata %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. File %1 è già bloccato da %2. - + Lock operation on %1 failed with error %2 Operazione di blocco di %1 fallita con errore %2 - + Unlock operation on %1 failed with error %2 Operazione di sblocco di %1 fallita con errore %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Annulla @@ -400,12 +410,12 @@ Sembra che tu abbia la funzione File Virtuali attiva in questa cartella. Al momento, non è possibile scaricare implicitamente file virtuali che sono cifrati end-to-end. Per avere la migliore esperienza con i file virtuali e la crittografia end-to-end, assicurati che la cartella cifrata sia contrassegnata con "Rendi sempre disponibile in locale". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Non cifrare la cartella - + Do not encrypt folder Non cifrare la cartella - + Encrypt folder Cifra cartella - + No account configured. Nessun account configurato. - - Display mnemonic - Visualizza mnemonico + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Visualizza mnemonico @@ -445,18 +455,23 @@ Abilita cifratura - + + End-to-end encryption has been enabled for this account + + + + Warning Avviso - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Non puoi cifrare una cartella con contenuti, rimuovi i file. @@ -469,121 +484,121 @@ Attendi la nuova sincronizzazione, quindi cifrala. Questo account supporta la crittografia End-to-End - + Encryption failed Cifratura fallita - + Could not encrypt folder because the folder does not exist anymore Impossibile crittografare la cartella perchè non esiste più - - + + Open folder Apri cartella - + Encrypt Cifra - - + + Edit Ignored Files Modifica file ignorati - - + + Create new folder Crea una nuova cartella - - + + Availability Disponibilità - + Choose what to sync Scegli cosa sincronizzare - + Force sync now Forza ora la sincronizzazione - + Restart sync Riavvia sincronizzazione - + Resume sync Riprendi la sincronizzazione - + Pause sync Sospendi la sincronizzazione - + Remove folder sync connection Rimuovi connessione di sincronizzazione cartelle - + Disable virtual file support … Disabilita il supporto dei file virtuali… - + Enable virtual file support %1 … Abilita supporto dei file virtuali %1… - + (experimental) (sperimentale) - + Folder creation failed Creazione della cartella non riuscita - + <p>Could not create local folder <i>%1</i>.</p> <p>Impossibile creare la cartella locale <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Conferma rimozione connessione di sincronizzazione cartelle - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vuoi davvero fermare la sincronizzazione della cartella <i>%1</i>?</p><p><b>Nota:</b> ciò <b>non</b> eliminerà alcun file.</p> - + Remove Folder Sync Connection Rimuovi connessione di sincronizzazione cartelle - + Disable virtual file support? Vuoi disabilitare il supporto dei file virtuali? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ L'unico vantaggio di disabilitare il supporto dei file virtuali è che la f Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione. - + Disable support Disabilita supporto @@ -606,144 +621,176 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running La sincronizzazione è in corso - + The syncing operation is running.<br/>Do you want to terminate it? L'operazione di sincronizzazione è in corso.<br/>Vuoi terminarla? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) di %2 in uso. Alcune cartelle, incluse quelle montate in rete o le cartelle condivise, potrebbero avere limiti diversi. - + %1 of %2 in use %1 di %2 in uso - + Currently there is no storage usage information available. Non ci sono informazioni disponibili sull'utilizzo dello spazio di archiviazione. - + %1 in use %1 in uso - + %1 as %2 %1 come %2 - + The server version %1 is unsupported! Proceed at your own risk. La versione %1 del server non è supportata! Continua a tuo rischio. - + Connected to %1. Connesso a %1. - + Server %1 is temporarily unavailable. Il server %1 è temporaneamente non disponibile. - + Server %1 is currently in maintenance mode. Il Server %1 è attualmente in manutenzione - + Signed out from %1. Disconnesso da %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Ottenimento dell'autorizzazione dal browser. <a href='%1'>Fai clic qui</a> per aprire nuovamente il browser. - + Connecting to %1 … Connessione a %1… - + No connection to %1 at %2. Nessuna connessione a %1 su %2. - + Server configuration error: %1 at %2. Errore di configurazione del server: %1 in %2. - + No %1 connection configured. Nessuna connessione di %1 configurata. - + There are folders that were not synchronized because they are too big: Ci sono nuove cartelle che non sono state sincronizzate poiché sono troppo grandi: - + There are folders that were not synchronized because they are external storages: Ci sono nuove cartelle che non sono state sincronizzate poiché sono archiviazioni esterne: - + There are folders that were not synchronized because they are too big or external storages: Ci sono nuove cartelle che non sono state sincronizzate poiché sono troppo grandi o archiviazioni esterne: - + Confirm Account Removal Conferma rimozione account - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vuoi davvero eliminare la connessione all'account <i>%1</i>?</p><p><b>Nota:</b> ciò <b>non</b> eliminerà alcun file.</p> - + Remove connection Rimuovi connessione - - + This account supports end-to-end encryption Questo account supporta la cifratura End-To-End - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione OCC::ActivityListModel - + For more activities please open the Activity app. Per altre attività, apri l'applicazione Attività. @@ -808,12 +855,12 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione Recupero attività… - + Fetching activities … Recupero attività … - + Files from the ignore list as well as symbolic links are not synced. I file dell'elenco da ignorare e i collegamenti simbolici non sono sincronizzati. @@ -864,32 +911,59 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione OCC::Application - + Continuing will mean <b>deleting these settings</b>. Continuare significa <b>eliminare queste impostazioni</b>. - + Continuing will mean <b>ignoring these settings</b>. Continuare significa <b>ignorare queste impostazioni</b>. - + 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>. Alcune impostazioni sono state configurate nelle versioni più recenti di questo client e utilizzano funzionalità che non sono disponibili in questa versione.<br><br>%1<br><br>Il file di configurazione attuale è già stato sottoposto a backup su <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Esci - + Continue Continua - + Error accessing the configuration file Errore accedendo al file di configurazione @@ -899,12 +973,12 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione Si è verificato un errore durante l'accesso al file di configurazione su %1. Assicurati che il file sia accessibile dal tuo utente. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Si è verificato un errore durante l'accesso al file di configurazione su %1. Assicurati che il file sia accessibile dal tuo account di sistema. - + Quit %1 Esci da %1 @@ -950,56 +1024,216 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione Il file %1 ha un orario di modifica non valido. Non inviarlo sul server. - + File Removed (start upload) %1 File rimosso (avvio caricamento) %1 - + File %1 has invalid modification time. Do not upload to the server. Il file %1 ha un orario di modifica non valido. Non inviarlo sul server. - + Local file changed during syncing. It will be resumed. File locale modificato durante la sincronizzazione. Verrà ricaricato. - - + + Local file changed during sync. File locale modificato durante la sincronizzazione. - + Network error: %1 Errore di rete: %1 - + Error updating metadata: %1 Errore di aggiornamento dei metadati: %1 - + The file %1 is currently in use Il file %1 è attualmente in uso - + The local file was removed during sync. Il file locale è stato rimosso durante la sincronizzazione. - + Restoration failed: %1 Ripristini falliti: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Errore durante la scrittura dei metadati nel database @@ -1017,12 +1251,12 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione Digita la tua frase segreta di cifratura end-to-end: <br><br>Utente: %2<br>Account: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Digita la frase segreta E2E @@ -1198,8 +1432,8 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Errore del server: la risposta PROPFIND non è in formato XML! @@ -1207,27 +1441,27 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Errore durante l'apertura della cartella %1 - + Directory not accessible on client, permission denied Cartella non accessibile sul client, permesso negato - + Directory not found: %1 Cartella non trovata: %1 - + Filename encoding is not valid La codifica del nome del file non è valida - + Error while reading directory %1 Errore durante la lettura della cartella %1 @@ -1235,83 +1469,83 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Questa azione interromperà qualsiasi sincronizzazione attualmente in esecuzione OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Impossibile generare i metadati per la cifratura. Sblocco della cartella. @@ -1449,123 +1683,123 @@ Questo può essere un problema delle le tue librerie OpenSSL. OCC::Folder - + Local folder %1 does not exist. La cartella locale %1 non esiste. - + %1 should be a folder but is not. %1 dovrebbe essere una cartella, ma non lo è. - + %1 is not readable. %1 non è leggibile. - + %1 and %n other file(s) have been removed. %1 e %n altro file sono stati rimossi.%1 e %n altri file sono stati rimossi.%1 e %n altri file sono stati rimossi. - + %1 has been removed. %1 names a file. %1 è stato rimosso. - + %1 and %n other file(s) have been added. %1 e %n altro file sono stati aggiunti.%1 e %n altri file sono stati aggiunti.%1 e %n altri file sono stati aggiunti. - + %1 has been added. %1 names a file. %1 è stato aggiunto. - + %1 and %n other file(s) have been updated. %1 e %n altro file sono stati aggiornati.%1 e %n altri file sono stati aggiornati.%1 e %n altri file sono stati aggiornati. - + %1 has been updated. %1 names a file. %1 è stato aggiornato. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 è stato rinominato in %2 e %n altro file sono stati rinominati.%1 è stato rinominato in %2 e %n altri file sono stati rinominati.%1 è stato rinominato in %2 e %n altri file sono stati rinominati. - + %1 has been renamed to %2. %1 and %2 name files. %1 è stato rinominato in %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 è stato spostato in %2 e %n altro file sono stati spostati.%1 è stato spostato in %2 e %n altri file sono stati spostati.%1 è stato spostato in %2 e %n altri file sono stati spostati. - + %1 has been moved to %2. %1 è stato spostato in %2. - + %1 has and %n other file(s) have sync conflicts. %1 e %n altro file hanno conflitti di sincronizzazione.%1 e %n altri file hanno conflitti di sincronizzazione.%1 e %n altri file hanno conflitti di sincronizzazione. - + %1 has a sync conflict. Please check the conflict file! %1 ha un conflitto di sincronizzazione. Controlla il file in conflitto! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. 1% e %n altro file non sono stati sincronizzati a causa di errori. Controlla il log per i dettagli.1% e %n altri file non sono stati sincronizzati a causa di errori. Controlla il log per i dettagli.1% e %n altri file non sono stati sincronizzati a causa di errori. Controlla il log per i dettagli. - + %1 could not be synced due to an error. See the log for details. %1 non può essere sincronizzato a causa di un errore. Controlla il log per i dettagli. - + %1 and %n other file(s) are currently locked. %1 e %n altri file sono attualmente bloccati.%1 e %n altri file sono attualmente bloccati.%1 e %n altri file sono attualmente bloccati. - + %1 is currently locked. %1 è attualmente bloccato. - + Sync Activity Sincronizza attività - + Could not read system exclude file Impossibile leggere il file di esclusione di sistema - + A new folder larger than %1 MB has been added: %2. Una nuova cartella più grande di %1 MB è stata aggiunta: %2. - + A folder from an external storage has been added. Una nuova cartella da un'archiviazione esterna è stata aggiunta. @@ -1573,22 +1807,22 @@ Questo può essere un problema delle le tue librerie OpenSSL. - + Please go in the settings to select it if you wish to download it. Vai nelle impostazioni e selezionala se vuoi scaricarla. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. La cartella %1 è stata creata, ma è stata esclusa dalla sincronizzazione in precedenza. I dati al suo interno non saranno sincronizzati. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Il file %1 è stato creato, ma è stato escluso dalla sincronizzazione in precedenza. Non sarà sincronizzato. - + 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). @@ -1601,7 +1835,7 @@ Questo significa che il client di sincronizzazione potrebbe non caricare le modi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ Se decidi di ripristinare i file, essi saranno sincronizzati nuovamente con il s Se decidi di eliminare i file, non saranno più disponibili, a meno che tu sia il proprietario. - + 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. @@ -1621,17 +1855,17 @@ Sei sicuro di voler sincronizzare queste azioni con il server? Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovamente dal server. - + Remove All Files? Vuoi rimuovere tutti i file? - + Remove all files Rimuovi tutti i file - + Keep files Mantieni i file @@ -1667,22 +1901,22 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament OCC::FolderMan - + Could not reset folder state Impossibile ripristinare lo stato della cartella - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. È stato trovato un vecchio registro di sincronizzazione "%1", ma non può essere rimosso. Assicurati che nessuna applicazione lo stia utilizzando. - + (backup) (copia di sicurezza) - + (backup %1) (copia di sicurezza %1) @@ -1692,27 +1926,27 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament Stato non definito. - + Undefined state. Stato non definito. - + Waiting to start syncing. In attesa di iniziare la sincronizzazione. - + Preparing for sync. Preparazione della sincronizzazione. - + Sync is running. La sincronizzazione è in corso. - + Sync finished with unresolved conflicts. Sincronizzazione terminata con conflitti non risolti. @@ -1732,62 +1966,62 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament Interrotto dall'utente. - + Last sync was successful. L'ultima sincronizzazione è stata completata correttamente. - + Setup error. Errore di configurazione. - + Sync request was cancelled. Richiesta di sincronizzazione annullata. - + Sync is paused. La sincronizzazione è sospesa. - + %1 (Sync is paused) %1 (La sincronizzazione è sospesa) - + No valid folder selected! Nessuna cartella valida selezionata! - + The selected path does not exist! Il percorso selezionato non esiste! - + The selected path is not a folder! Il percorso selezionato non è una cartella! - + You have no permission to write to the selected folder! Non hai i permessi di scrittura per la cartella selezionata! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! La cartella locale %1 contiene già una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un'altra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! La cartella locale %1 è già contenuta in una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un'altra! - + There is already a sync from the server to this local folder. Please pick another local folder! Esiste già una sincronizzazione dal server a questa cartella locale. Seleziona un'altra cartella locale! @@ -1800,7 +2034,7 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament Aggiungi connessioni di sincronizzazione cartelle - + File File @@ -1808,152 +2042,156 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament OCC::FolderStatusModel - + You need to be connected to add a folder Devi essere connesso per aggiungere una cartella - + Click this button to add a folder to synchronize. Fai clic su questo pulsante per aggiungere una cartella da sincronizzare. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Errore durante il caricamento dell'elenco delle cartelle dal server. - + Fetching folder list from server … Recupero dell'elenco delle cartelle dal server... - + There are unresolved conflicts. Click for details. Ci sono conflitti irrisolti. Fai clic per ulteriori dettagli. - + Virtual file support is enabled. Il supporto dei file virtuali è abilitato. - + Signed out Disconnesso - + Synchronizing VirtualFiles with local folder Sincronizzato dei file virtuali con la cartella locale - + Synchronizing with local folder Sincronizzazione con cartella locale - + Checking for changes in remote "%1" Controllo delle modifiche in "%1" remoto - + Checking for changes in local "%1" Controllo delle modifiche in "%1" locale - + Reconciling changes Riconciliazione delle modifiche - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizzazione di %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) ricezione %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) invio %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 di %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Pochi secondi rimasti, %1 di %2, file %3 di %4 - + %5 left, %1 of %2, file %3 of %4 %5 rimanenti, %1 di %2, file %3 di %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 di %2, file %3 di %4 - + file %1 of %2 file %1 di %2 - + Waiting … Attendi... - + Waiting for %n other folder(s) … In attesa di %n altra cartella...In attesa di %n altre cartelle...In attesa di %n altre cartelle... - + Preparing to sync … Preparazione della sincronizzazione… @@ -2184,13 +2422,13 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament - + stable stabile - + beta beta @@ -2242,59 +2480,59 @@ Se è stato un errore e decidi di tenere i file, saranno sincronizzati nuovament - + Create Debug Archive Crea archivio di debug - + Server notifications that require attention. Notifiche del server che richiedono attenzione. - + Show call notification dialogs. Mostra finestre di notifica chiamata. - + You cannot disable autostart because system-wide autostart is enabled. Non puoi disabilitare l'avvio automatico poiché è abilitato l'avvio automatico a livello di sistema. - + Change update channel? Vuoi cambiare il canale di aggiornamento? - + 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. 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. Il canale di aggiornamento determina quali aggiornamenti del client saranno offerti per l'installazione. Il canale "stabile" contiene solo aggiornamenti considerati affidabili, mentre le versioni nel canale "beta" possono contenere nuove funzionalità e correzioni di bug, ma non sono state ancora provate a fondo. Nota che questo seleziona solo da quale pool vengono prelevati gli aggiornamenti e che non ci sono downgrade: per cui tornare dal canale beta al canale stabile di solito non può essere fatto immediatamente e significa aspettare una versione stabile che sia più recente della versione beta attualmente installata. - + Change update channel Cambia il canale di aggiornamento - + Cancel Annulla - + Zip Archives Archivi zip - + Debug Archive Created Archivio di debug creato - + Debug archive is created at %1 L'archivio di debug è stato creato in %1 @@ -2302,22 +2540,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Password per condivisione richiesta - + Please enter a password for your link share: Digita una password per il tuo collegamento di condivisione: - + Sharing error Errore di condivisione - + Could not retrieve or create the public link share. Error: %1 @@ -2555,6 +2793,11 @@ Gli elementi per i quali è consentita l'eliminazione saranno eliminati se Close Chiudi + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2888,60 +3131,60 @@ Nota che l'utilizzo di qualsiasi opzione della riga di comando di registraz - + Use &virtual files instead of downloading content immediately %1 Usa i file &virtuali invece di scaricare immediatamente il contenuto %1 - + (experimental) (sperimentale) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. I file virtuali non sono supportati per le radici delle partizioni di Windows come cartelle locali. Scegli una sottocartella valida sotto la lettera del disco. - + %1 folder "%2" is synced to local folder "%3" La cartella "%2" di %1 è sincronizzata con la cartella locale "%3" - + Sync the folder "%1" Sincronizza la cartella "%1" - + Warning: The local folder is not empty. Pick a resolution! Attenzione: la cartella locale non è vuota. Scegli una soluzione! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB Spazio libero di %1 - + Virtual files are not available for the selected folder I file virtuali non sono disponibili per la cartella selezionata - + Local Sync Folder Cartella locale di sincronizzazione - - + + (%1) (%1) - + There isn't enough free space in the local folder! Non c'è spazio libero sufficiente nella cartella locale! @@ -3013,7 +3256,8 @@ Nota che l'utilizzo di qualsiasi opzione della riga di comando di registraz OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Impossibile ottenere l'ora di modifica per il file in conflitto %1 @@ -3045,144 +3289,144 @@ Nota che l'utilizzo di qualsiasi opzione della riga di comando di registraz OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Connesso correttamente a %1: %2 versione %3 (%4)</font><br/><br/> - + Invalid URL URL non valido - + Failed to connect to %1 at %2:<br/>%3 Connessione a %1 su %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Tempo scaduto durante il tentativo di connessione a %1 su %2. - + Trying to connect to %1 at %2 … Tentativo di connessione a %1 su %2... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. La richiesta autenticata al server è stata rediretta a "%1". L'URL è errato, il server non è configurato correttamente. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Accesso negato dal server. Per verificare di avere i permessi appropriati, <a href="%1">fai clic qui</a> per accedere al servizio con il tuo browser. - + There was an invalid response to an authenticated WebDAV request Ricevuta una risposta non valida a una richiesta WebDAV autenticata - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> La cartella di sincronizzazione locale %1 esiste già, impostata per la sincronizzazione.<br/><br/> - + Creating local sync folder %1 … Creazione della cartella locale di sincronizzazione %1... - + OK OK - + failed. non riuscita. - + Could not create local folder %1 Impossibile creare la cartella locale %1 - + No remote folder specified! Nessuna cartella remota specificata! - + Error: %1 Errore: %1 - + creating folder on Nextcloud: %1 creazione cartella su Nextcloud: %1 - + Remote folder %1 created successfully. La cartella remota %1 è stata creata correttamente. - + The remote folder %1 already exists. Connecting it for syncing. La cartella remota %1 esiste già. Connessione in corso per la sincronizzazione - - + + The folder creation resulted in HTTP error code %1 La creazione della cartella ha restituito un codice di errore HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> La creazione della cartella remota non è riuscita poiché le credenziali fornite sono errate!<br/>Torna indietro e verifica le credenziali.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">La creazione della cartella remota non è riuscita probabilmente perché le credenziali fornite non sono corrette.</font><br/>Torna indietro e controlla le credenziali inserite.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Creazione della cartella remota %1 non riuscita con errore <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Una connessione di sincronizzazione da %1 alla cartella remota %2 è stata stabilita. - + Successfully connected to %1! Connesso con successo a %1! - + Connection to %1 could not be established. Please check again. La connessione a %1 non può essere stabilita. Prova ancora. - + Folder rename failed Rinomina della cartella non riuscita - + Cannot 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. Impossibile rimuovere o copiare la cartella poiché la cartella o un file contenuto in essa è aperto in un altro programma. Chiudi la cartella o il file e premi Riprova o annulla la configurazione. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Cartella locale %1 creata correttamente!</b></font> @@ -3205,12 +3449,12 @@ Nota che l'utilizzo di qualsiasi opzione della riga di comando di registraz Annulla - + Enable experimental feature? Vuoi abilitare la funzionalità sperimentale? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3221,12 +3465,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Quando la modalità "file virtuali" è abilitata, nessun file sarà scaricato inizialmente. Sarà invece creato un piccolo file "%1" per ogni file esistente sul server. I contenuti possono essere scaricati eseguendo questi file o utilizzando il loro menu contestuale. La modalità dei file virtuali si esclude a vicenda con la sincronizzazione selettiva. Le cartelle attualmente non selezionate saranno tradotte in cartelle solo in linea e le impostazioni di sincronizzazione selettiva saranno ripristinate. Il passaggio a questa modalità interromperà qualsiasi sincronizzazione attualmente in esecuzione. Questa è una nuova modalità sperimentale. Se decidi di utilizzarlo, segnala eventuali problemi che si presentano. - + Enable experimental placeholder mode Attiva la modalità segnaposto sperimentale - + Stay safe Rimani al sicuro @@ -3255,162 +3499,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. I collegamenti simbolici non sono supportati dalla sincronizzazione. - + File is listed on the ignore list. Il file è presente nell'elenco degli ignorati. - + File names ending with a period are not supported on this file system. I nomi del file che terminano con un punto non sono supportati su questo file system. - + File names containing the character "%1" are not supported on this file system. I nomi del file che contengono il carattere "%1" non sono supportati su questo file system. - + File name contains at least one invalid character Il nome del file contiene almeno un carattere non valido - + The file name is a reserved name on this file system. Il nome del file è un nome riservato su questo file system. - + Filename contains trailing spaces. Il nome del file contiene spazi alla fine. - + Filename contains leading spaces. Il nome del file contiene spazi all'inizio. - + Filename contains leading and trailing spaces. Il nome del file contiene spazi all'inizio e alla fine. - + Filename is too long. Il nome del file è troppo lungo. - + File/Folder is ignored because it's hidden. Il file/cartella è ignorato poiché è nascosto. - + Stat failed. Stat non riuscita. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflitto: versione del server scaricata, copia locale rinominata e non caricata. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Il nome del file non può essere codificato sul tuo file system. - + The filename is blacklisted on the server. Il nome del file è nella lista nera sul server. - + File has extension reserved for virtual files. Il file ha l'estensione riservata ai file virtuali. - + size dimensione - + permission permesso - + file id ID del file - + Server reported no %1 Il server non ha restituito alcun %1 - + Cannot sync due to invalid modification time Impossibile sincronizzare a causa di un orario di modifica non valido - + Error while deleting file record %1 from the database Errore nella rilevazione del record del file %1 dal database - + Conflict when uploading a folder. It's going to get cleared! Conflitto durante l'invio di una cartella. Verrà svuotata! - + Conflict when uploading a file. It's going to get removed! Conflitto durante l'invio di un file. Verrà rimosso! - + Ignored because of the "choose what to sync" blacklist Ignorato in base alla lista nera per la scelta di cosa sincronizzare - + Not allowed because you don't have permission to add subfolders to that folder Non consentito perché non sei autorizzato ad aggiungere sottocartelle a quella cartella - + Not allowed because you don't have permission to add files in that folder Non ti è consentito perché non hai i permessi per aggiungere file in quella cartella - + Not allowed to upload this file because it is read-only on the server, restoring Non ti è permesso caricare questo file perché hai l'accesso in sola lettura sul server, ripristino - + Moved to invalid target, restoring Spostato su una destinazione non valida, ripristino - + Not allowed to remove, restoring Rimozione non consentita, ripristino - + Error while reading the database Errore durante la lettura del database - + Server replied with an error while reading directory "%1" : %2 Il server ha risposto con un errore durante la lettura della cartella "%1" : %2 @@ -3418,22 +3667,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB impossibile eliminare il file %1 dal DB locale - + Error updating metadata due to invalid modification time Errore di aggiornamento dei metadati a causa dell'orario di modifica non valido - + Error updating metadata: %1 Errore di invio dei metadati: %1 - + File is currently in use Il file è attualmente in uso @@ -3446,19 +3695,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss impossibile ottenere il file %1 dal DB locale - + File %1 cannot be downloaded because encryption information is missing. Il file %1 non può essere scaricato per la mancanza di informazioni di crittografia. - - + + File has changed since discovery Il file è stato modificato dal suo rilevamento - + Could not delete file record %1 from local DB Impossibile eliminare il record del file %1 dal DB locale @@ -3469,32 +3718,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss Il file %1 non può essere scaricato per un conflitto con il nome di un file locale! - + File %1 can not be downloaded because of a local file name clash! Il file %1 non può essere scaricato a causa di un conflitto con un file locale. - + The download would reduce free local disk space below the limit Lo scaricamento ridurrà lo spazio disco libero locale sotto il limite - + Free space on disk is less than %1 Lo spazio libero su disco è inferiore a %1 - + File was deleted from server Il file è stato eliminato dal server - + The file could not be downloaded completely. Il file non può essere scaricato completamente. - + The downloaded file is empty, but the server said it should have been %1. Il file scaricato è vuoto, ma il server ha indicato una dimensione di %1. @@ -3504,18 +3753,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Il file %1 non può essere salvato a causa di un conflitto con un file locale. - - + + File %1 has invalid modified time reported by server. Do not save it. Il file %1 ha un orario di modifica non valido segnalato dal server. Non salvarlo. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Errore di invio dei metadati: %1 - + The file %1 is currently in use Il file %1 è attualmente in uso @@ -3536,7 +3790,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 Impossibile eliminare il file %1, errore: %2 @@ -3547,16 +3801,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Impossibile creare la cartella %1 - + Error updating metadata: %1 Errore di invio dei metadati: %1 - + The file %1 is currently in use Il file %1 è attualmente in uso @@ -3564,7 +3823,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Impossibile rimuovere %1 a causa di un conflitto con un file locale @@ -3577,46 +3836,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Il file %1 non può essere rinominato in %2 per un conflitto con il nome di un file locale - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB impossibile ottenere il file %1 dal DB locale - + Error setting pin state Errore durante l'impostazione dello stato del PIN - - + + Error updating metadata: %1 Errore di invio dei metadati: %1 - + The file %1 is currently in use Il file %1 è attualmente in uso - - + + Could not delete file record %1 from local DB Impossibile eliminare il record del file %1 dal DB locale - + Failed to propagate directory rename in hierarchy - + Failed to rename file Rinominazione file non riuscita @@ -3637,7 +3901,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Codice HTTP errato restituito dal server. Atteso 204, ma ricevuto "%1 %2". @@ -3650,12 +3914,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Codice HTTP errato restituito dal server. Atteso 201, ma ricevuto "%1 %2". - + Error writing metadata to the database: %1 Errore durante la scrittura dei metadati nel database: %1 - + The file %1 is currently in use Il file %1 è attualmente in uso @@ -3663,42 +3927,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Impossibile rinominare %1 in %2, errore: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Codice HTTP errato restituito dal server. Atteso 201, ma ricevuto "%1 %2". - + could not get file %1 from local DB impossibile ottenere il file %1 dal DB locale - + Could not delete file record %1 from local DB Impossibile eliminare il record del file %1 dal DB locale - + Error updating metadata: %1 Errore di invio dei metadati: %1 - + The file %1 is currently in use Il file %1 è attualmente in uso - + Error setting pin state Errore durante l'impostazione dello stato del PIN - + Error writing metadata to the database Errore durante la scrittura dei metadati nel database @@ -3888,7 +4152,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Rispondi @@ -3906,23 +4170,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Impostazioni - + %1 Settings This name refers to the application name e.g Nextcloud Impostazioni di %1 - + General Generale - + Network Rete - + Account Account @@ -3930,17 +4194,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4016,7 +4285,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4025,132 +4294,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Condivisione da menu contestuale - + Select new location … Seleziona nuova posizione… - + I shared something with you Ho condiviso qualcosa con te - - + + Share options Opzioni di condivisione - - + + Activity Attività - + Copy private link to clipboard Copia link privato negli appunti - + Send private link by email … Invia collegamento privato tramite email… + + + Expire in %1 minutes + remaining time before lock expire + Scade fra in %1 minutiScade fra in %1 minutiScade fra in %1 minuti + - + Leave this share - + Resharing this file is not allowed La ri-condivisione di questo file non è consentita - + Resharing this folder is not allowed La ri-condivisione di questa cartella non è consentita - - + + Copy public link Copia collegamento pubblico - + Copy internal link Copia collegamento interno - + + Encrypt + + + + Lock file Blocca file - + Unlock file Sblocca file - + Locked by %1 Bloccato da %1 - - Expire in %1 minutes - remaining time before lock expire - Scade fra in %1 minutiScade fra in %1 minutiScade fra in %1 minuti - - - + Expires in %1 minutes remaining time before lock expires Scade fra %1 minutiScade fra %1 minutiScade fra %1 minuti - + Edit Modifica - + Open in browser Apri nel browser - + Resolve conflict … Risolvi conflitto… - + Move and rename … Sposta e rinomina… - + Move, rename and upload … Sposta, rinomina e carica… - + Delete local changes Elimina modifiche locali - + Move and upload … Sposta e carica… - + Delete Elimina @@ -4368,63 +4674,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (saltato a causa di un errore precedente, nuovo tentativo in %2) - + Could not update file: %1 Impossibile aggiornare il file: %1 - + Could not update virtual file metadata: %1 Impossibile aggiornare i metadati dei file virtuali: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 Impossibile impostare il record del file nel DB locale: %1 - + Unresolved conflict. Conflitto non risolto - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Sono disponibili solo %1, servono almeno %2 per iniziare - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Impossibile aprire o creare il database locale di sincronizzazione. Assicurati di avere accesso in scrittura alla cartella di sincronizzazione. - + Using virtual files with suffix, but suffix is not set Utilizzo di file virtuali con suffisso, ma il suffisso non è impostato - + Unable to read the blacklist from the local database Impossibile leggere la lista nera dal database locale - + Unable to read from the sync journal. Impossibile leggere dal registro di sincronizzazione. - + Cannot open the sync journal Impossibile aprire il registro di sincronizzazione @@ -4434,12 +4740,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss La sincronizzazione riprenderà a breve. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Lo spazio su disco è basso: gli scaricamenti che potrebbero ridurre lo spazio libero sotto %1 saranno saltati. - + There is insufficient space available on the server for some uploads. Spazio disponibile insufficiente sul server per alcuni caricamenti. @@ -4508,59 +4814,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Scarica - + Add account Aggiungi account - + Open main dialog Apri finestra principale - - + + Pause sync Sospendi la sincronizzazione - - + + Resume sync Riprendi la sincronizzazione - + Settings Impostazioni - + Help Assistenza - + Exit %1 Esci da %1 - + Pause sync for all Sospendi la sincronizzazione per tutto - + Resume sync for all Riprendi la sincronizzazione per tutto - + %1: %2 %1: %2 @@ -4568,24 +4874,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Client desktop di %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versione %1. Per ulteriori informazioni, fai clic <a href='%2'>qui</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Usato il plugin dei file virtuali: %1</small></p> - + <p>This release was supplied by %1</p> <p>Questa versione è stata fornita da %1</p> @@ -4593,22 +4899,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Recupero dei fornitori non riuscito. - + Failed to fetch search providers for '%1'. Error: %2 Recupero dei fornitori di ricerca per '%1'. Errore: %2 - + Search has failed for '%2'. Ricerca di '%2' fallita. - + Search has failed for '%1'. Error: %2 Ricerca di '%1' fallita. Errore: %2 @@ -4616,30 +4922,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Riprova tutti i caricamenti + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Conferma rimozione account - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vuoi davvero rimuovere la connessione all'account <i>%1</i>?</p><p><b>Nota:</b> ciò <b>non</b> eliminerà alcun file.</p> - + Remove connection Rimuovi connessione - + Cancel Annulla @@ -4777,8 +5089,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Errore di aggiornamento dei metadati a causa dell'orario di modifica non valido @@ -4786,8 +5098,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Errore di aggiornamento dei metadati a causa dell'orario di modifica non valido @@ -4885,123 +5197,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versione del server non supportata - + 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. Il server sull'account %1 esegue una versione non supportata %2. L'utilizzo di questo client con versioni del server non supportate non è stato verificato e è potenzialmente pericoloso. Procedi a tuo rischio. - + Disconnected Disconnesso - + Disconnected from some accounts Disconnesso da un account - + Disconnected from %1 Disconnesso dal %1 - + Disconnected from accounts: Disconnesso dagli account: - + Account %1: %2 Account %1: %2 - + Please sign in Accedi - + Signed out Disconnesso - + Account synchronization is disabled La sincronizzazione dell'account è disabilitata - - + + Synchronization is paused La sincronizzazione è in pausa - + Folder %1: %2 Cartella %1: %2 - + Unresolved conflicts Conflitti non risolti - + Up to date Aggiornato - + Error during synchronization Errore durante la sincronizzazione - + There are no sync folders configured. Non è stata configurata alcuna cartella per la sincronizzazione. - + No sync folders configured Nessuna cartella configurata per la sincronizzazione - + Checking for changes in remote "%1" Controllo delle modifiche in "%1" remoto - + Checking for changes in local "%1" Controllo delle modifiche in "%1" locale - + Syncing %1 of %2 (%3 left) Sincronizzazione di %1 di %2 (%3 rimanenti) - + Syncing %1 of %2 Sincronizzazione di %1 di %2 - + Syncing %1 (%2 left) Sincronizzazione di %1 (%2 rimanenti) - + Syncing %1 Sincronizzazione di %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5153,27 +5465,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Nuova cartella - + You renamed %1 Hai rinominato %1 - + You deleted %1 Hai eliminato %1 - + You created %1 Hai creato %1 - + You changed %1 Hai modificato %1 - + Synced %1 %1 sincronizzato @@ -5239,30 +5551,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Marca come letto + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5278,7 +5666,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Connessione al database non riuscita. @@ -5336,6 +5724,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Carica più risultati + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5399,67 +5803,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Stato in linea - + Online In linea - + Away Assente - + Do not disturb Non disturbare - + Mute all notifications Silenzia tutte le notifiche - + Invisible Invisibile - + Appear offline Appari non in linea - + Status message Messaggio di stato - + What is your status? Qual è il tuo stato? - + Clear status message after Cancella il messaggio di stato dopo - + Cancel Annulla - + Clear status message Cancella il messaggio di stato - + Set status message Imposta il messaggio di stato @@ -5543,24 +5947,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Finestra principale di Nextcloud desktop - + Current account Account attuale - - + + Resume sync for all Riprendi la sincronizzazione per tutto - - + + Pause sync for all Sospendi la sincronizzazione per tutto @@ -5570,22 +5974,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Imposta lo stato utente - + Add account Aggiungi account - + Add new account Aggiungi nuovo account - + Settings Impostazioni - + Exit Esci @@ -5594,11 +5998,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Avatar dell'utente attuale - - - Current account avatar - Avatar dell'account attuale - Current user status is online @@ -5610,70 +6009,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Lo stato attuale dell'utente è non disturbare - + + Current account avatar + Avatar dell'account attuale + + + Current account status is online Lo stato attuale dell'account è in linea - + Current account status is do not disturb Lo stato attuale dell'account è non disturbare - + + %1 - File activity + %1 - Attività file + + + Account switcher and settings menu Selettore account e menu impostazioni - + Open local folder of current account Apri cartella locale dell'account attuale - + Connected Connesso - + Disconnected Disconnesso - + Open Nextcloud Talk in browser Apri Nextcloud Talk nel browser - + More apps Altre applicazioni - + Open %1 in browser Apri %1 nel browser - + Unified search results list Lista unificata dei risultati di ricerca - - - %1 - File activity - %1 - Attività file - main.cpp - + System Tray not available Il vassoio di sistema non è disponibile - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 richiede un vassoio di sistema. Se stai usando XFCE, segui <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">queste istruzioni</a>. Altrimenti, installa un'applicazione vassoio di sistema come "trayer" e riprova. @@ -5681,7 +6085,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Compilato dalla revisione Git <a href="%1">%2</a> il %3, %4 utilizzando Qt %5, %6</small></p> @@ -5715,72 +6119,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Eliminato - + Moved to %1 Spostato in %1 - + Ignored Ignorato - + Filesystem access error Errore di accesso al filesystem - + Error Errore - + Updated local metadata Metadati locali aggiornati - + Unknown Sconosciuto - + downloading scaricamento in corso - + uploading caricamento in corso - + deleting eliminazione - + moving spostamento - + ignoring ignorare - + error errore - + updating local metadata metadati locali aggiornati diff --git a/translations/client_ja.ts b/translations/client_ja.ts index 2cd1e9f1c..1410c2186 100644 --- a/translations/client_ja.ts +++ b/translations/client_ja.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally ローカルで %1 を開く - + In %1 %1 内 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions その他の操作を表示 @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss 閉じる + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list アクティビティリスト @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu メニューのステータスメッセージの削除 @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity アクティビティ - + Sharing 共有 @@ -226,12 +236,12 @@ ゴミ箱への移動はこのプラットフォームでは実装されていません - + Error removing "%1": %2 削除中のエラー "%1": %2 - + Could not remove folder "%1" フォルダー %1を削除できませんでした @@ -321,7 +331,7 @@ 誤ったHTTPコードがサーバーから返されました。204 を期待しましたが、"%1 %2" が返りました。 - + "%1 Failed to unlock encrypted folder %2". "%1 暗号化されたフォルダー %2 のロックを解除できませんでした。” @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. ファイル %1 はすでに %2 がロックしています - + Lock operation on %1 failed with error %2 エラー %2 により、 %1 のロック処理に失敗しました - + Unlock operation on %1 failed with error %2 エラー %2 により、 %1 のロック解除処理に失敗しました @@ -353,9 +363,9 @@ - - - + + + Cancel キャンセル @@ -400,12 +410,12 @@ このフォルダでは仮想ファイル機能が有効になっているようです。現時点では、エンドツーエンドで暗号化された仮想ファイルをバックグラウンドで暗黙的にダウンロードすることはできません。仮想ファイルとエンドツーエンド暗号化を最大限に活用するには、暗号化されたフォルダーに「ローカルで常に利用可能にする」というマークが付いていることを確認してください。 - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ フォルダーを暗号化しない - + Do not encrypt folder フォルダを暗号化しない - + Encrypt folder フォルダーの暗号化 - + No account configured. アカウントが未設定です。 - - Display mnemonic - ニーモニックを表示 + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + ニーモニックを表示 @@ -445,18 +455,23 @@ 暗号化を有効にする - + + End-to-end encryption has been enabled for this account + + + + Warning 警告 - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. フォルダーが空でないと暗号化できません。ファイルを削除してください。 @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. このアカウントはエンドツーエンドの暗号化をサポートしています - + Encryption failed 暗号化できませんでした - + Could not encrypt folder because the folder does not exist anymore フォルダーが既に存在しないため暗号化できませんでした - - + + Open folder フォルダーを開く - + Encrypt 暗号化 - - + + Edit Ignored Files 除外ファイルリストを編集 - - + + Create new folder 新しいフォルダーを作成 - - + + Availability ローカルファイルの保持 - + Choose what to sync 同期フォルダーを選択 - + Force sync now 今すぐ強制的に同期 - + Restart sync 同期を再実行 - + Resume sync 再開 - + Pause sync 一時停止 - + Remove folder sync connection 同期フォルダー接続を削除 - + Disable virtual file support … 仮想ファイルを無効にする… - + Enable virtual file support %1 … 仮想ファイルを有効にする %1… - + (experimental) (試験的) - + Folder creation failed フォルダーの作成に失敗しました - + <p>Could not create local folder <i>%1</i>.</p> <p>ローカルフォルダー <i>%1</i> を作成できません。</p> - + Confirm Folder Sync Connection Removal 同期フォルダー接続の削除を確認 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>フォルダー<i>%1</i>の同期を本当に止めますか?</p><p><b>注:</b> これによりファイルが一切削除されることはありません。</p> - + Remove Folder Sync Connection 同期フォルダー接続を削除 - + Disable virtual file support? 仮想ファイルを無効にしますか? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ This action will abort any currently running synchronization. この操作を行うと、現在実行中の同期が中止されます。 - + Disable support サポートを無効化 @@ -606,144 +621,176 @@ This action will abort any currently running synchronization. エンドツーエンドの暗号化ニーモニック - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running 同期を実行中 - + The syncing operation is running.<br/>Do you want to terminate it? 同期作業を実行中です。<br/>終了しますか? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %2 の %1(%3%) 利用中。外部ネットワークストレージや共有フォルダーを含むフォルダーがある場合は、容量の上限値が異なる可能性があります。 - + %1 of %2 in use %2 のうち %1 を使用中 - + Currently there is no storage usage information available. 現在、利用できるストレージ利用状況はありません。 - + %1 in use %1 を使用中 - + %1 as %2 %1 に %2 - + The server version %1 is unsupported! Proceed at your own risk. サーバーバージョン %1 はサポートされていません! 自己責任で進めてください。 - + Connected to %1. %1 で接続しています。 - + Server %1 is temporarily unavailable. サーバー %1 は一時的に利用できません - + Server %1 is currently in maintenance mode. サーバー %1 は現在メンテナンスモードです。 - + Signed out from %1. %1 からサインアウトしました。 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. ブラウザーから許可を取得。<a href='%1'>ここをクリック</a> してブラウザーを再度開きます。 - + Connecting to %1 … %1 に接続中… - + No connection to %1 at %2. %2 の %1 への接続がありません。 - + Server configuration error: %1 at %2. サーバー設定エラー: %2 の %1 - + No %1 connection configured. %1 の接続は設定されていません。 - + There are folders that were not synchronized because they are too big: 大きすぎるため同期されなかったフォルダーがあります: - + There are folders that were not synchronized because they are external storages: 外部ストレージにあるため同期されなかったフォルダーがあります: - + There are folders that were not synchronized because they are too big or external storages: 大きすぎたか、外部ストレージにあるため同期されなかったフォルダーがあります: - + Confirm Account Removal アカウント削除確認 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p> アカウント <i>%1</i> を本当に削除しますか?</p><p><b>注意:</b> これによりファイルが一切削除されることはありません。</p> - + Remove connection 接続削除 - - + This account supports end-to-end encryption このアカウントはE2E暗号化に対応しています - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. その他のアクティビティについては、アクティビティアプリを開いてください。 @@ -808,12 +855,12 @@ This action will abort any currently running synchronization. アクティビティを取得中... - + Fetching activities … アクティビティを取得中... - + Files from the ignore list as well as symbolic links are not synced. 除外ファイルリスト内のファイルやシンボリックリンクは同期されません。 @@ -864,32 +911,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. 続行すると、<b>これらの設定を削除</b>するようになります。 - + Continuing will mean <b>ignoring these settings</b>. 続行すると、<b>これらの設定を無視</b>するようになります。 - + 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>. 一部の設定は、このクライアントのより新しいバージョンで構成されており、このバージョンでは使用できない機能を使用しています。<br><br>%1<br><br>現在の構成ファイルは、<i>%2</i> に既にバックアップされています。 - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit 終了 - + Continue 続ける - + Error accessing the configuration file 設定ファイルのアクセスでエラーが発生しました @@ -899,12 +973,12 @@ This action will abort any currently running synchronization. %1の設定ファイルのアクセス中にエラーが発生しました。 ユーザーがファイルにアクセスできることを確認してください。 - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 %1 を終了 @@ -950,56 +1024,216 @@ This action will abort any currently running synchronization. ファイル %1 の更新日時が無効です。サーバにアップロードしないでください。 - + File Removed (start upload) %1 ファイルが削除されました(アップロード開始します)%1 - + File %1 has invalid modification time. Do not upload to the server. ファイル %1 の更新日時が無効です。サーバにアップロードしないでください。 - + Local file changed during syncing. It will be resumed. ローカルファイルが同期中に変更されました。再開します。 - - + + Local file changed during sync. ローカルのファイルが同期中に変更されました。 - + Network error: %1 ネットワークエラー: %1 - + Error updating metadata: %1 メタデータの更新中にエラーが発生しました: %1 - + The file %1 is currently in use ファイル %1 は現在使用中です - + The local file was removed during sync. 同期中にローカルファイルが削除されました。 - + Restoration failed: %1 復元に失敗しました: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database メタデータのデータベースへの書き込みに失敗 @@ -1017,12 +1251,12 @@ This action will abort any currently running synchronization. エンドツーエンドの暗号化パスフレーズを入力してください:<br> <br>ユーザー:%2<br>アカウント:%3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase E2Eパスフレーズを入力 @@ -1198,8 +1432,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! サーバーエラーが発生しました。PROPFIND応答がXML形式ではありません! @@ -1207,27 +1441,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 %1 ディレクトリを開くときにエラーが発生しました - + Directory not accessible on client, permission denied クライアントがディレクトリにアクセスできません、リクエストが拒否されました - + Directory not found: %1 ディレクトリが存在しません: %1 - + Filename encoding is not valid ファイル名のエンコードが正しくありません - + Error while reading directory %1 %1 ディレクトリの読み込み中にエラーが発生しました @@ -1235,83 +1469,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. 受信したトークンが無効です - - - - - - + + + + + + Please try again. 再度お試しください - + Invalid file path was provided. 無効なファイルパスが指定されました。 - + Could not find an account for local editing. ローカル編集用のアカウントが見つかりませんでした。 - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. 暗号化用のメタデータを生成できませんでした。フォルダーのロックを解除します。 @@ -1449,145 +1683,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. ローカルフォルダー %1 は存在しません。 - + %1 should be a folder but is not. %1 はフォルダーのはずですが、そうではないようです。 - + %1 is not readable. %1 は読み込み可能ではありません。 - + %1 and %n other file(s) have been removed. %1 とその他 %n 個のファイルが削除されました。 - + %1 has been removed. %1 names a file. %1 は削除されました。 - + %1 and %n other file(s) have been added. %1 および %n 個のファイルが追加されました。 - + %1 has been added. %1 names a file. %1 は追加されました。 - + %1 and %n other file(s) have been updated. %1 とその他 %n 個のファイルが更新されました。 - + %1 has been updated. %1 names a file. %1 が更新されました。 - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 を %2 にファイル名を変更し、その他 %n 個のファイル名を変更しました。 - + %1 has been renamed to %2. %1 and %2 name files. %1 の名前が %2 に変更されました。 - + %1 has been moved to %2 and %n other file(s) have been moved. %1 を %2 に移動し、その他 %n 個のファイルを移動しました。 - + %1 has been moved to %2. %1 は %2 に移動しました。 - + %1 has and %n other file(s) have sync conflicts. %1 と その他 %n 個のファイルが同期で衝突しました。 - + %1 has a sync conflict. Please check the conflict file! %1 が同期で衝突しています。コンフリクトファイルを確認してください。 - + %1 and %n other file(s) could not be synced due to errors. See the log for details. エラーにより、%1 と その他 %n 個のファイルが同期できませんでした。ログで詳細を確認してください。 - + %1 could not be synced due to an error. See the log for details. エラーにより %1 が未同期です。ログで詳細を確認してください。 - + %1 and %n other file(s) are currently locked. %1 および その他%n 個のファイルは現在ロックされています。 - + %1 is currently locked. %1は現在ロックされています。 - + Sync Activity 同期アクティビティ - + Could not read system exclude file システム上の除外ファイルを読み込めません - + A new folder larger than %1 MB has been added: %2. %1 MB より大きな新しいフォルダーが追加されました: %2 - + A folder from an external storage has been added. 外部ストレージからフォルダーが追加されました。 - + Please go in the settings to select it if you wish to download it. このフォルダーをダウンロードするには設定画面で選択してください。 - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. フォルダー %1 は作成されましたが、以前に同期から除外されました。 中のデータは同期されません。 - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. ファイル %1 は作成されましたが、以前に同期から除外されました。 このファイルは同期されません。 - + 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). @@ -1600,7 +1834,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a ファイルを削除することにした場合、所有者でない限り、ファイルは利用できなくなります。 - + 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. @@ -1620,17 +1854,17 @@ If this was an accident and you decide to keep your files, they will be re-synce これが操作ミスであり、ファイルを維持することにした場合、ファイルはサーバーから再同期されます。 - + Remove All Files? すべてのファイルを削除しますか? - + Remove all files すべてのファイルを削除 - + Keep files ファイルを保持 @@ -1666,22 +1900,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state フォルダーの状態をリセットできませんでした - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. 古い同期ジャーナル "%1" が見つかりましたが、削除できませんでした。それを現在使用しているアプリケーションが存在しないか確認してください。 - + (backup) (バックアップ) - + (backup %1) (%1をバックアップ) @@ -1691,27 +1925,27 @@ If this was an accident and you decide to keep your files, they will be re-synce 未定義の状態。 - + Undefined state. 未定義の状態。 - + Waiting to start syncing. 同期開始を待機中 - + Preparing for sync. 同期の準備中。 - + Sync is running. 同期を実行中です。 - + Sync finished with unresolved conflicts. 未解決のコンフリクトがある状態で同期が終了しました。 @@ -1731,62 +1965,62 @@ If this was an accident and you decide to keep your files, they will be re-synce ユーザーによる中止。 - + Last sync was successful. 前回の同期は成功しました。 - + Setup error. 設定エラー - + Sync request was cancelled. 同期がキャンセルされました - + Sync is paused. 同期を一時停止しました。 - + %1 (Sync is paused) %1 (同期を一時停止) - + No valid folder selected! 有効なフォルダーが選択されていません! - + The selected path does not exist! 選択されたパスは存在していません! - + The selected path is not a folder! 指定のパスは、フォルダーではありません! - + You have no permission to write to the selected folder! 選択されたフォルダーに書き込み権限がありません - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! ローカルフォルダー %1 にはすでに同期フォルダーとして利用されてるフォルダーを含んでいます。他のフォルダーを選択してください。 - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! ローカルフォルダー %1 には同期フォルダーとして利用されているフォルダーがあります。他のフォルダーを選択してください。 - + There is already a sync from the server to this local folder. Please pick another local folder! すでに同期されたフォルダーがあります。別のフォルダーを選択してください! @@ -1799,7 +2033,7 @@ If this was an accident and you decide to keep your files, they will be re-synce 同期フォルダーを追加 - + File ファイル @@ -1807,152 +2041,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder フォルダーを追加するためには、接続している必要があります。 - + Click this button to add a folder to synchronize. このボタンをクリックして同期フォルダーを追加してください。 - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. サーバーからフォルダーリスト取得中にエラーが発生しました。 - + Fetching folder list from server … サーバーからフォルダーリストを取得中… - + There are unresolved conflicts. Click for details. 未解決の競合があります。クリックで詳細。 - + Virtual file support is enabled. 仮想ファイルが有効になっています。 - + Signed out サインアウト - + Synchronizing VirtualFiles with local folder ローカルフォルダーに仮想ファイルで同期中 - + Synchronizing with local folder ローカルフォルダーと同期 - + Checking for changes in remote "%1" リモート "%1" での変更を確認中 - + Checking for changes in local "%1" ローカル "%1" での変更を確認中 - + Reconciling changes 変更の調整 - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" 同期中 %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) ダウンロード %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) アップロード %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%4 中 %3 完了) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 残り%5、%2中%1完了 、ファイル%4個中%3個完了 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 of %2, ファイル数 %3 of %4 - + file %1 of %2 %1 / %2 ファイル - + Waiting … 待機中… - + Waiting for %n other folder(s) … 他の %n のフォルダーを待機中… - + Preparing to sync … 同期の準備中… @@ -2184,13 +2422,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable 安定板 - + beta ベータ版 @@ -2242,32 +2480,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive デバッグアーカイブを作成 - + Server notifications that require attention. 注意が必要なサーバー通知を表示する - + Show call notification dialogs. トークの通知ダイアログを表示する - + You cannot disable autostart because system-wide autostart is enabled. システム全体の自動起動が有効になっているため、自動起動を無効にすることはできません。 - + Change update channel? 更新チャネルを変更しますか? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar これはアップデートをどちらのチャネルからダウンロードするのかを決めるだけで、パッケージをダウングレードすることはできないことに注意してください。その為、ベータ版から安定版へ変更しても、通常はすぐに古いパッケージに戻されるわけではありません。現在インストールされているベータ版よりも新しい安定版が出るまで待つ必要があります。 - + Change update channel 更新チャネルを変更 - + Cancel キャンセル - + Zip Archives Zipアーカイブ - + Debug Archive Created デバッグアーカイブを作成しました - + Debug archive is created at %1 %1 にデバッグアーカイブを作成しました @@ -2304,22 +2542,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required 共有用のパスワードが必要です - + Please enter a password for your link share: リンク共有のパスワードを入力してください。 - + Sharing error 共有エラー - + Could not retrieve or create the public link share. Error: %1 @@ -2555,6 +2793,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close 閉じる + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2890,60 +3133,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 コンテンツをすぐにダウンロードする代わりに &仮想ファイルを使用する %1 - + (experimental) (試験的) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. 仮想ファイルは、ローカルフォルダーのWindowsルートパーティションではサポートされていません。ドライブレターの下の有効なサブフォルダを選択してください。 - + %1 folder "%2" is synced to local folder "%3" %1 のフォルダー "%2" はローカルフォルダー "%3" と同期しています - + Sync the folder "%1" "%1" フォルダーを同期 - + Warning: The local folder is not empty. Pick a resolution! 警告: ローカルフォルダーは空ではありません。対処法を選択してください! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB 空き容量 %1 - + Virtual files are not available for the selected folder 選択したフォルダーで仮想ファイルが使用できません - + Local Sync Folder ローカル同期フォルダー - - + + (%1) (%1) - + There isn't enough free space in the local folder! ローカルフォルダーに十分な空き容量がありません。 @@ -3015,7 +3258,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 競合しているファイル %1 の修正日時を取得できません @@ -3047,144 +3291,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">正常に %1 へ接続されました:%2 バージョン %3 (%4)</font><br/><br/> - + Invalid URL 無効なURL - + Failed to connect to %1 at %2:<br/>%3 %2 の %1 に接続に失敗:<br/>%3 - + Timeout while trying to connect to %1 at %2. %2 の %1 へ接続を試みた際にタイムアウトしました。 - + Trying to connect to %1 at %2 … %2 の %1 へ接続を試みています… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. サーバーへの認証リクエストは "%1" へリダイレクトされました。URLが正しくありません。サーバーが間違って設定されています。 - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. サーバーによってアクセスが拒否されています。適切なアクセス権があるか検証するには、<a href="%1">ここをクリック</a>してブラウザーでサービスにアクセスしてください。 - + There was an invalid response to an authenticated WebDAV request 認証済みの WebDAV 要求に対する無効な応答がありました - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> ローカルの同期フォルダー %1 はすでに存在するため、同期の設定をしてください。<br/><br/> - + Creating local sync folder %1 … ローカル同期フォルダー %1 を作成中… - + OK OK - + failed. 失敗。 - + Could not create local folder %1 ローカルフォルダー %1 を作成できませんでした - + No remote folder specified! リモートフォルダーが指定されていません! - + Error: %1 エラー: %1 - + creating folder on Nextcloud: %1 Nextcloud上にフォルダーを作成中:%1 - + Remote folder %1 created successfully. リモートフォルダー %1 は正常に生成されました。 - + The remote folder %1 already exists. Connecting it for syncing. リモートフォルダー %1 はすでに存在します。同期のために接続しています。 - - + + The folder creation resulted in HTTP error code %1 フォルダーの作成はHTTPのエラーコード %1 で終了しました - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> 指定された資格情報が間違っているため、リモートフォルダーの作成に失敗しました!<br/>前に戻って資格情報を確認してください。</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">おそらく資格情報が間違っているため、リモートフォルダーの作成に失敗しました。</font><br/>前に戻り、資格情報をチェックしてください。</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. リモートフォルダー %1 の作成がエラーで失敗しました。<tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. %1 からリモートディレクトリ %2 への同期接続を設定しました。 - + Successfully connected to %1! %1への接続に成功しました! - + Connection to %1 could not be established. Please check again. %1 への接続を確立できませんでした。もう一度確認してください。 - + Folder rename failed フォルダー名の変更に失敗しました。 - + Cannot 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. フォルダーまたはその中のファイルが別のプログラムで開かれているため、フォルダーを削除およびバックアップできません。フォルダーまたはファイルを閉じて、再試行を押すか、セットアップをキャンセルしてください。 - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>ローカルの同期フォルダー %1 は正常に作成されました!</b></font> @@ -3207,12 +3451,12 @@ Note that using any logging command line options will override this setting.キャンセル - + Enable experimental feature? 試験的な機能を有効化しますか? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3229,12 +3473,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss これは新しい機能で、実験モードです。使用していて問題があったら報告をお願いします。 - + Enable experimental placeholder mode 試験的なプレースホルダーモードを有効にする - + Stay safe セキュリティーを確保 @@ -3263,162 +3507,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. シンボリックリンクは同期ではサポートされていません。 - + File is listed on the ignore list. ファイルは除外リストに登録されています。 - + File names ending with a period are not supported on this file system. ピリオドで終わるファイル名はこのファイルシステムでサポートされていません。 - + File names containing the character "%1" are not supported on this file system. ファイル名に含まれる文字 "%1" はこのファイルシステムでサポートされていません。 - + File name contains at least one invalid character ファイル名は少なくとも1つ以上の無効な文字を含んでいます - + The file name is a reserved name on this file system. ファイル名はファイルシステムに予約されています。 - + Filename contains trailing spaces. ファイル名末尾にスペースが含まれます。 - + Filename contains leading spaces. ファイル名先頭にスペースが含まれています。 - + Filename contains leading and trailing spaces. ファイル名の先頭と末尾にスペースが含まれています。 - + Filename is too long. ファイル名は長すぎます。 - + File/Folder is ignored because it's hidden. 隠しファイル/フォルダーのため無視されました - + Stat failed. 情報取得エラー - + Conflict: Server version downloaded, local copy renamed and not uploaded. コンフリクト: サーバーのバージョンがダウンロードされて、ローカルのコピーはファイル名を変更しアップロードしません。 - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. あなたのファイルシステムでファイル名をエンコードできません。 - + The filename is blacklisted on the server. このファイル名はサーバーにブロックされました。 - + File has extension reserved for virtual files. ファイルの拡張子は仮想ファイル用に予約されています。 - + size サイズ - + permission 権限 - + file id ファイルID - + Server reported no %1 サーバーから no %1 と通知がありました - + Cannot sync due to invalid modification time 修正日時が無効なため同期できません - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! フォルダをアップロードするときに競合したので、クリアされます! - + Conflict when uploading a file. It's going to get removed! フォルダをアップロードするときに競合したので、削除されます! - + Ignored because of the "choose what to sync" blacklist "選択されたものを同期する" のブラックリストにあるために無視されました - + Not allowed because you don't have permission to add subfolders to that folder そのフォルダーにサブフォルダーを追加する権限がありません - + Not allowed because you don't have permission to add files in that folder そのフォルダーにファイルを追加する権限がありません - + Not allowed to upload this file because it is read-only on the server, restoring サーバー上で読み取り専用のため、ファイルをアップロードできません。 - + Moved to invalid target, restoring 無効なターゲットに移動し、復元しました - + Not allowed to remove, restoring 削除、復元は許可されていません - + Error while reading the database データベースを読み込み中にエラーが発生しました - + Server replied with an error while reading directory "%1" : %2 サーバーでディレクトリ "%1" を読み取り中にエラーになりました: %2 @@ -3426,22 +3675,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time 修正日時が無効なためメタデータの更新時にエラーが発生 - + Error updating metadata: %1 メタデータの更新中にエラーが発生しました:%1 - + File is currently in use ファイルは現在使用中です @@ -3454,19 +3703,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. 暗号化情報がないため、ファイル%1をダウンロードできません。 - - + + File has changed since discovery ファイルは発見以降に変更されました - + Could not delete file record %1 from local DB @@ -3477,32 +3726,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss ローカルファイル名が競合しているため、ファイル %1 をダウンロードできませんでした - + File %1 can not be downloaded because of a local file name clash! ファイル %1 はローカルファイル名が衝突しているためダウンロードできません! - + The download would reduce free local disk space below the limit ダウンロードすることによりローカルディスクの空き容量が制限を下回ります。 - + Free space on disk is less than %1 ディスク空き容量が %1 よりも少なくなっています - + File was deleted from server ファイルはサーバーから削除されました - + The file could not be downloaded completely. このファイルのダウンロードは完了しませんでした - + The downloaded file is empty, but the server said it should have been %1. ダウンロードしたファイルは空ですが、サーバでは %1 であるはずです。 @@ -3512,18 +3761,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss %1 はローカルファイル名が衝突しているため保存できません! - - + + File %1 has invalid modified time reported by server. Do not save it. ファイル %1 のサーバから報告された修正日時が無効です。保存しないでください。 - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 メタデータの更新中にエラーが発生しました:%1 - + The file %1 is currently in use ファイル %1 は現在使用中です @@ -3544,7 +3798,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ファイル %1 を削除できません。エラー: %2 @@ -3555,16 +3809,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 フォルダー %1 を作成できません - + Error updating metadata: %1 メタデータの更新中にエラーが発生しました:%1 - + The file %1 is currently in use ファイル %1 は現在使用中です @@ -3572,7 +3831,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash %1 はローカルファイル名が衝突しているため削除できませんでした @@ -3585,46 +3844,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash ローカルファイル名が衝突しているため、ファイル %1 の名前を %2 に変更できません - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state お気に入りに設定エラー - - + + Error updating metadata: %1 メタデータの更新中にエラーが発生しました:%1 - + The file %1 is currently in use ファイル %1 は現在使用中です - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file ファイル名を変更できませんでした @@ -3645,7 +3909,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". 誤ったHTTPコードがサーバーから返されました。204 を期待しましたが、"%1 %2" が返りました。 @@ -3658,12 +3922,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 誤ったHTTPコードがサーバーから返されました。201のはずが、"%1 %2"が返りました。 - + Error writing metadata to the database: %1 メタデータのデータベースへの書き込みに失敗: %1 - + The file %1 is currently in use ファイル %1 は現在使用中です @@ -3671,42 +3935,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 名前を「%1」から「%2」へ変更できません。エラー: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". 誤ったHTTPコードがサーバーから返されました。201のはずが、"%1 %2"が返りました。 - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 メタデータの更新中にエラーが発生しました:%1 - + The file %1 is currently in use ファイル %1 は現在使用中です - + Error setting pin state お気に入りに設定エラー - + Error writing metadata to the database メタデータのデータベースへの書き込みに失敗 @@ -3896,7 +4160,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply 返信 @@ -3914,23 +4178,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 設定 - + %1 Settings This name refers to the application name e.g Nextcloud %1 設定 - + General 一般 - + Network ネットワーク - + Account アカウント @@ -3938,17 +4202,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link リンクを共有 - + Link share リンク共有 - + + Internal link + + + + Enter a note for the recipient 受信者へのメモを入力してください @@ -4024,7 +4293,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4033,132 +4302,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share コンテキストメニューの共有 - + Select new location … 新しい場所の選択... - + I shared something with you 私はあなたと何かを共有しました - - + + Share options 共有オプション - - + + Activity アクティビティ - + Copy private link to clipboard プライベートリンクをクリップボードにコピーする - + Send private link by email … メールでプライベートリンクを送信… + + + Expire in %1 minutes + remaining time before lock expire + %1 分で期限切れ + - + Leave this share - + Resharing this file is not allowed このファイルの再共有は許可されていません - + Resharing this folder is not allowed このフォルダーの再共有は許可されていません - - + + Copy public link 公開リンクのコピー - + Copy internal link 内部リンクをコピー - + + Encrypt + + + + Lock file ファイルをロック - + Unlock file ロックを解除 - + Locked by %1 %1 によってロックされました - - Expire in %1 minutes - remaining time before lock expire - %1 分で期限切れ - - - + Expires in %1 minutes remaining time before lock expires %1 分で期限切れ - + Edit 編集 - + Open in browser ブラウザーで開く - + Resolve conflict … 競合を解決する… - + Move and rename … 移動して名前を変更… - + Move, rename and upload … 移動、名前の変更、アップロード… - + Delete local changes ローカルの変更を削除する - + Move and upload … 移動してアップロード… - + Delete 削除 @@ -4376,63 +4682,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1(前のエラーのためにスキップされ、%2で再試行) - + Could not update file: %1 ファイルをアップデートできません: %1 - + Could not update virtual file metadata: %1 仮想ファイルのメタデータを更新できませんでした: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. 未解決の競合。 - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() %1 しか空き容量がありません、開始するためには少なくとも %2 は必要です。 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. ローカル同期データベースを開いたり作成できません。 同期フォルダーに書き込み権限があることを確認してください。 - + Using virtual files with suffix, but suffix is not set サフィックス付きの仮想ファイルを使用していますが、サフィックスが設定されていません - + Unable to read the blacklist from the local database ローカルデータベースからブラックリストを読み込みできません - + Unable to read from the sync journal. 同期ジャーナルから読み込みできません - + Cannot open the sync journal 同期ジャーナルを開くことができません @@ -4442,12 +4748,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss まもなく同期が再開されます。 - + Disk space is low: Downloads that would reduce free space below %1 were skipped. ディスク容量が少ない:%1以下の空き容量を減らすダウンロードはスキップされました。 - + There is insufficient space available on the server for some uploads. いくつかのアップロードのために、サーバーに十分なスペースがありません。 @@ -4516,59 +4822,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download ダウンロード - + Add account アカウントを追加 - + Open main dialog メインダイアログを開く - - + + Pause sync 同期を一時停止 - - + + Resume sync 同期を再開 - + Settings 設定 - + Help ヘルプ - + Exit %1 %1 を終了 - + Pause sync for all 全ての同期を一時停止 - + Resume sync for all すべての同期を再開 - + %1: %2 %1: %2 @@ -4576,24 +4882,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 デスクトップクライアント</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>バージョン %1. 詳細な情報は<a href='%2'>ここ</a>をクリックしてください。</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>仮想ファイルシステムプラグインを利用:%1</small></p> - + <p>This release was supplied by %1</p> <p>このリリースは%1によって提供されました</p> @@ -4601,22 +4907,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. プロバイダーの取得に失敗しました。 - + Failed to fetch search providers for '%1'. Error: %2 '%1'の検索プロバイダーの取得に失敗しました。 エラー: %2 - + Search has failed for '%2'. '%2' を検索できませんでした - + Search has failed for '%1'. Error: %2 '%1' を検索できませんでした。エラー: %2 @@ -4624,30 +4930,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads すべてのアップロードを再試行 + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal アカウント削除の確認 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>本当に <i>%1</i> アカウントへの接続を解除しますか? </p><p><b>Note:</b> この操作ではファイルは<b>削除されません</b>。</p> - + Remove connection 接続を外す - + Cancel 取消 @@ -4785,8 +5097,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time 修正日時が無効なためメタデータの更新時にエラーが発生 @@ -4794,8 +5106,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time 修正日時が無効なためメタデータの更新時にエラーが発生 @@ -4893,123 +5205,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version サポートされていないサーバーバージョン - + 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. アカウント %1 のサーバーは、サポートされていない古いバージョン %2 で実行しています。サポートされていないサーバーバージョンでこのクライアントを使用することはテストされておらず、潜在的な危険をはらんでいます。ご利用は自己責任でお願いいたします。 - + Disconnected 切断しました - + Disconnected from some accounts 一部のアカウントから切断されました - + Disconnected from %1 %1 から切断されました - + Disconnected from accounts: アカウントから切断: - + Account %1: %2 アカウント %1: %2 - + Please sign in サインインしてください - + Signed out サインアウト - + Account synchronization is disabled アカウントの同期は無効になっています - - + + Synchronization is paused 同期が一時停止しています - + Folder %1: %2 フォルダー %1: %2 - + Unresolved conflicts 未解決の競合 - + Up to date 最新です - + Error during synchronization 同期中のエラー - + There are no sync folders configured. 同期するフォルダーがありません。 - + No sync folders configured 同期フォルダーが設定されていません - + Checking for changes in remote "%1" リモート "%1" での変更を確認中 - + Checking for changes in local "%1" ローカル "%1" での変更を確認中 - + Syncing %1 of %2 (%3 left) 同期中 %2 中 %1 (残り %3) - + Syncing %1 of %2 %2 の %1 を同期しています - + Syncing %1 (%2 left) 同期中 %1 (残り %2) - + Syncing %1 同期中 %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5161,27 +5473,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss 新しいフォルダー - + You renamed %1 %1 の名前を変更しました - + You deleted %1 %1 を削除しました - + You created %1 %1 を作成しました - + You changed %1 %1 を変更しました - + Synced %1 %1 を同期しました @@ -5247,30 +5559,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss 既読にする + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share 新規共有に必要なパスワード - + Share password パスワードを共有 - + Sharing is disabled 共有は無効になっています - + This item cannot be shared. このアイテムは共有できません - + Sharing is disabled. 共有は無効になっています @@ -5286,7 +5674,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. データベースに接続できません @@ -5344,6 +5732,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 結果をさらに読み込む + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5407,67 +5811,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status オンラインステータス - + Online オンライン - + Away 離席中 - + Do not disturb 取り込み中 - + Mute all notifications 全ての通知をミュート - + Invisible オフライン - + Appear offline オフライン - + Status message ステータスメッセージ - + What is your status? 現在のオンラインステータスは? - + Clear status message after メッセージ有効期限 - + Cancel キャンセル - + Clear status message ステータスメッセージを消去 - + Set status message ステータスメッセージを設定 @@ -5551,24 +5955,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloudデスクトップのメインダイアログ - + Current account 現在のアカウント - - + + Resume sync for all 全ての同期を再開 - - + + Pause sync for all 全ての同期を一時停止 @@ -5578,22 +5982,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss ステータスを設定 - + Add account アカウントを追加 - + Add new account 新しいアカウントを追加 - + Settings 設定 - + Exit 終了 @@ -5602,11 +6006,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar 現在のユーザーアバター - - - Current account avatar - 現在のアバター - Current user status is online @@ -5618,70 +6017,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss 現在のユーザーステータスは取り込み中です - + + Current account avatar + 現在のアバター + + + Current account status is online 現在のステータスはオンラインです - + Current account status is do not disturb 現在のステータスは取り込み中です - + + %1 - File activity + %1 - ファイルアクティビティ + + + Account switcher and settings menu アカウントスイッチャーと設定メニュー - + Open local folder of current account 現在のアカウントのローカルフォルダーを開く - + Connected 接続しました - + Disconnected 切断しました - + Open Nextcloud Talk in browser Nextcloud Talk をブラウザーで開く - + More apps その他のアプリ - + Open %1 in browser %1をブラウザーで開く - + Unified search results list 統合検索結果 - - - %1 - File activity - %1 - ファイルアクティビティ - main.cpp - + System Tray not available システムトレイ利用不可 - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 は動作しているシステムトレイで必要です。XFCEを動作させている場合、<a href="http://docs.xfce.org/xfce/xfce4-panel/systray">以下の操作方法</a>に従ってください。そうでなければ、「trayer」のようなシステムトレイアプリケーションをインストールして、再度お試しください。 @@ -5689,7 +6093,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small><a href="%1">%2</a> %3, %4 のGitリビジョンからのビルド Qt %5, %6 を利用</small></p> @@ -5723,72 +6127,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted 削除済み - + Moved to %1 %1に移動済み - + Ignored 除外しました - + Filesystem access error ファイルシステムのアクセスエラー - + Error エラー - + Updated local metadata ローカルメタデータを更新しました - + Unknown 不明 - + downloading ダウンロード中 - + uploading アップロード中 - + deleting 削除しています - + moving 移動しています - + ignoring 除外: - + error エラー - + updating local metadata ローカルメタデータの更新中 diff --git a/translations/client_ko.ts b/translations/client_ko.ts index d2c51ccd7..6875265f6 100644 --- a/translations/client_ko.ts +++ b/translations/client_ko.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally 로컬에서 %1 열기 - + In %1 %1 안에 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions 더 많은 작업 표시 @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss 무시 + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list 활동 목록 @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu 상태 메시지 메뉴 지우기 @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity 활동 - + Sharing 공유 @@ -226,12 +236,12 @@ 이 플랫폼에서 휴지통으로 이동을 지원하지 않음 - + Error removing "%1": %2 "%1" 삭제중 오류 발생: %2 - + Could not remove folder "%1" 폴더 "%1"을(를) 지울 수 없음 @@ -321,7 +331,7 @@ 서버에서 잘못된 HTTP 코드를 반환했습니다. 204가 받아지는 대신 "1 %2"을 받았습니다. - + "%1 Failed to unlock encrypted folder %2". %1이(가) 암호화된 폴더 %2 해제에 실패함 @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. 파일 %1은 이미 %2에 의해 잠겼습니다. - + Lock operation on %1 failed with error %2 오류 %2로 인해 %1 잠금에 실패했습니다 - + Unlock operation on %1 failed with error %2 %2 오류로 인해 %1 잠금 해제에 실패했습니다 @@ -353,9 +363,9 @@ - - - + + + Cancel 취소 @@ -400,12 +410,12 @@ 이 폴더에 가상 파일 기능이 활성화된 것 같습니다. 종단간 암호화 된 가상 파일은 다운로드 할 수 없습니다. 종단간 암호화와 가상 파일 기능의 원활한 동작을 위해 암호화된 폴더가 "로컬에서 항상 사용 가능"한지 확인하십시오. - + End-to-end Encryption with Virtual Files 가상 파일과 종단간 암호화 - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ 폴더를 암호화하지 마십시오. - + Do not encrypt folder 폴더를 암호화하지 마십시오 - + Encrypt folder 폴더 암호화 - + No account configured. 설정한 계정이 없습니다. - - Display mnemonic - 니모닉 표시 + + Disable encryption + - End-to-end encryption has been enabled for this account - 이 계정에 종단간 암호화가 활성화됨 + Display mnemonic + 니모닉 표시 @@ -445,18 +455,23 @@ 암호화 사용 - + + End-to-end encryption has been enabled for this account + 이 계정에 종단간 암호화가 활성화됨 + + + Warning 경고 - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. 내용물이 있는 폴더는 암호화할 수 없습니다. 파일을 삭제하십시오. @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. 이 계정은 종단간 암호화를 지원합니다 - + Encryption failed 암호화 실패 - + Could not encrypt folder because the folder does not exist anymore 폴더가 더 이상 존재하지 않아 해당 폴더를 암호화 할 수 없음 - - + + Open folder 폴더 열기 - + Encrypt 암호화 - - + + Edit Ignored Files 무시된 파일 수정 - - + + Create new folder 새 폴더 생성 - - + + Availability 사용 가능 여부 - + Choose what to sync 동기화 대상 선택 - + Force sync now 강제 동기화 - + Restart sync 동기화 다시 시작 - + Resume sync 동기화 재개 - + Pause sync 동기화 일시 정지 - + Remove folder sync connection 동기화 폴더 연결 삭제 - + Disable virtual file support … 가상 파일 지원 비활성화 - + Enable virtual file support %1 … 가상 파일 지원 %1 활성화 - + (experimental) (실험적) - + Folder creation failed 폴더 생성 실패 - + <p>Could not create local folder <i>%1</i>.</p> <p>로컬 폴더를 만들 수 없음 <i>%1</i>. - + Confirm Folder Sync Connection Removal 동기화 폴더 연결 삭제 확인 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>폴더 <i>%1</i>과 동기화를 중지합니까?</p><p><b>참고:</b> 어떤 파일도 <b>삭제하지 않습니다.</b></p> - + Remove Folder Sync Connection 동기화 폴더 연결 삭제 - + Disable virtual file support? 가상 파일 지원을 비활성화합니까? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ This action will abort any currently running synchronization. 이 동작은 진행중인 동기화를 모두 취소합니다. - + Disable support 지원 비활성화 @@ -606,144 +621,176 @@ This action will abort any currently running synchronization. 종단간 암호화 연상 기호 - + End-to-end encryption mnemonic 종단간 암호화 연상 기호 - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). 암호화 신원을 보호하기 위해 12개의 사전 단어를 연상 기호로 사용하여 암호화합니다. 이 내용을 기록하고 안전하게 보관하십시오. 휴대전화나 노트북과 같은 다른 기기를 계정에 추가해야합니다. - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running 동기화 - + The syncing operation is running.<br/>Do you want to terminate it? 동기화가 진행중입니다.<br/>종료하시겠습니까? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %2의 %1 (%3%) 사용 중. 네트워크 탑재 또는 공유 폴더를 포함한 일부 폴더에는 다른 제한이 있을 수 있습니다. - + %1 of %2 in use %2의 %1 사용중 - + Currently there is no storage usage information available. 현재 사용 가능한 저장소 사용량 정보가 없습니다. - + %1 in use %1 사용중 - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. 서버 버전 %1은 오래되어 지원되지 않습니다. 책임 하에 진행하십시오. - + Connected to %1. %1에 연결되었습니다. - + Server %1 is temporarily unavailable. 서버 %1을 일시적으로 사용할 수 없습니다. - + Server %1 is currently in maintenance mode. 서버 %1이 현재 유지 보수 모드입니다. - + Signed out from %1. %1에서 로그아웃했습니다. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. 브라우저에서 권한을 얻습니다. 브라우저를 다시 열려면 <a href='%1'>여기</a>를 클릭하십시오. - + Connecting to %1 … %1에 연결 중... - + No connection to %1 at %2. %1와 %2에 연결이 없습니다. - + Server configuration error: %1 at %2. 서버 설정 오류: %2에 있는 %1 - + No %1 connection configured. %1 연결이 설정되지 않았습니다. - + There are folders that were not synchronized because they are too big: 사이즈가 너무 커서 동기화 되지 않은 폴더가 있습니다: - + There are folders that were not synchronized because they are external storages: 외부 저장소이므로 동기화되지 않은 폴더가 있습니다: - + There are folders that were not synchronized because they are too big or external storages: 사이즈가 너무 크거나 외부 저장소이므로 동기화되지 않은 폴더가 있습니다: - + Confirm Account Removal 계정 삭제 확인 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>계정 <i>%1</i>과 연결을 삭제합니까?</p><p><b>참고:</b> 어떤 파일도 </b>삭제하지 않습니다.</b></p> - + Remove connection 연결 삭제 - - + This account supports end-to-end encryption 이 계정은 종단간 암호화를 지원합니다. - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. 더 많은 활동을 보려면 액티비티 앱을 여십시오. @@ -808,12 +855,12 @@ This action will abort any currently running synchronization. 활동 불러오는 중... - + Fetching activities … 활동 불러오는 중... - + Files from the ignore list as well as symbolic links are not synced. 무시 목록의 파일과 심볼릭 링크는 동기화되지 않습니다. @@ -864,32 +911,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. 계속 진행할 경우 <b>본 설정이 삭제됩니다</b>. - + Continuing will mean <b>ignoring these settings</b>. 계속 진행할 경우 <b>본 설정이 무시됩니다</b>. - + 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>. 일부 항목은 더 높은 버전에서 설정되었으며 이 버전에서 사용 가능하지 않는 기능을 이용합니다. <br><br>%1<br><br> 현재 설정은 <i>%2</i>에 백업되었습니다. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit 끝내기 - + Continue 계속 - + Error accessing the configuration file 설정 파일 액세스 오류 @@ -899,12 +973,12 @@ This action will abort any currently running synchronization. 설정 파일%1을 액세스하는 중 오류가 발생했습니다. 사용자가 파일에 액세스 할 수 있는지 확인하십시오. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. %1의 구성 파일에 액세스하는 동안 오류가 발생했습니다. 시스템 계정으로 파일에 액세스할 수 있는지 확인하십시오. - + Quit %1 %1 끝내기 @@ -950,56 +1024,216 @@ This action will abort any currently running synchronization. 파일 %1의 '수정 시간'값이 올바르지 않습니다. 이 파일을 서버에 업로드하지 마십시오. - + File Removed (start upload) %1 파일 삭제됨 (업로드 시작) %1 - + File %1 has invalid modification time. Do not upload to the server. 파일 %1의 '수정 시간'값이 올바르지 않습니다. 이 파일을 서버에 업로드하지 마십시오. - + Local file changed during syncing. It will be resumed. 동기화 중 로컬 파일이 변경되었습니다. 곧 재개됩니다. - - + + Local file changed during sync. 동기화 중 로컬 파일이 변경되었습니다. - + Network error: %1 네트워크 오류: %1 - + Error updating metadata: %1 메타데이터 갱신 오류: %1 - + The file %1 is currently in use 파일 %1(이)가 현재 사용 중입니다. - + The local file was removed during sync. 동기화 중 로컬 파일이 삭제되었습니다. - + Restoration failed: %1 복원 실패: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database 데이터베이스에 메타데이터를 쓰는 중 오류가 발생했습니다. @@ -1017,12 +1251,12 @@ This action will abort any currently running synchronization. 종단간의 암호화 암구호를 입력하십시오: <br><br>사용자: %2<br>계정: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase E2E 암구호 입력 @@ -1198,8 +1432,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! 서버 오류: PROPFIND 응답이 XML 형식이 아닙니다! @@ -1207,27 +1441,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 디렉토리 %1를 여는 중 오류 발생 - + Directory not accessible on client, permission denied 디렉토리 접근 불가, 권한이 없음 - + Directory not found: %1 디렉토리를 찾을 수 없음: &1 - + Filename encoding is not valid 파일 이름 인코딩이 올바르지 않습니다. - + Error while reading directory %1 디렉토리 %1를 읽는 중 오류 발생 @@ -1235,83 +1469,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. 잘못된 토큰을 수신했습니다. - - - - - - + + + + + + Please try again. 다시 시도하십시오. - + Invalid file path was provided. 잘못된 파일 경로를 지정했습니다. - + Could not find an account for local editing. 로컬 편집을 위한 계정을 찾지 못했습니다. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. 로컬에서 편집하려는 파일을 찾지 못했습니다. 해당 파일의 경로가 유효한지, 로컬에서 동기화되었는지 확인하십시오. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. 로컬에서 편집하려는 파일을 찾지 못했습니다. 해당 파일이 선택적 동기화에 의해 제외되지 않았는지 확인하십시오. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. 암호화 메타데이터를 생성할 수 없습니다. 폴더 해제 중. @@ -1449,145 +1683,145 @@ OpenSSL 라이브러리 이슈일 수 있습니다. OCC::Folder - + Local folder %1 does not exist. 로컬 폴더 %1가 존재하지 않습니다. - + %1 should be a folder but is not. %1은 폴더여야 하지만 그렇지 않습니다. - + %1 is not readable. %1을 읽을 수 없습니다. - + %1 and %n other file(s) have been removed. %1과 %n 다른 파일(들)이 삭제되었습니다. - + %1 has been removed. %1 names a file. %1이 삭제되었습니다. - + %1 and %n other file(s) have been added. %1과 %n 다른 파일(들)이 추가되었습니다. - + %1 has been added. %1 names a file. %1이 추가되었습니다. - + %1 and %n other file(s) have been updated. %1과 %n 다른 파일(들)이 업데이트 되었습니다. - + %1 has been updated. %1 names a file. %1이 업데이트 되었습니다. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1의 이름이 %2로 변경되었고 %n 다른 파일(들)의 이름이 변경되었습니다. - + %1 has been renamed to %2. %1 and %2 name files. %1의 이름이 %2로 변경되었습니다. - + %1 has been moved to %2 and %n other file(s) have been moved. %1이 %2로 이동되었고 %n 다른 파일(들)의 이동되었습니다. - + %1 has been moved to %2. %1이 %2로 이동되었습니다. - + %1 has and %n other file(s) have sync conflicts. %1과 %n 다른 파일(들)의 동기화가 충돌합니다. - + %1 has a sync conflict. Please check the conflict file! %1의 동기화가 충돌합니다. 충돌하는 파일을 확인하십시오. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1과 %n 다른 파일(들)이 오류때문에 동기화되지 않았습니다. 자세한 내용은 로그를 참조하십시오. - + %1 could not be synced due to an error. See the log for details. %1이 오류때문에 동기화되지 않았습니다. 자세한 내용은 로그를 참조하십시오. - + %1 and %n other file(s) are currently locked. %1과 %n 다른 파일(들)이 잠겨있습니다. - + %1 is currently locked. %1이 잠겨있습니다. - + Sync Activity 동기화 활동 - + Could not read system exclude file 시스템 제외 파일을 읽을 수 없습니다. - + A new folder larger than %1 MB has been added: %2. %1 MB보다 큰 폴더가 추가되었습니다: %2. - + A folder from an external storage has been added. 외부 저장소의 폴더가 추가되었습니다. - + Please go in the settings to select it if you wish to download it. 다운로드하려면 설정으로 이동하여 선택하십시오. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. %1 폴더가 생성되었으나 이전에 동기화에서 제외되었습니다. 그 안의 데이터는 동기화되지 않습니다. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. %1 파일이 생성되었으나 이전에 동기화에서 제외되었습니다. 동기화되지 않습니다. - + 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). @@ -1600,7 +1834,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a 파일을 삭제하기로 결정한 경우 소유자가 아닌 한 해당 파일을 사용할 수 없습니다. - + 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. @@ -1620,17 +1854,17 @@ If this was an accident and you decide to keep your files, they will be re-synce 이 동작이 우연이고 파일을 유지하고자 할 경우, 서버로부터 재동기화 될 것입니다. - + Remove All Files? 모두 삭제합니까? - + Remove all files 모두 삭제 - + Keep files 파일 유지 @@ -1666,22 +1900,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state 폴더 상태를 초기화할 수 없습니다. - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. 오래된 동기화 저널 "%1"을 찾았지만 제거 할 수 없습니다. 현재 사용중인 응용 프로그램이 없는지 확인하십시오. - + (backup) (백업) - + (backup %1) (백업 %1) @@ -1691,27 +1925,27 @@ If this was an accident and you decide to keep your files, they will be re-synce 정의되지 않은 상태 - + Undefined state. 정의되지 않은 상태입니다. - + Waiting to start syncing. 동기화 시작을 기다리는 중 - + Preparing for sync. 동기화 준비 중 - + Sync is running. 동기화 진행 중 - + Sync finished with unresolved conflicts. 동기화 성공. 해결되지 않은 충돌이 있습니다. @@ -1731,62 +1965,62 @@ If this was an accident and you decide to keep your files, they will be re-synce 사용자 중단 - + Last sync was successful. 마지막 동기화에 성공했습니다. - + Setup error. 설정 오류입니다. - + Sync request was cancelled. 동기화 요청이 취소되었습니다. - + Sync is paused. 동기화 일시 정지됨 - + %1 (Sync is paused) %1 (동기화 일시 정지됨) - + No valid folder selected! 올바른 폴더가 선택되지 않았습니다! - + The selected path does not exist! 선택한 경로가 존재하지 않습니다! - + The selected path is not a folder! 선택된 경로는 폴더가 아닙니다! - + You have no permission to write to the selected folder! 선택된 폴더에 쓸 권한이 없습니다. - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! 로컬 폴더 %1에 폴더 동기화 연결에 사용된 폴더가 이미 있습니다. 다른 폴더를 선택해주세요! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! 로컬 폴더 %1에 폴더 동기화 연결에 사용된 폴더에 이미 포함되어 있습니다. 다른 폴더를 선택해주세요! - + There is already a sync from the server to this local folder. Please pick another local folder! 서버에서 이 로컬 폴더로의 동기화가 이미 있습니다. 다른 로컬 폴더를 선택하십시오! @@ -1799,7 +2033,7 @@ If this was an accident and you decide to keep your files, they will be re-synce 동기화 폴더 연결 추가 - + File 파일 @@ -1807,152 +2041,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder 폴더를 추가하려면 연결되어 있어야합니다. - + Click this button to add a folder to synchronize. 동기화를 위해 폴더를 추가하려면 이 버튼을 클릭하십시오. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. 서버에서 폴더 목록을 불러오는 중 오류가 발생했습니다. - + Fetching folder list from server … 서버에서 폴더 목록을 가져오는 중... - + There are unresolved conflicts. Click for details. 해결되지 않은 충돌이 있습니다. 자세한 내용을 보려면 클릭하십시오. - + Virtual file support is enabled. 가상 파일 지원이 활성화되었습니다. - + Signed out 로그아웃 - + Synchronizing VirtualFiles with local folder 가상 파일을 로컬 폴더에 동기화 - + Synchronizing with local folder 로컬 폴더와 동기화 - + Checking for changes in remote "%1" 원격 "%1"의 변경 사항 확인 중 - + Checking for changes in local "%1" 로컬 "%1"의 변경 사항 확인 중 - + Reconciling changes 변경 사항 조정 중 - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" %1 동기화 중 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) 다운로드 %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) 업로드 %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%4의 %3) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" 수 초 남음, %2의 %1, %4의 파일 %3 - + %5 left, %1 of %2, file %3 of %4 %5 남음, %2의 %1, %4의 파일 %3 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %2의 %1, %4의 파일 %3 - + file %1 of %2 %2의 파일 %1 - + Waiting … 기다리는 중... - + Waiting for %n other folder(s) … %n 다른 폴더(들)을 기다리는 중... - + Preparing to sync … 동기화 준비 중... @@ -2184,13 +2422,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable 안정판 - + beta 베타 @@ -2242,32 +2480,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive 디버그 아카이브 만들기 - + Server notifications that require attention. 주의가 필요한 서버 알림 - + Show call notification dialogs. 통화 알림을 대화 상자에 표시하기. - + You cannot disable autostart because system-wide autostart is enabled. 시스템 단위 자동 시작이 활성화되어 있으므로 자동 시작을 비활성화할 수 없습니다. - + Change update channel? 업데이트 채널을 바꾸시겠습니까? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar 채널 선택은 무엇으로 업그레이드를 할 지 결정하며 다운그레이드는 없습니다. 따라서, 베타 체널에서 안정화 채널로 변경할 경우 대개 버전을 즉시 변경할 수 없으며 현재 설치된 베타 버전보다 더 최신인 안정화 버전이 출시될 때 까지 기다려야 합니다. - + Change update channel 업데이트 채널 변경 - + Cancel 취소 - + Zip Archives 아카이브 압축 - + Debug Archive Created 디버그 아카이브가 생성됨 - + Debug archive is created at %1 디버그 아카이브가 %1에 생성됨 @@ -2304,22 +2542,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required 공유를 위한 암호가 필요함 - + Please enter a password for your link share: 내 링크 공유를 위한 암호를 입력하십시오: - + Sharing error 오류 공유 - + Could not retrieve or create the public link share. Error: %1 @@ -2557,6 +2795,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close 닫기 + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2893,61 +3136,61 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 컨텐츠를 즉시 다운로드 하는 대신 &가상 파일을 사용하십시오 %1 - + (experimental) (실험적) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. 가상 파일은 윈도우 파티션 루트에 로컬 폴더로 지원되지 않습니다. 드라이브 문자가 지정된 유효한 하위 폴더를 선택하십시오. - + %1 folder "%2" is synced to local folder "%3" %1 폴더 "%2"(이)가 로컬 폴더 '%3'(으)로 동기화되었습니다. - + Sync the folder "%1" 폴더 '%1' 동기화 - + Warning: The local folder is not empty. Pick a resolution! 경고: 로컬 폴더가 비어있지 않습니다. 해결 방법을 선택하십시오! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 남은 공간 - + Virtual files are not available for the selected folder 가상 파일을 선택한 폴더에서 사용할 수 없음 - + Local Sync Folder 로컬 동기화 폴더 - - + + (%1) (%1) - + There isn't enough free space in the local folder! 로컬 폴더에 공간이 부족합니다! @@ -3019,7 +3262,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 %1(으)로 인해 파일의 수정 시각을 불러올 수 없음 @@ -3051,144 +3295,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">%1에 성공적으로 연결되었습니다: %2 버전 %3 (%4)</font><br/><br/> - + Invalid URL 잘못된 URL - + Failed to connect to %1 at %2:<br/>%3 %2에서 %1와 연결이 실패했습니다:<br/>%3 - + Timeout while trying to connect to %1 at %2. %2에서 %1와 연결을 시도하는 중 시간이 만료되었습니다. - + Trying to connect to %1 at %2 … %2에서 %1와 연결을 시도하는 중... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. 서버에 대한 인증 된 요청이 '%1'로 리디렉션되었습니다. URL이 잘못되어 서버가 잘못 구성되었습니다. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. 서버에서 액세스가 금지되었습니다. 올바른 액세스 권한이 있는지 확인하려면 <a href="%1">여기</a>를 클릭하여 브라우저로 서비스에 액세스하십시오. - + There was an invalid response to an authenticated WebDAV request 인증된 WebDAV 요청에 대한 응답이 잘못되었습니다. - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> 로컬 동기화 폴더 %1이 이미 존재하며, 동기화 하도록 설정했습니다.<br/><br/> - + Creating local sync folder %1 … 로컬 동기화 폴더 %1 생성 중... - + OK 확인 - + failed. 실패 - + Could not create local folder %1 로컬 폴더 %1을 만들 수 없음 - + No remote folder specified! 원격 폴더가 지정되지 않음 - + Error: %1 오류: %1 - + creating folder on Nextcloud: %1 Nextcloud에 폴더 생성 중: %1 - + Remote folder %1 created successfully. 원격 폴더 %1ㅣ 성공적으로 생성되었습니다. - + The remote folder %1 already exists. Connecting it for syncing. 원격 폴더 %1이 이미 존재합니다. 동기화를 위해 연결합니다. - - + + The folder creation resulted in HTTP error code %1 폴더 생성으로 인해 HTTP 오류 코드 %1이 발생했습니다. - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> 제공된 자격 증명이 잘못되어 원격 폴더 생성에 실패했습니다.<br/>돌아가서 자격 증명을 확인하십시오.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">제공된 자격 증명이 잘못되어 원격 폴더 생성에 실패했을 수 있습니다.</font><br/>돌아가서 자격 증명을 확인하십시오.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. 원격 폴더 %1 생성이 오류 <tt>%2</tt>로 인해 실패했습니다. - + A sync connection from %1 to remote directory %2 was set up. %1에서 원격 디렉토리 %2에 대한 동기화 연결이 설정되었습니다. - + Successfully connected to %1! %1와 성공적으로 연결되었습니다. - + Connection to %1 could not be established. Please check again. %1와 연결을 수립할 수 없습니다. 다시 확인해주십시오. - + Folder rename failed 폴더 이름을 바꿀 수 없음 - + Cannot 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. 폴더 나 폴더의 파일이 다른 프로그램에서 열려있어 폴더를 제거하고 백업 할 수 없습니다. 폴더 혹은 파일을 닫고 다시 시도하거나 설정을 취소하십시오. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>로컬 동기화 폴더 %1이 성공적으로 생성되었습니다!</b></font> @@ -3211,12 +3455,12 @@ Note that using any logging command line options will override this setting.취소 - + Enable experimental feature? 실험적 기능을 활성화합니까? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3233,12 +3477,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 본 기능은 새롭고 실험적인 모드입니다. 사용을 결정했다면, 발생하는 문제들을 보고해주십시오. - + Enable experimental placeholder mode 실험적인 placeholder 모드 활성화 - + Stay safe 안전하게 머무르기 @@ -3267,162 +3511,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. 심볼릭 링크는 동기화에서 지원되지 않습니다. - + File is listed on the ignore list. 파일이 무시 목록에 추가되었습니다. - + File names ending with a period are not supported on this file system. 마침표로 끝나는 파일 이름은 이 파일 시스템에서 지원되지 않습니다. - + File names containing the character "%1" are not supported on this file system. "%1" 문자가 포함된 파일 이름은 이 파일 시스템에서 지원되지 않습니다. - + File name contains at least one invalid character 파일 이름에 잘못된 글자가 한 자 이상 있음 - + The file name is a reserved name on this file system. 해당 파일 이름은 이 파일 시스템에서 예약된 이름입니다. - + Filename contains trailing spaces. 파일 이름 뒤에 공백이 있습니다. - + Filename contains leading spaces. 파일 이름에 선행 공백이 있습니다. - + Filename contains leading and trailing spaces. 파일 이름에 선행 공백과 후행 공백이 있습니다. - + Filename is too long. 파일 이름이 너무 깁니다. - + File/Folder is ignored because it's hidden. 파일/폴더가 숨겨져 있으므로 무시됩니다. - + Stat failed. 스탯 실패 - + Conflict: Server version downloaded, local copy renamed and not uploaded. 충돌: 서버 버전이 다운로드되었으며 로컬 사본의 이름이 바뀌었고 업로드되지 않았습니다. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. 내 파일 시스템에서 파일 이름을 인코딩 할 수 없습니다. - + The filename is blacklisted on the server. 파일 이름이 서버 블랙리스트에 있습니다. - + File has extension reserved for virtual files. 파일이 가상 파일에 예약된 확장자를 가짐 - + size 크기 - + permission 권한 - + file id 파일 id - + Server reported no %1 서버가 %1이(가) 없다고(아니라고) 보고함 - + Cannot sync due to invalid modification time 유효하지 않은 수정 시간으로 인해 동기화할 수 없습니다. - + Error while deleting file record %1 from the database 파일 레코드 %1(을)를 데이터베이스에서 제거하는 중 오류 발생 - + Conflict when uploading a folder. It's going to get cleared! 폴더를 업로드 하던 중 충돌이 발생했습니다. 해당 폴더는 비워질 것입니다. - + Conflict when uploading a file. It's going to get removed! 파일을 업로드 하던 중 충돌이 발생했습니다. 해당 파일은 제거될 것입니다. - + Ignored because of the "choose what to sync" blacklist "동기화 할 대상 선택" 블랙리스트로 인해 무시되었습니다. - + Not allowed because you don't have permission to add subfolders to that folder 해당 폴더에 하위 폴더를 추가 할 수 있는 권한이 없기 때문에 허용되지 않습니다. - + Not allowed because you don't have permission to add files in that folder 해당 폴더에 파일을 추가 할 권한이 없으므로 허용되지 않습니다. - + Not allowed to upload this file because it is read-only on the server, restoring 이 파일은 서버에서 읽기 전용이므로 업로드 할 수 없습니다. 복구 - + Moved to invalid target, restoring 유효하지 않은 목적지로 옮겨짐, 복구 - + Not allowed to remove, restoring 삭제가 허용되지 않음, 복구 - + Error while reading the database 데이터베이스를 읽는 중 오류 발생 - + Server replied with an error while reading directory "%1" : %2 서버가 디렉토리 '%1'을(를) 읽는 중 오류로 응답함: %2 @@ -3430,22 +3679,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB 로컬 데이터베이스에서 파일 %1을(를) 삭제할 수 없음 - + Error updating metadata due to invalid modification time 유효하지 않은 수정 시간으로 인한 메타데이터 업데이트 오류 - + Error updating metadata: %1 메타데이터 업데이트 오류: %1 - + File is currently in use 파일이 현재 사용 중입니다. @@ -3458,19 +3707,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss 로컬 데이터베이스에서 파일 %1을(를) 불러올 수 없음 - + File %1 cannot be downloaded because encryption information is missing. 암호화 정보가 없어서 %1 파일을 다운로드 할 수 없습니다. - - + + File has changed since discovery 발견 이후 파일이 변경되었습니다. - + Could not delete file record %1 from local DB 로컬 데이터베이스에서 파일 레코드 %1을(를) 제거할 수 없음 @@ -3481,32 +3730,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss 로컬 파일 이름 충돌로 인해 %1 파일을 다운로드 할 수 없습니다! - + File %1 can not be downloaded because of a local file name clash! 로컬 파일 이름 충돌로 인해 %1 파일을 다운로드 할 수 없습니다! - + The download would reduce free local disk space below the limit 다운로드하면 사용 가능한 로컬 디스크 공간이 제한 밑으로 줄어 듭니다. - + Free space on disk is less than %1 디스크의 여유 공간이 %1보다 작습니다. - + File was deleted from server 파일이 서버에서 삭제되었습니다. - + The file could not be downloaded completely. 파일을 완전히 다운로드 할 수 없습니다. - + The downloaded file is empty, but the server said it should have been %1. 서버는 %1였으나 다운로드한 파일이 비어 있음. @@ -3516,18 +3765,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 로컬 파일 이름 충돌로 인해 %1 파일을 저장할 수 없습니다! - - + + File %1 has invalid modified time reported by server. Do not save it. %1 파일에 서버에서 보고된 유효하지 않은 수정 시간이 있습니다. 저장하지 마십시오. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 메타데이터 갱신 오류: %1 - + The file %1 is currently in use %1 파일이 현재 사용 중입니다. @@ -3548,7 +3802,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 파일 %1을 삭제하지 못했습니다, 오류: %2 @@ -3559,16 +3813,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 폴더 %1을 만들 수 없음 - + Error updating metadata: %1 메타데이터 갱신 오류: %1 - + The file %1 is currently in use 파일 %1(이)가 현재 사용 중입니다. @@ -3576,7 +3835,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash 로컬 파일 이름 충돌로 인해 %1을 삭제할 수 없습니다. @@ -3589,46 +3848,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash 로컬 파일 이름 충돌로 인해 파일 %1의 이름을 %2로 바꿀 수 없습니다. - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB 로컬 데이터베이스에서 파일 %1을(를) 불러올 수 없음 - + Error setting pin state 핀 상태 설정 오류 - - + + Error updating metadata: %1 메타데이터 갱신 오류: %1 - + The file %1 is currently in use 파일 %1(이)가 현재 사용 중입니다. - - + + Could not delete file record %1 from local DB 로컬 데이터베이스에서 파일 레코드 %1을(를) 제거할 수 없음 - + Failed to propagate directory rename in hierarchy - + Failed to rename file 파일 이름을 바꾸지 못했습니다. @@ -3649,7 +3913,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". 서버에서 잘못된 HTTP 코드를 반환했습니다. 204가 받아지는 대신 "1 %2"을 받았습니다. @@ -3662,12 +3926,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 서버에서 잘못된 HTTP 코드를 반환했습니다. 201가 받아지는 대신 "1 %2"을 받았습니다. - + Error writing metadata to the database: %1 데이터베이스에 메타 데이터를 쓰는 동안 오류 발생: %1 - + The file %1 is currently in use 파일 %1(이)가 현재 사용 중입니다. @@ -3675,42 +3939,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 파일 %1의 이름을 %2로 바꾸지 못했습니다, 오류: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". 서버에서 잘못된 HTTP 코드를 반환했습니다. 201가 받아지는 대신 "1 %2"을 받았습니다. - + could not get file %1 from local DB 로컬 데이터베이스에서 파일 %1을(를) 불러올 수 없음 - + Could not delete file record %1 from local DB 로컬 데이터베이스에서 파일 레코드 %1을(를) 제거할 수 없음 - + Error updating metadata: %1 메타데이터 갱신 오류: %1 - + The file %1 is currently in use 파일 %1(이)가 현재 사용 중입니다. - + Error setting pin state 핀 상태 설정 오류 - + Error writing metadata to the database 데이터베이스에 메타데이터를 쓰는 중 오류가 발생했습니다. @@ -3900,7 +4164,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply 답장 @@ -3918,23 +4182,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 설정 - + %1 Settings This name refers to the application name e.g Nextcloud %1 설정 - + General 일반 - + Network 네트워크 - + Account 계정 @@ -3942,17 +4206,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link 링크 공유 - + Link share 링크 공유 - + + Internal link + + + + Enter a note for the recipient 메모 입력 @@ -4028,7 +4297,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4037,132 +4306,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share 컨텍스트 메뉴 공유 - + Select new location … 새 위치 선택 ... - + I shared something with you 당신과 공유합니다. - - + + Share options 공유 옵션 - - + + Activity 활동 - + Copy private link to clipboard 클립보드로 개인 링크 주소 복사 - + Send private link by email … 이메일로 개인 링크 보내기 ... + + + Expire in %1 minutes + remaining time before lock expire + %1분 내에 만료됨 + - + Leave this share 이 공유에서 떠나기 - + Resharing this file is not allowed 이 파일을 다시 공유할 수 없습니다. - + Resharing this folder is not allowed 이 폴더를 다시 공유할 수 없습니다. - - + + Copy public link 공개 링크 복사 - + Copy internal link 내부 링크 복사 - + + Encrypt + + + + Lock file 파일 잠금 - + Unlock file 파일 잠금 해제 - + Locked by %1 %1에 의해 잠김 - - Expire in %1 minutes - remaining time before lock expire - %1분 내에 만료됨 - - - + Expires in %1 minutes remaining time before lock expires %1분 내에 만료됨 - + Edit 편집 - + Open in browser 브라우저에서 열기 - + Resolve conflict … 문제 해결 ... - + Move and rename … 이동 및 이름 변경 ... - + Move, rename and upload … 이동, 이름 변경 및 업로드 ... - + Delete local changes 로컬 변경 사항 삭제 - + Move and upload … 이동 및 업로드 ... - + Delete 삭제 @@ -4380,63 +4686,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (이전 오류로 인해 스킵되었으며 %2에서 다시 시도) - + Could not update file: %1 파일을 업데이트할 수 없음: %1 - + Could not update virtual file metadata: %1 가상 파일 메타데이터를 업데이트할 수 없음: %1 - + Could not update file metadata: %1 파일 메타데이터를 업로드할 수 없음: %1 - + Could not set file record to local DB: %1 로컬 데이터베이스에서 파일 레코드 %1을(를) 설정할 수 없음 - + Unresolved conflict. 해결되지 않은 충돌 - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() %1 만 사용할 수 있습니다. 시작하려면 %2 이상이 필요합니다 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. 로컬 동기화 데이터베이스를 열거나 만들 수 없습니다. 동기화 폴더에 대한 쓰기 권한이 있는지 확인하십시오. - + Using virtual files with suffix, but suffix is not set 가상 파일에 접미사를 사용 중이나, 접미사가 설정되지 않음 - + Unable to read the blacklist from the local database 로컬 데이터베이스에서 블랙리스트를 읽을 수 없습니다. - + Unable to read from the sync journal. 동기화 저널에서 읽을 수 없습니다. - + Cannot open the sync journal 동기화 저널을 열 수 없습니다. @@ -4446,12 +4752,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 동기화가 곧 재개됩니다. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. 디스크 공간이 부족합니다. 여유 공간이 %1 미만으로 남으면 다운로드를 건너 뜁니다. - + There is insufficient space available on the server for some uploads. 일부 업로드를 위해 서버에 사용 가능한 공간이 부족합니다. @@ -4520,59 +4826,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download 다운로드 - + Add account 계정 추가 - + Open main dialog 메인 대화 상자 열기 - - + + Pause sync 동기화 일시 정지 - - + + Resume sync 동기화 재개 - + Settings 설정 - + Help 도움말 - + Exit %1 %1 끝내기 - + Pause sync for all 전체 동기화 일시 정지 - + Resume sync for all 전체 동기화 재개 - + %1: %2 %1: %2 @@ -4580,24 +4886,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 데스크톱 클라이언트</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>버전 %1. 더 많은 정보를 보려면 <a href='%2'>여기</a>를 클릭하세요.</p> - + <p><small>Using virtual files plugin: %1</small></p> <small><p>가상 파일 플러그인 사용: %1</small></p> - + <p>This release was supplied by %1</p> <p>이 릴리스는 %1에 의해 제공되었습니다.</p> @@ -4605,22 +4911,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. 공급자를 불러오지 못했습니다. - + Failed to fetch search providers for '%1'. Error: %2 '%1'에 대한 검색 공급자를 불러오지 못했습니다. 오류: %2 - + Search has failed for '%2'. '%2'을(를) 검색하지 못했습니다. - + Search has failed for '%1'. Error: %2 '%1'을(를) 검색하지 못했습니다. 오류: %2 @@ -4628,30 +4934,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads 모든 업로드 다시 시도 + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal 계정 삭제 확인 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>계정 <i>%1</i>와(과) 연결을 삭제합니까?</p><p><b>참고:</b>이는 어떠한 파일도 삭제하지 <b>않을</b> 것입니다.</p> - + Remove connection 연결 삭제 - + Cancel 취소 @@ -4789,8 +5101,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time 유효하지 않은 수정 시간으로 인한 메타데이터 업데이트 오류 @@ -4798,8 +5110,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time 유효하지 않은 수정 시간으로 인한 메타데이터 업데이트 오류 @@ -4897,123 +5209,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version 지원되지 않는 서버 버전 - + 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. 계정 %1의 서버가 지원되지 않는 이전 버전 %2을 실행합니다. 지원되지 않는 서버 버전으로 이 클라이언트를 사용하는 것은 테스트되지 않았으며 잠재적으로 위험합니다. 자신의 책임하에 진행하십시오. - + Disconnected 연결이 끊어졌습니다. - + Disconnected from some accounts 일부 계정에서 연결이 끊어졌습니다. - + Disconnected from %1 %1에서 연결 해제됨 - + Disconnected from accounts: 계정에서 연결이 끊어졌습니다. - + Account %1: %2 계정 %1: %2 - + Please sign in 로그인 해주십시오. - + Signed out 로그아웃 - + Account synchronization is disabled 계정 동기화가 비활성화되었습니다. - - + + Synchronization is paused 동기화가 일시 정지되었습니다. - + Folder %1: %2 폴더 %1: %2 - + Unresolved conflicts 해결되지 않은 충돌 - + Up to date 최신 상태 - + Error during synchronization 동기화 중 오류 발생 - + There are no sync folders configured. 설정된 동기화 폴더가 없습니다. - + No sync folders configured 설정된 동기화 폴더가 없음 - + Checking for changes in remote "%1" 원격 "%1"의 변경 사항 확인 - + Checking for changes in local "%1" 로컬 "%1"의 변경 사항 확인 - + Syncing %1 of %2 (%3 left) %2 중 %1 동기화 중(%3 남음) - + Syncing %1 of %2 %2 중 %1 동기화 중 - + Syncing %1 (%2 left) %1 동기화 중(%2 남음) - + Syncing %1 %1 동기화 중 - + %1 (%2, %3) %1(%2, %3) @@ -5165,27 +5477,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss 새 폴더 - + You renamed %1 %1의 이름을 변경했습니다 - + You deleted %1 % 1을 지웠습니다 - + You created %1 %1을(를) 생성했습니다 - + You changed %1 %1을 변경했습니다 - + Synced %1 %1 동기화 @@ -5251,30 +5563,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss 읽은 상태로 표시 + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share 새 공유를 위한 암호가 필요합니다 - + Share password 공유에 대한 암호 - + Sharing is disabled 공유가 비활성화됨 - + This item cannot be shared. 이 항목은 공유할 수 없습니다. - + Sharing is disabled. 공유가 비활성화 되었습니다. @@ -5290,7 +5678,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. 데이터베이스 연결에 실패했습니다. @@ -5348,6 +5736,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 더 많은 결과 불러오기 + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5411,67 +5815,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status 온라인 상태 - + Online 온라인 - + Away 자리 비움 - + Do not disturb 방해하지 마십시오 - + Mute all notifications 모든 알림 음소거 - + Invisible 숨겨짐 - + Appear offline 오프라인으로 표시 - + Status message 상태 메시지 - + What is your status? 당신의 상태는 무엇입니까? - + Clear status message after 이후 상태 메시지 삭제 - + Cancel 취소 - + Clear status message 상태 메시지 삭제 - + Set status message 상태 메시지 설정 @@ -5555,24 +5959,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloud 데스크톱 주 대화상자 - + Current account 현재 계정 - - + + Resume sync for all 전체 동기화 재개 - - + + Pause sync for all 전체 동기화 일시 정지 @@ -5582,22 +5986,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 사용자 상태 설정 - + Add account 계정 추가 - + Add new account 새 계정 추가 - + Settings 설정 - + Exit 끝내기 @@ -5606,11 +6010,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar 현재 사용자 아바타 - - - Current account avatar - 현재 계정 아바타 - Current user status is online @@ -5622,70 +6021,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss 현재 사용자 상태가 방해 금지임 - + + Current account avatar + 현재 계정 아바타 + + + Current account status is online 현재 계정 상태가 온라인 상태입니다. - + Current account status is do not disturb 현재 계정 상태가 방해 금지 상태입니다. - + + %1 - File activity + %1 - 파일 활동 + + + Account switcher and settings menu - + Open local folder of current account 현재 계정의 로컬 폴더 열기 - + Connected 연결됨 - + Disconnected 연결이 끊어졌습니다. - + Open Nextcloud Talk in browser 브라우저에서 Nextcloud Talk 열기 - + More apps 더 많은 앱 - + Open %1 in browser 브라우저에서 %1 열기 - + Unified search results list 통합 검색 결과 목록 - - - %1 - File activity - %1 - 파일 활동 - main.cpp - + System Tray not available 시스템 트레이를 사용할 수 없음 - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. 작업 트레이에 % 1이 필요합니다. XFCE를 실행중인 경우 <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">다음 지침</a>을 따르십시오. 그렇지 않으면 '트레이어'와 같은 시스템 트레이 응용 프로그램을 설치하고 다시 시도하십시오. @@ -5693,7 +6097,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Git 개정 <a href="%1">%2</a>에서 Qt %5, %6을 사용하여 %3, %4의 빌드</small></p> @@ -5727,72 +6131,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted 삭제됨 - + Moved to %1 %1으로 이동 - + Ignored 무시됨 - + Filesystem access error 파일시스템 접근 오류 - + Error 오류 - + Updated local metadata 로컬 메타데이터 업데이트 - + Unknown 알 수 없음 - + downloading 다운로드 중 - + uploading 업로드 중 - + deleting 삭제 중 - + moving 이동 중 - + ignoring 무시 중 - + error 오류 - + updating local metadata 로컬 메타데이터 업데이트 중 diff --git a/translations/client_lt_LT.ts b/translations/client_lt_LT.ts index d2b07cf3e..76aa48e10 100644 --- a/translations/client_lt_LT.ts +++ b/translations/client_lt_LT.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Rodyti daugiau veiksmų @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Veiklos sąrašas @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Perkėlimas į šiukšlinę šioje platformoje nėra įgyvendintas - + Error removing "%1": %2 Klaida šalinant „%1“: %2 - + Could not remove folder "%1" Nepavyko pašalinti aplanko „%1“ @@ -321,7 +331,7 @@ Serveris grąžino neteisingą HTTP kodą. Buvo tikimasi 204, bet buvo gauta „%1 %2“. - + "%1 Failed to unlock encrypted folder %2". „%1 Nepavyko atrakinti šifruoto aplanko %2“. @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Atsisakyti @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ Nešifruoti aplanko - + Do not encrypt folder Nešifruoti aplanko - + Encrypt folder Šifruoti aplanką - + No account configured. Nėra sukonfiguruotų paskyrų. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Įjungti šifravimą - + + End-to-end encryption has been enabled for this account + + + + Warning Įspėjimas - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Jūs negalite šifruoti aplanko su turiniu. Pašalinkite failus. @@ -469,121 +484,121 @@ Palaukite naujo sinchronizavimo, o tuomet jį šifruokite. Ši paskyra palaiko ištisinį šifravimą - + Encryption failed Šifravimas patyrė nesėkmę - + Could not encrypt folder because the folder does not exist anymore Nepavyko šifruoti aplanko, nes aplanko daugiau nebėra - - + + Open folder Atverti aplanką - + Encrypt Šifruoti - - + + Edit Ignored Files Taisyti nepaisomus failus - - + + Create new folder Sukurti naują aplanką - - + + Availability - + Choose what to sync Pasirinkti ką sinchronizuoti - + Force sync now Priverstinai sinchronizuoti dabar - + Restart sync Paleisti sinchronizavimą iš naujo - + Resume sync Pratęsti sinchronizavimą - + Pause sync Pristabdyti sinchronizavimą - + Remove folder sync connection Pašalinti aplankų sinchronizavimo ryšį - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Aplanko sukūrimas nepavyko - + <p>Could not create local folder <i>%1</i>.</p> <p>Nepavyko sukurti vietinio aplanko <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Patvirtinti aplankų sinchronizavimo ryšio pašalinimą - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ar tikrai norite sustabdyti failų sinchronizavimą <i>%1</i>? </p><p><b>Pastaba:</b> Failai <b>nebus</b> ištrinti.</p> - + Remove Folder Sync Connection Pašalinti aplankų sinchronizavimo ryšį - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -592,7 +607,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -602,144 +617,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Vyksta sinchronizavimas - + The syncing operation is running.<br/>Do you want to terminate it? Vyksta sinchronizavimo operacija.<br/>Ar norite ją nutraukti? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) iš %2 yra naudojami. Kai kuriuose aplankuose gali būti naudojami skirtingi apribojimai. - + %1 of %2 in use %1 iš %2 yra naudojami - + Currently there is no storage usage information available. Šiuo metu nėra informacijos apie saugyklos panaudojimą. - + %1 in use %1 naudojama - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Prisijungta prie %1. - + Server %1 is temporarily unavailable. Serveris %1 yra laikinai neprieinamas. - + Server %1 is currently in maintenance mode. Šiuo metu serveris %1 yra techninės priežiūros veiksenoje. - + Signed out from %1. Atsijungta iš %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Autorizuojama vykdoma per naršyklę.<a href='%1'>Paspauskite čia</a>, jei norite iš naujo atidaryti naršyklę. - + Connecting to %1 … Jungiamasi prie %1… - + No connection to %1 at %2. %2 neturi ryšio su %1. - + Server configuration error: %1 at %2. Serverio konfigūracijos klaida: %1 ties %2. - + No %1 connection configured. Nesukonfigūruota %1 sujungimų. - + There are folders that were not synchronized because they are too big: Yra aplankų, kurie nebuvo sinchronizuoti dėl to, kad buvo per dideli: - + There are folders that were not synchronized because they are external storages: Aplankai, kurie nebuvo sinchronizuoti, kadangi jie yra išorinės saugyklos: - + There are folders that were not synchronized because they are too big or external storages: Yra aplankų, kurie nebuvo sinchronizuoti dėl to, kad buvo per dideli arba yra išorinės saugyklos: - + Confirm Account Removal Patvirtinti paskyros pašalinimą - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ar tikrai norite pašalinti ryšį su paskyra <i>%1</i>?</p><p><b> Pastaba:</b> Failai <b>nebus</b> ištrinti.</p> - + Remove connection Šalinti ryšį - - + This account supports end-to-end encryption Ši paskyra palaiko ištisinį šifravimą - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -794,7 +841,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. Jei norite matyti daugiau veiklos, atidarykite programą Veikla. @@ -804,12 +851,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -860,32 +907,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Išeiti - + Continue Tęsti - + Error accessing the configuration file Klaida gaunant prieigą prie konfigūracijos failo @@ -895,12 +969,12 @@ This action will abort any currently running synchronization. Įvyko klaida, nepavyko pasiekti konfigūracijos failo, esančio% 1. Įsitikinkite, kad Jūs turite teisę pasiekti šį failą. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Išjungti %1 @@ -946,56 +1020,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 Tinklo klaida: %1 - + Error updating metadata: %1 Klaida atnaujinant metaduomenis: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Klaida rašant metaduomenis į duomenų bazę @@ -1013,12 +1247,12 @@ This action will abort any currently running synchronization. Įveskite savo ištisinio šifravimo slaptafrazę:<br><br>Naudotojas: %2<br>Paskyra: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Įveskite E2E slaptą frazę @@ -1194,8 +1428,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1203,27 +1437,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Klaida atveriant katalogą %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 Katalogas nerastas: %1 - + Filename encoding is not valid - + Error while reading directory %1 Klaida skaitant katalogą %1 @@ -1231,83 +1465,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. Bandykite dar kartą. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1315,7 +1549,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1444,144 +1678,144 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Vietinio aplanko %1 nėra. - + %1 should be a folder but is not. %1 turėtų būti aplankas, tačiau nėra. - + %1 is not readable. %1 nenuskaitoma - + %1 and %n other file(s) have been removed. Pašalintas %1 ir dar %n failas.Pašalintas %1 ir dar %n failai.Pašalintas %1 ir dar %n failų.Pašalintas %1 ir dar %n failas. - + %1 has been removed. %1 names a file. %1 pašalintas. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. %1 pridėtas. - + %1 and %n other file(s) have been updated. Atnaujintas %1 ir dar %n failas.Atnaujintas %1 ir dar %n failai.Atnaujintas %1 ir dar %n failų.Atnaujintas %1 ir dar %n failas. - + %1 has been updated. %1 names a file. %1 atnaujintas. - + %1 has been renamed to %2 and %n other file(s) have been renamed. Failo %1 pavadinimas pakeistas į %2 ir dar %n failo pavadinimas buvo pakeistas.Failo %1 pavadinimas pakeistas į %2 ir dar %n failų pavadinimai buvo pakeisti.Failo %1 pavadinimas pakeistas į %2 ir dar %n failų pavadinimai buvo pakeisti.Failo %1 pavadinimas pakeistas į %2 ir dar %n failų pavadinimai buvo pakeisti. - + %1 has been renamed to %2. %1 and %2 name files. %1 pevadintas į %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 perkeltas į %2, o taip pat buvo perkeltas dar %n failas.%1 perkeltas į %2, o taip pat buvo perkelti dar %n failai.%1 perkeltas į %2, o taip pat buvo perkelta dar %n failų.%1 perkeltas į %2, o taip pat buvo perkeltas dar %n failas. - + %1 has been moved to %2. %1 perkeltas į %2. - + %1 has and %n other file(s) have sync conflicts. %1 ir dar %n failas turi sinchronizavimo konfliktus.%1 ir dar %n failai turi sinchronizavimo konfliktus.%1 ir dar %n failų turi sinchronizavimo konfliktus.%1 ir dar %n failas turi sinchronizavimo konfliktus. - + %1 has a sync conflict. Please check the conflict file! %1 turi sinchronizavimo konfliktą. Patikrinkite "konfliktų" failą! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. Dėl klaidų nepavyko sinchronizuoti %1 ir dar %n failo. Išsamesnei informacijai, žiūrėkite žurnalą.Dėl klaidų nepavyko sinchronizuoti %1 ir dar %n failų. Išsamesnei informacijai, žiūrėkite žurnalą.Dėl klaidų nepavyko sinchronizuoti %1 ir dar %n failų. Išsamesnei informacijai, žiūrėkite žurnalą.Dėl klaidų nepavyko sinchronizuoti %1 ir dar %n failo. Išsamesnei informacijai, žiūrėkite žurnalą. - + %1 could not be synced due to an error. See the log for details. Dėl klaidos nepavyko sinchronizuotu %1. Daugiau informacijos rasite įvykių registravimo žurnale. - + %1 and %n other file(s) are currently locked. Šiuo metu yra užrakintas %1 ir dar %n failas.Šiuo metu yra užrakintas %1 ir dar %n failai.Šiuo metu yra užrakintas %1 ir dar %n failų.Šiuo metu yra užrakintas %1 ir dar %n failas. - + %1 is currently locked. Šiuo metu %1 yra užrakintas. - + Sync Activity Sinchronizavimo veikla - + Could not read system exclude file Nepavyko perskaityti sistemos išskyrimo failo - + A new folder larger than %1 MB has been added: %2. Buvo pridėtas naujas, didesnis nei %1 MB, aplankas: %2. - + A folder from an external storage has been added. Buvo pridėtas aplankas iš išorinė saugyklos. - + Please go in the settings to select it if you wish to download it. Jei norite parsisiųsti, eikite į nustatymus. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Aplankas %1 buvo sukurtas, tačiau anksčiau išskirtas iš sinchronizavimo. Aplanke esantys duomenys nebus sinchronizuoti. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Failas %1 buvo sukurtas, tačiau anksčiau išskirtas iš sinchronizavimo. Failas nebus sinchronizuotas. - + 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). @@ -1592,7 +1826,7 @@ This means that the synchronization client might not upload local changes immedi Tai reiškia, kad sinchronizacijos klientas gali iš karto neįkelti lokalių pakeitimų, o tik juos nuskaityti. Įkėlimas bus atliekamas tam tikrais laiko tarpais (pagal numatytuosius nustatymus kas dvi valandas). - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1600,24 +1834,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Šalinti visus failus? - + Remove all files Šalinti visus failus - + Keep files Palikti failus @@ -1653,22 +1887,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Nepavyko atstatyti aplanko būsenos - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (atsarginė kopija) - + (backup %1) (atsarginė kopija %1) @@ -1678,27 +1912,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Neapibrėžta būsena. - + Undefined state. Neapibrėžta būsena. - + Waiting to start syncing. Laukiama pradėti sinchronizavimą. - + Preparing for sync. Ruošiamasi sinchronizavimui. - + Sync is running. Vyksta sinchronizacija - + Sync finished with unresolved conflicts. @@ -1718,62 +1952,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Naudotojo atšaukimas - + Last sync was successful. - + Setup error. Sąrankos klaida. - + Sync request was cancelled. - + Sync is paused. Sinchronizavimas yra pristabdytas. - + %1 (Sync is paused) %1 (Sinchronizavimas pristabdytas) - + No valid folder selected! Nepasirinktas galiojantis failas! - + The selected path does not exist! Pasirinkto kelio nėra! - + The selected path is not a folder! Pasirinktas kelias nėra aplankas! - + You have no permission to write to the selected folder! Jūs neturite leidimų rašyti į pasirinktą aplanką! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Vietiniame aplanke %1 jau yra aplankas, kuris naudojamas aplanko sinchronizavimo ryšyje. Prašome pasirinkti kitą! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Vietinis aplankas %1 jau yra aplanke, naudojamame aplanko sinchronizavimo ryšyje. Prašome pasirinkti kitą! - + There is already a sync from the server to this local folder. Please pick another local folder! Šis lokalus aplankas jau turi sinchronizaciją su serveriu. Pasirinkite kitą aplanką. @@ -1786,7 +2020,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Pridėti aplanko sinchronizavimo ryšį - + File Failas @@ -1794,154 +2028,158 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Norėdami pridėti aplanką, turite būti prisijungę - + Click this button to add a folder to synchronize. Spustelėkite šį mygtuką norėdami pridėti aplanką, kurį norite sinchronizuoti. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Klaida įkeliant aplankų sąrašą iš serverio. - + Fetching folder list from server … Gaunamas aplankų sąrašas iš serverio… - + There are unresolved conflicts. Click for details. Yra neišspręstų konfliktų. Spustelėkite išsamesnei informacijai. - + Virtual file support is enabled. - + Signed out Atsijungta - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Pakeitimų suderinimas - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sinchronizuojama %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) atsisiųsti %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) įkelti %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 of %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Liko %5, %1 iš %2, %3 failas(-ai) iš %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 iš %2, %3 failas(-ai) iš %4 - + file %1 of %2 %1 failas(-ai) iš %2 - + Waiting … Laukiama… - + Waiting for %n other folder(s) … Laukiama dar %n aplanko…Laukiama dar %n aplankų…Laukiama dar %n aplankų…Laukiama dar %n aplanko… - + Preparing to sync … Ruošiamasi sinchronizuoti… @@ -2172,13 +2410,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable stabilus - + beta beta @@ -2230,59 +2468,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Sukurti derinimo archyvą - + Server notifications that require attention. Serverio perspėjimai, reikalaujantys imtis veiksmų. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? Keisti atnaujinimų kanalą? - + 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. 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. - + Change update channel Keisti atnaujinimų kanalą - + Cancel Atsisakyti - + Zip Archives Zip archyvai - + Debug Archive Created Derinimo archyvas sukurtas - + Debug archive is created at %1 Derinimo archyvas sukurtas ties %1 @@ -2290,22 +2528,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Reikalingas bendrinimosi slaptažodis - + Please enter a password for your link share: Prašome įveskite slaptažodį bendrinamai nuorodai: - + Sharing error Bendrinimo klaida - + Could not retrieve or create the public link share. Error: %1 @@ -2543,6 +2781,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Užverti + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2875,60 +3118,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Sinchronizavimo aplankas kompiuteryje - - + + (%1) (%1) - + There isn't enough free space in the local folder! Vietiniame aplanke nepakanka laisvos vietos! @@ -3000,7 +3243,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3032,144 +3276,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Sėkmingai prisijungė prie %1: %2 versija %3 (%4)</font><br/><br/> - + Invalid URL Neteisingas URL - + Failed to connect to %1 at %2:<br/>%3 %2 nepavyko prisijungti prie %1: <br/>%3 - + Timeout while trying to connect to %1 at %2. %2 prisijungimui prie %1 laikas pasibaigė. - + Trying to connect to %1 at %2 … Bandoma prisijungti prie %1 ties %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Prieigą apribojo serveris. Norėdami įsitikinti, kad turite tinkamą prieigą, <a href="%1">spustelėkite čia</a>ir paslauga bus atidaryta jūsų naršyklėje. - + There was an invalid response to an authenticated WebDAV request Neteisingas atsakymas į patvirtintą „WebDAV“ užklausą - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Sinchronizavimo aplankas %1 jau yra kompiuteryje, ruošiama sinchronizuoti.<br/><br/> - + Creating local sync folder %1 … Kuriamas vietinis sinchronizavimo aplankas %1… - + OK Gerai - + failed. nepavyko. - + Could not create local folder %1 Nepavyko sukurti vietinio aplanko %1 - + No remote folder specified! Nenurodytas nuotolinis aplankas! - + Error: %1 Klaida: %1 - + creating folder on Nextcloud: %1 kuriamas aplankas Nextcloud: %1 - + Remote folder %1 created successfully. Nuotolinis aplankas %1 sėkmingai sukurtas. - + The remote folder %1 already exists. Connecting it for syncing. Serverio aplankas %1 jau yra. Prisijunkite jį sinchronizavimui. - - + + The folder creation resulted in HTTP error code %1 Aplanko sukūrimas sąlygojo HTTP klaidos kodą %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Nepavyko sukurti aplanko serveryje dėl neteisingų prisijungimo duomenų! <br/>Grįžkite ir įsitinkite, kad prisijungimo duomenys teisingai.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Nepavyko sukurti aplanko serveryje dėl neteisingų prisijungimo duomenų.</font><br/>Grįžkite ir įsitinkite, kad prisijungimo duomenys teisingai.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Nepavyko sukurti aplanko %1 serveryje, klaida <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Sinchronizavimo ryšys su %1 su nuotoliniu katalogu %2 buvo nustatytas. - + Successfully connected to %1! Sėkmingai prisijungta prie %1! - + Connection to %1 could not be established. Please check again. Susijungti su %1 nepavyko. Pabandykite dar kartą. - + Folder rename failed Nepavyko pervadinti aplanką - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Sinchronizavimo aplankas %1 kompiuteryje buvo sėkmingai sukurtas! </b></font> @@ -3192,12 +3436,12 @@ Note that using any logging command line options will override this setting.Atsisakyti - + Enable experimental feature? Įjungti eksperimentinę ypatybę? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3208,12 +3452,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe Išlikite saugūs @@ -3242,162 +3486,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. Failo pavadinime yra galinių tarpų. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Failo pavadinimas yra per ilgas. - + File/Folder is ignored because it's hidden. Failo/Aplanko nepaisoma, nes jis yra paslėptas. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size dydis - + permission - + file id failo id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database Klaida skaitant duomenų bazę - + Server replied with an error while reading directory "%1" : %2 @@ -3405,22 +3654,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 Klaida atnaujinant metaduomenis: %1 - + File is currently in use Failas šiuo metu yra naudojamas @@ -3433,19 +3682,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Aptikus failą, jis buvo pakeistas - + Could not delete file record %1 from local DB @@ -3456,32 +3705,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Failo %1 nepavyko atsisiųsti dėl kompiuterio failo nesuderinamumo! - + The download would reduce free local disk space below the limit Atsisiuntimas sumažins laisvos vietos diske žemiau leistinos ribos - + Free space on disk is less than %1 Laisvos vietos diske yra mažiau nei %1 - + File was deleted from server Failas buvo ištrintas iš serverio - + The file could not be downloaded completely. Nepavyko pilnai atsisiųsti failo. - + The downloaded file is empty, but the server said it should have been %1. @@ -3491,18 +3740,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Failo %1 nepavyko išsaugoti dėl kompiuterio failo nesuderinamumo! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Klaida atnaujinant metaduomenis: %1 - + The file %1 is currently in use Šiuo metu failas %1 yra naudojamas @@ -3523,7 +3777,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 nepavyko ištrinti failo %1, klaida: %2 @@ -3534,16 +3788,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Nepavyko sukurti aplanko %1 - + Error updating metadata: %1 Klaida atnaujinant metaduomenis: %1 - + The file %1 is currently in use Šiuo metu failas %1 yra naudojamas @@ -3551,7 +3810,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Nepavyko pašalinti failo %1 dėl kompiuterio failo nesuderinamumo @@ -3564,46 +3823,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB nepavyko iš vietinės duomenų bazės gauti failo %1 - + Error setting pin state - - + + Error updating metadata: %1 Klaida atnaujinant metaduomenis: %1 - + The file %1 is currently in use Šiuo metu failas %1 yra naudojamas - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Nepavyko pervadinti failo @@ -3624,7 +3888,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3637,12 +3901,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Serveris grąžino neteisingą HTTP kodą. Buvo tikimasi 201, tačiau gauta "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use Šiuo metu failas %1 yra naudojamas @@ -3650,42 +3914,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Nepavyko pervadinti %1 į %2, klaida: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Serveris grąžino neteisingą HTTP kodą. Tikimasi 201, gauta "%1 %2". - + could not get file %1 from local DB nepavyko iš vietinės duomenų bazės gauti failo %1 - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Klaida atnaujinant metaduomenis: %1 - + The file %1 is currently in use Šiuo metu failas %1 yra naudojamas - + Error setting pin state - + Error writing metadata to the database Klaida rašant metaduomenis į duomenų bazę @@ -3875,7 +4139,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3893,23 +4157,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Nustatymai - + %1 Settings This name refers to the application name e.g Nextcloud %1 nustatymai - + General Bendra - + Network Tinklas - + Account Paskyra @@ -3917,17 +4181,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4003,7 +4272,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4012,132 +4281,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Kontekstinio meniu pasidalinimas - + Select new location … - + I shared something with you Aš pradėjau kai ką bendrinti su jumis - - + + Share options Bendrinimo parinktys - - + + Activity - + Copy private link to clipboard Kopijuoti privačią nuorodą į mainų sritį - + Send private link by email … Siųsti privačią nuorodą el. paštu… + + + Expire in %1 minutes + remaining time before lock expire + Baigia galioti po %1 minutėsBaigia galioti po %1 minučiųBaigia galioti po %1 minučiųBaigia galioti po %1 minutės + - + Leave this share - + Resharing this file is not allowed Pakartotinai dalintis failu negalima - + Resharing this folder is not allowed - - + + Copy public link Kopijuoti viešąją nuorodą - + Copy internal link Kopijuoti vidinę nuorodą - + + Encrypt + + + + Lock file Užrakinti failą - + Unlock file Atrakinti failą - + Locked by %1 Užrakino %1 - - Expire in %1 minutes - remaining time before lock expire - Baigia galioti po %1 minutėsBaigia galioti po %1 minučiųBaigia galioti po %1 minučiųBaigia galioti po %1 minutės - - - + Expires in %1 minutes remaining time before lock expires Baigia galioti po %1 minutėsBaigia galioti po %1 minučiųBaigia galioti po %1 minučiųBaigia galioti po %1 minutės - + Edit Taisyti - + Open in browser Atverti naršyklėje - + Resolve conflict … - + Move and rename … Perkelti ir pervadinti… - + Move, rename and upload … - + Delete local changes Ištrinti vietinius pakeitimus - + Move and upload … - + Delete Ištrinti @@ -4355,63 +4661,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (praleista dėl ankstesnės klaidos, dar kartą bus bandoma po %2) - + Could not update file: %1 Nepavyko atnaujinti failo: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Neišspręstas konfliktas. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Leidžiami tik %1, būtina bent %2, kad galėtumėte pradėti - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Nepavyko atverti ar sukurti sinchronizavimo duomenų bazės kompiuteryje. Įsitikinkite, kad į sinchronizavimo aplanką galite rašyti. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Nepavyko perskaityti juodojo sąrašo iš duomenų bazės kompiuteryje - + Unable to read from the sync journal. Nepavyko perskaityti sinchronizavimo žurnalo. - + Cannot open the sync journal Nepavyksta atverti sinchronizavimo žurnalo @@ -4421,12 +4727,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Mažai vietos diske: atsisiuntimai, kurie sumažintų vietą iki %1 buvo praleisti. - + There is insufficient space available on the server for some uploads. Kai kuriems įkėlimams serveryje neužteks vietos. @@ -4495,59 +4801,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Atsisiųsti - + Add account Pridėti paskyrą - + Open main dialog Atverti pagrindinį dialogą - - + + Pause sync Pristabdyti sinchronizavimą - - + + Resume sync Pratęsti sinchronizavimą - + Settings Nustatymai - + Help - + Exit %1 Išeiti iš %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4555,24 +4861,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 darbalaukio kliento programa</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versija %1. Išsamesnei informacijai, spustelėkite <a href='%2'>čia</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Šį išleidimą pateikė %1</p> @@ -4580,22 +4886,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4603,30 +4909,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Pakartoti visus įkėlimus + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Patvirtinti paskyros šalinimą - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ar tikrai norite pašalinti ryšį su paskyra <i>%1</i>?</p><p><b>Pastaba:</b> Tai <b>neištrins</b> jokių failų.</p> - + Remove connection Šalinti ryšį - + Cancel Atsisakyti @@ -4764,8 +5076,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4773,8 +5085,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4872,123 +5184,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Nepalaikoma serverio versija - + 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. - + Disconnected Atjungta - + Disconnected from some accounts Atjungta nuo kelių paskyrų - + Disconnected from %1 Atsijungta nuo %1 - + Disconnected from accounts: Atsijungta nuo paskyrų: - + Account %1: %2 Paskyra %1: %2 - + Please sign in Prisijunkite - + Signed out Atsijungta - + Account synchronization is disabled Paskyros sinchronizavimas išjungtas - - + + Synchronization is paused Sinchronizavimas pristabdytas - + Folder %1: %2 Aplankas %1: %2 - + Unresolved conflicts Neišspręsti konfliktai - + Up to date Naujausi - + Error during synchronization Klaida sinchronizuojant - + There are no sync folders configured. Sinchronizuojamų aplankų nėra. - + No sync folders configured Sinchronizuojamų aplankų nėra - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Sinchronizuojama %1 iš %2 (liko %3) - + Syncing %1 of %2 Sinchronizuojama %1 iš %2 - + Syncing %1 (%2 left) Sinchronizuojama %1 (liko %2) - + Syncing %1 Sinchronizuojama %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5140,27 +5452,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Naujas aplankas - + You renamed %1 Jūs pervadinote %1 - + You deleted %1 Jūs ištrynėte %1 - + You created %1 Jūs sukūrėte %1 - + You changed %1 Jūs pakeitėte %1 - + Synced %1 @@ -5187,7 +5499,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss %n hours ago - prieš %n valandąprieš %n valandasprieš %n valandųprieš %n valandų + prieš %n valandąprieš %n valandasprieš %n valandųprieš %n valandą @@ -5202,7 +5514,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss %n minute ago - prieš %n minutęprieš %n minutesprieš %n minučiųprieš %n minučių + prieš %n minutęprieš %n minutesprieš %n minučiųprieš %n minutę @@ -5226,30 +5538,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled Bendrinimas yra išjungtas - + This item cannot be shared. Šis elementas negali būti bendrinamas. - + Sharing is disabled. Bendrinimas yra išjungtas. @@ -5265,7 +5653,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Nepavyko prisijungti prie duomenų bazės. @@ -5323,6 +5711,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Įkelti daugiau rezultatų + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5386,67 +5790,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message Būsenos žinutė - + What is your status? Kokia jūsų būsena? - + Clear status message after Išvalyti būsenos žinutę po - + Cancel Atsisakyti - + Clear status message Išvalyti būsenos žinutę - + Set status message Nustatyti būsenos žinutę @@ -5530,24 +5934,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Dabartinė paskyra - - + + Resume sync for all - - + + Pause sync for all @@ -5557,22 +5961,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Pridėti paskyrą - + Add new account Pridėti naują paskyrą - + Settings Nustatymai - + Exit Išeiti @@ -5581,11 +5985,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5597,70 +5996,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu Paskyrų perjungiklis ir nustatymų meniu - + Open local folder of current account - + Connected Prijungta - + Disconnected Atjungta - + Open Nextcloud Talk in browser - + More apps Daugiau programėlių - + Open %1 in browser Atverti %1 naršyklėje - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Sistemos dėklas neprieinamas - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5668,7 +6072,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Pagaminta pagal Git redakciją <a href="%1">%2</a>išleistą %3, %4 naudojant Qt %5, %6</small></p> @@ -5702,72 +6106,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Ištrinta - + Moved to %1 Perkelta į %1 - + Ignored Nepaisoma - + Filesystem access error Prieigos prie failų sistemos klaida - + Error Klaida - + Updated local metadata Atnaujinti vietiniai metaduomenys - + Unknown Nežinoma - + downloading atsisiunčiama - + uploading įkeliama - + deleting ištrinama - + moving perkeliama - + ignoring praleidžiama - + error klaida - + updating local metadata naujinami metaduomenys kompiuteryje diff --git a/translations/client_lv.ts b/translations/client_lv.ts index 3a09c9d97..063efd254 100644 --- a/translations/client_lv.ts +++ b/translations/client_lv.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Pārvietošana uz atkritni šajā platformā vēl nav ieviesta - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". "%1 Neizdevās atslēgt šifrēto mapi %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Atcelt @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Nav konfigurēts konts. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Ieslēgt šifrēšanu - + + End-to-end encryption has been enabled for this account + + + + Warning Brīdinājums - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Atvērt mapi - + Encrypt Šifrēt - - + + Edit Ignored Files - - + + Create new folder - - + + Availability - + Choose what to sync Izvēlies ko sinhronizēt - + Force sync now Piespeist tūlītēju sinhronizēšanu - + Restart sync Restartēt sinronizāciju - + Resume sync Turpināt sinhronizāciju - + Pause sync Apturēt sinhronizāciju - + Remove folder sync connection Noņemt mapes sinhronizācijas savienojumu - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Mapes izveide neizdevās - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Noņemt mapes sinhronizācijas savienojuma noņemšanai - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vai tiešām vēlaties apturēt mapes <i>%1</i> sinhronizēšanu?</p><p><b>Piezīme:</b> Tas <b>neveiks</b> nekādu datņu dzēšanu.</p> - + Remove Folder Sync Connection Noņemt mapes sinhronizācijas savienojumu - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Notiek Sinhronizācija - + The syncing operation is running.<br/>Do you want to terminate it? Pašlaik notiek sinhronizācijas operācija.<br/>Vai to izbeigt? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) no %2 izmantots. Dažas mapes, tajā skaitā montētas no tīkla vai koplietotas, var saturēt dažādus ierobežojumus. - + %1 of %2 in use %1 no %2 izmantots - + Currently there is no storage usage information available. Pašlaik nav pieejama diska vietas informācija. - + %1 in use %1 tiek lietots - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Savienots ar %1. - + Server %1 is temporarily unavailable. Serveris %1 ir īslaicīgi nepiejams. - + Server %1 is currently in maintenance mode. Serveris %1 pašlaik ir uzturēšanas režīmā - + Signed out from %1. Izrakstījies no %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Saņemam pilnvaru no pārlūka. <a href='%1'>Noklikšķini šeit</a>lai atkārtoti atvērtu pārlūku. - + Connecting to %1 … - + No connection to %1 at %2. Nav savienojuma ar %1 pie %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. Nav %1 savienojums konfigurēts. - + There are folders that were not synchronized because they are too big: Šīs mapes netika sinhronizētas, jo tās ir pārāk lielas: - + There are folders that were not synchronized because they are external storages: Šīs mapes netika sinhronizētas, jo tās atrodas ārējās krātuvēs: - + There are folders that were not synchronized because they are too big or external storages: Šīs mapes netika sinhronizētas, jo tās ir pārāk lielas, vai atrodas ārējās krātuvēs: - + Confirm Account Removal Apstiprini Konta noņemšanai - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vai tiešām vēlaties noņemt savienojumu kontam <i>%1</i>?</p><p><b>Piezīme:</b> Tas <b>neveiks</b> nekādu datņu dzēšanu.</p> - + Remove connection Noņemt savienojumu - - + This account supports end-to-end encryption - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Kļūda piekļūstot konfigurācijas datnei @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. Notika kļūda piekļūstot konfigurācijas datnei %1. Lūdzu pārliecinieties, ka datne ir pieejama no jūsu konta. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Iziet %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Kļūda rakstot metadatus datubāzē @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. Lūdzu ievadiet jūsu end to end šifrēšanas paroli:<br><br>Lietotājs: %2<br>Konts: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Ievadiet E2E paroli @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. Lūdzu mēģiniet vēlreiz. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Lokālā mape %1 neeksistē. - + %1 should be a folder but is not. %1 vajadzētu būt mapei, bet tā nav. - + %1 is not readable. %1 nav lasāma. - + %1 and %n other file(s) have been removed. %1 un %n citas datne(s) tika noņemtas.%1 un %n citas datne(s) tika noņemtas.%1 un %n citas datne(s) tika noņemtas. - + %1 has been removed. %1 names a file. %1 tika noņemta. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 un %n citas datne(s) tika atjaunotas.%1 un %n citas datne(s) tika atjaunotas.%1 un %n citas datne(s) tika atjaunotas. - + %1 has been updated. %1 names a file. %1 ir atjaunināts. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 tika pārsaukta uz %2 un %n citas datne(s) tika pārsauktas.%1 tika pārsaukta uz %2 un %n citas datne(s) tika pārsauktas.%1 tika pārsaukta uz %2 un %n citas datne(s) tika pārsauktas. - + %1 has been renamed to %2. %1 and %2 name files. %1 ir pārsaukts par %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 tika pārvietota uz %2 un %n citas datne(s) tika pārvietotas.%1 tika pārvietota uz %2 un %n citas datne(s) tika pārvietotas.%1 tika pārvietota uz %2 un %n citas datne(s) tika pārvietotas. - + %1 has been moved to %2. %1 ir pārvietots uz %2. - + %1 has and %n other file(s) have sync conflicts. %1 un %n citām datnēm ir sinhronizācijas konflikts.%1 un %n citām datnēm ir sinhronizācijas konflikts.%1 un %n citām datnēm ir sinhronizācijas konflikts. - + %1 has a sync conflict. Please check the conflict file! %1 ir sinhronizācijas konflikts. Lūdzu pārbaudiet konfliktējošo datni! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. - + %1 could not be synced due to an error. See the log for details. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity Sinhronizācijas darbība - + Could not read system exclude file Nevarēja nolasīt sistēmas izņēmumu datni. - + A new folder larger than %1 MB has been added: %2. Jauna mape lielāka par %1 MB ir tikusi pievienota: %2. - + A folder from an external storage has been added. Mape no ārējās krātuves ir tikusi pievienota. - + Please go in the settings to select it if you wish to download it. Lūdzu ieej iestatījumos un izvēlies to, ja tu to gribi lejupielādēt. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Noņemt visas datnes? - + Remove all files Noņemt visas datnes - + Keep files Saglabāt datnes @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Nevarēja atiestatīt mapju statusu - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (dublējums) - + (backup %1) (dublējums %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Undefined state. - + Waiting to start syncing. - + Preparing for sync. Sagatavojas sinhronizācijai. - + Sync is running. Notiek sinhronizācija. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sinhronizācija ir apturēta. - + %1 (Sync is paused) %1 (Sinhronizācija ir apturēta) - + No valid folder selected! Nav izvēlēta derīga mape! - + The selected path does not exist! - + The selected path is not a folder! Atlasītais ceļš nav mape! - + You have no permission to write to the selected folder! Tev nav rakstīšanas piekļuves izvēlētai mapei! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce - + File Datne @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder - + Click this button to add a folder to synchronize. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" - + Error while loading the list of folders from the server. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. - + Virtual file support is enabled. - + Signed out - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sinhronizē %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) lejupielāde %1/s - + ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) augšupielāde %1/s - + ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 no %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 atlicis, %1 no %2, datne %3 no %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 no %2, datne %3 no %4 - + file %1 of %2 datne %1 no %2 - + Waiting … - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error - + Could not retrieve or create the public link share. Error: %1 @@ -2533,6 +2771,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2865,60 +3108,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder - - + + (%1) - + There isn't enough free space in the local folder! @@ -2990,7 +3233,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3022,144 +3266,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> - + Invalid URL - + Failed to connect to %1 at %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> - + Creating local sync folder %1 … - + OK - + failed. - + Could not create local folder %1 - + No remote folder specified! - + Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. - + The remote folder %1 already exists. Connecting it for syncing. - - + + The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! - + Connection to %1 could not be established. Please check again. - + Folder rename failed - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> @@ -3182,12 +3426,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3198,12 +3442,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3232,162 +3476,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3395,22 +3644,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3423,19 +3672,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery - + Could not delete file record %1 from local DB @@ -3446,32 +3695,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 - + File was deleted from server - + The file could not be downloaded completely. - + The downloaded file is empty, but the server said it should have been %1. @@ -3481,18 +3730,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3513,7 +3767,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 @@ -3524,16 +3778,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3541,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3554,46 +3813,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3614,7 +3878,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3627,12 +3891,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3640,42 +3904,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database @@ -3865,7 +4129,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3883,23 +4147,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Iestatījumi - + %1 Settings This name refers to the application name e.g Nextcloud - + General Vispārīgs - + Network Tīkls - + Account Konts @@ -3907,17 +4171,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3993,7 +4262,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4002,132 +4271,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you - - + + Share options - - + + Activity - + Copy private link to clipboard Kopēt privāto saiti starpliktuvē - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Rediģēt - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Dzēst @@ -4343,63 +4649,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal Nevar atvērt sinhronizācijas žurnālu @@ -4409,12 +4715,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4483,59 +4789,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Pievienot kontu - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Iestatījumi - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4543,24 +4849,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Šo izlaidumu piegādāja %1</p> @@ -4568,22 +4874,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4591,30 +4897,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel Atcelt @@ -4752,8 +5064,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4761,8 +5073,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4860,123 +5172,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Neatbalstīta servera versija - + 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. - + Disconnected Atvienojies - + Disconnected from some accounts Atvienojies no dažiem kontiem - + Disconnected from %1 Atvienojies no %1 - + Disconnected from accounts: Atvienojies no kontiem: - + Account %1: %2 Konts %1: %2 - + Please sign in Lūdzu piesakieties - + Signed out Atteicies - + Account synchronization is disabled Konta sinhronizācija ir atspējota - - + + Synchronization is paused Sinhronizācija ir apturēta - + Folder %1: %2 Mape %1: %2 - + Unresolved conflicts Neatrisināts konflikts - + Up to date Atjaunināts - + Error during synchronization Kļuda sinhronizējot - + There are no sync folders configured. Nav konfigurētas sinhronizācijas mapes. - + No sync folders configured Nav konfigurētas sinhronizācijas mapes - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 Sinhronizē %1 no %2 - + Syncing %1 (%2 left) Sinhronizē %1 (%2 atlicis) - + Syncing %1 Sinhronizē %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5128,27 +5440,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5214,30 +5526,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5253,7 +5641,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5311,6 +5699,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5374,67 +5778,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Tiešsaistes statuss - + Online Tiešsaistē - + Away Prom - + Do not disturb Netraucēt - + Mute all notifications - + Invisible Neredzams - + Appear offline - + Status message Statusa ziņojums - + What is your status? - + Clear status message after Notīrīt statusa ziņojumu pēc - + Cancel - + Clear status message Notīrīt statusa ziņojumu - + Set status message Iestatīt statusa ziņojumu @@ -5518,24 +5922,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Pašreizējais konts - - + + Resume sync for all - - + + Pause sync for all @@ -5545,22 +5949,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Iestatiet lietotāja statusu - + Add account Pievienot kontu - + Add new account - + Settings Iestatījumi - + Exit @@ -5569,11 +5973,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5585,70 +5984,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Savienojies - + Disconnected Atvienojies - + Open Nextcloud Talk in browser - + More apps Vairāk lietotnes - + Open %1 in browser Atvērt %1 pārlūkā - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Sistēmas tekne nav pieejama - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5656,7 +6060,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Būvēta no Git revīzijas <a href="%1">%2</a> uz %3, %4 izmantojot Qt %5, %6</small></p> @@ -5690,72 +6094,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Dzēsts - + Moved to %1 Pārvietots uz %1 - + Ignored Ignorēts - + Filesystem access error Datņu sistēmas piekļuves kļūda - + Error Kļūda - + Updated local metadata Atjaunoti lokālie metadati - + Unknown Nezināms - + downloading lejupielādē - + uploading augšupielādē - + deleting dzēš - + moving pārvieto - + ignoring ignorē - + error kļūda - + updating local metadata atjauno lokālos metadatus diff --git a/translations/client_mk.ts b/translations/client_mk.ts index 2447017fa..7f6e2dfd0 100644 --- a/translations/client_mk.ts +++ b/translations/client_mk.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Отвори %1 локално - + In %1 Во %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Прикажи повеќе акции @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Отфрли + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Активности @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Не е овозможено преместување во корпата со отпадоци - + Error removing "%1": %2 Грешка при отстранување на "%1": %2 - + Could not remove folder "%1" Неможе да се избрише папката "%1" @@ -321,7 +331,7 @@ Погрешен HTTP код е испратен од серверот. Се очекува 204, но примено е"%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Неуспешно отклучување на шифрираната папка %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Датотеката %1 е веќе заклучена од %2. - + Lock operation on %1 failed with error %2 Операцијата за заклучување на %1 е неуспешна со грешка %2 - + Unlock operation on %1 failed with error %2 Операцијата за отклучување на %1 е неуспешна со грешка %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Откажи @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Нема конфигурирано сметка. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Овозможи енкрипција - + + End-to-end encryption has been enabled for this account + + + + Warning Предупредување - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Отвори папка - + Encrypt Енкриптирај - - + + Edit Ignored Files Измени ги датотеките што се игнорирани - - + + Create new folder Креирај нова папка - - + + Availability Достапност - + Choose what to sync Изберете што да се синхронизира - + Force sync now Прислино синхронизирај сега - + Restart sync Рестартирај синхронизација - + Resume sync Продолжи синхронизација - + Pause sync Паузирај синхронизација - + Remove folder sync connection Отстрани папка од синхронизација - + Disable virtual file support … Оневозможи поддршка за виртуални датотеки ... - + Enable virtual file support %1 … Овозможи поддршка за виртуални датотеки ... - + (experimental) (експериментално) - + Folder creation failed Неуспешно креирање на папка - + <p>Could not create local folder <i>%1</i>.</p> <p>Неможе да се креира локална папка <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Потврди отстранување на папка за синхронизација - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Дали сте сигурни дека сакате да ја стопирате синхронизацијата на папката <i>%1</i>?</p><p><b>Забелешка:</b> Ова <b>нема</b> да избрише ниту една датотека.</p> - + Remove Folder Sync Connection Отстрани папка од синхронизација - + Disable virtual file support? Дали сакате да ја оневозможите поддршката за виртуални датотеки? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support Оневозможи поддршка @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Синхронизацијата е стартувана - + The syncing operation is running.<br/>Do you want to terminate it? Синхронизацијата е стартувана.<br/>Дали сакате да ја прекинете? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Искористено %1 (%3%) од %2. Некој папки, вклучувајќи ги и мрежно монтираните или споделените папки, може да имаат различен лимит. - + %1 of %2 in use Искористено %1 од %2 - + Currently there is no storage usage information available. Моментално нема информации за искористениот простор. - + %1 in use Искористено %1 - + %1 as %2 %1 како %2 - + The server version %1 is unsupported! Proceed at your own risk. Верзијата на серверот %1 е застарена и не е поддржана! Продолжете на сопствен ризик. - + Connected to %1. Поврзан со %1. - + Server %1 is temporarily unavailable. Серверот %1 е моментално недостапен. - + Server %1 is currently in maintenance mode. Серверот %1 е моментално во мод за одржување. - + Signed out from %1. Одјавен од %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Добивање на авторизација од прелистувач. <a href='%1'>Кликни тука</a> за да го отворите повторно прелистувачот. - + Connecting to %1 … Поврзување со %1 … - + No connection to %1 at %2. Нема врска со %1 на %2. - + Server configuration error: %1 at %2. Грешка во конфигурацијата на серверот: %1 во %2. - + No %1 connection configured. Нема конфигурирано %1 врска. - + There are folders that were not synchronized because they are too big: Има папки кој не се синхронизирани бидејќи се премногу големи: - + There are folders that were not synchronized because they are external storages: Има папки кој не се синхронизирани бидејќи тие се надворешни складишта: - + There are folders that were not synchronized because they are too big or external storages: Има папки кој не се синхронизирани бидејќи се премногу големи или се надворешни складишта: - + Confirm Account Removal Потврди отстранување на сметка - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Дали сте сигурни дека сакате да ја отстраните врската со сметката <i>%1</i>?</p><p><b>Забелешка:</b> Ова <b>нема</b> да избрише ниту една датотека.</p> - + Remove connection Отстрани врска - - + This account supports end-to-end encryption На оваа сметка е овозможена крај-до-крај енкрипција - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. За повеќе активности отворете ја апликацијата со активности. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. Преземање активности... - + Fetching activities … Преземање активности ... - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Продолжување би значело <b>бришење на ова подесување</b>. - + Continuing will mean <b>ignoring these settings</b>. Продолжување би значело <b>игнорирање на ова подесување</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Излези - + Continue Продолжи - + Error accessing the configuration file Грешка при пристапот до конфигурациската датотека @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. Настана грешка при пристапувањето до конфигурациската датотека на %1. Бидете сигурни дека вашата сметка може да пристапи до конфигурациската датотека. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Излези %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 Грешка во мрежата: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Грешка при запишување на метаподатоци во базата со податоци @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1193,8 +1427,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1202,27 +1436,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Грешка при отварање на папката %1 - + Directory not accessible on client, permission denied Папката не е достапна за клиентот, забранет пристап - + Directory not found: %1 Папката не е пронајдена: %1 - + Filename encoding is not valid - + Error while reading directory %1 Грешка при читање на папката %1 @@ -1230,83 +1464,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1314,7 +1548,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1443,145 +1677,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Локалната папка %1 не постои. - + %1 should be a folder but is not. %1 треба да биде папка но не е.. - + %1 is not readable. Неможе да се прочита %1. - + %1 and %n other file(s) have been removed. Датотеката %1 и %n друга датотека се избришани.Датотеката %1 и %n други датотеки се избришани. - + %1 has been removed. %1 names a file. Датотеката %1 е избришана. - + %1 and %n other file(s) have been added. %1 и %n друга датотека е додадена.%1 и %n други датотеки се додадени. - + %1 has been added. %1 names a file. %1 е додадена. - + %1 and %n other file(s) have been updated. %1 и %n друга датотека се прикачени.%1 и %n други датотеки се прикачени. - + %1 has been updated. %1 names a file. %1 е ажурирана. - + %1 has been renamed to %2 and %n other file(s) have been renamed. Датотеката %1 е преименувана во %2 и %n друга датотека се преименувани.Датотеката %1 е преименувана во %2 и %n други датотеки се преименувани. - + %1 has been renamed to %2. %1 and %2 name files. Датотеката %1 е преименувана во %2. - + %1 has been moved to %2 and %n other file(s) have been moved. Датотеката %1 е преместена во %2 и %n друга датотека се преместени.Датотеката %1 е преместена во %2 и %n други датотеки се преместени. - + %1 has been moved to %2. Датотеката %1 е преместена во %2. - + %1 has and %n other file(s) have sync conflicts. Датотеката %1 и %n друга датотека наидоа на конфликт при сонхронизација.Датотеката %1 и %n други датотеки наидоа на конфликт при сонхронизација. - + %1 has a sync conflict. Please check the conflict file! Датотеката %1 наиде на конфликт при синхронизација. Проверете ја датотеката со конфликт! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. Датотеката %1 и %n друга датотека неможат да бидат синхронизирани поради грешки. Прегледај го дневникот со записи за детали.Датотеката %1 и %n други датотеки неможат да бидат синхронизирани поради грешки. Прегледај го дневникот со записи за детали. - + %1 could not be synced due to an error. See the log for details. Датотеката %1 неможе да бидат синхронизирана поради грешка. Прегледај го дневникот со записи за детали. - + %1 and %n other file(s) are currently locked. Датотеката %1 и %n друга датотека се моментално заклучени.Датотеката %1 и %n други датотеки се моментално заклучени. - + %1 is currently locked. Датотеката %1 е моментално заклучена. - + Sync Activity Активности од синхронизација - + Could not read system exclude file - + A new folder larger than %1 MB has been added: %2. Нова папка поголема од %1 MB е додадена: %2. - + A folder from an external storage has been added. Папка од надворешно складиште е додадена. - + Please go in the settings to select it if you wish to download it. Одете во параметрите и изберете ја ако сакате да ја преземете. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Папката %1 е креирана но предходно беше исклучена од синхронизација. Податоците во неа нема да бидат синхронизирани. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Датотеката %1 е креирана но предходно беше исклучена од синхронизација. Таа нема да биде синхронизирана. - + 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). @@ -1590,7 +1824,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1598,24 +1832,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Дали сакате да ги избришете сите датотеки? - + Remove all files Отстрани ги сите датотеки - + Keep files Задржи ги датотеките @@ -1651,22 +1885,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1676,27 +1910,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Недефинирана состојба. - + Undefined state. - + Waiting to start syncing. Чекање за почеток на синхронизација. - + Preparing for sync. Подготовка за синхронизација. - + Sync is running. Синхронизацијата е стартувана. - + Sync finished with unresolved conflicts. Синхронизацијата заврши во нерешени конфликти. @@ -1716,62 +1950,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Откажано од корисник. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Синхронизацијата е паузирана. - + %1 (Sync is paused) %1 (Синхронизацијата е паузирана) - + No valid folder selected! Не е избрана папка! - + The selected path does not exist! Избраната патека не постои! - + The selected path is not a folder! Избраната патека не е папка! - + You have no permission to write to the selected folder! Немате дозвола за запишување во избраната папка! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Локалната папка %1 веќе е во папка која се синхронизира. Изберете друга папка! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Локалната папка %1 веќе е во папка која се синхронизира. Изберете друга папка! - + There is already a sync from the server to this local folder. Please pick another local folder! Веќе постои синхронизација од серверот до оваа локална папка. Изберете друга локална папка! @@ -1784,7 +2018,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Додади папка за синхронизација - + File Датотека @@ -1792,152 +2026,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Треба да бидете поврзани за да додадете папка - + Click this button to add a folder to synchronize. Кликнете на копчето за да додадете папка за синхронизација. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Грешка при вчитување на листата со папки од серверот. - + Fetching folder list from server … Преземање на листата со папки од серверот ... - + There are unresolved conflicts. Click for details. Има нерешени конфликти. Кликнете за детали. - + Virtual file support is enabled. Овозможиена е поддршка за виртуални датотеки. - + Signed out Одјавен - + Synchronizing VirtualFiles with local folder Синхронизација на виртуелни датотеки со локална папка - + Synchronizing with local folder Синхронизација со локална папка - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Усогласување на промените - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Синхронизација на %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) преземање %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) прикачување %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 од %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Преостанато време %5, %1 од %2, датотека %3 од %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 од %2, датотека %3 од %4 - + file %1 of %2 датотека %1 од %2 - + Waiting … Почекајте... - + Waiting for %n other folder(s) … Чекање на друга папка …Чекање на %n други папки … - + Preparing to sync … Подготовка за синхронизација ... @@ -2168,13 +2406,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable стабилна - + beta бета @@ -2226,32 +2464,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Креирај Debug архива - + Server notifications that require attention. Известувања од серверот за кој е потребно внимание. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? Промена на каналот за ажурирање? - + 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. 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. @@ -2259,27 +2497,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Имајте во предвид дека ова само избира врзии што ќе се преземат од базенот и дека нема враќање назад: Значи, враќањето од бета-каналот до стабилниот канал обично не може да се направи веднаш и треба да се чека стабилна верзија која е понова од тековно инсталираната бета-верзија. - + Change update channel Промена на каналот за ажурирање - + Cancel Откажи - + Zip Archives Zip Архиви - + Debug Archive Created Креирана Debug архива - + Debug archive is created at %1 Debug архива креирана на %1 @@ -2287,22 +2525,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Потребна е лозинка за споделувањето - + Please enter a password for your link share: Внесете лозинка за да линкот кој го споделувате: - + Sharing error Грешка при споделување - + Could not retrieve or create the public link share. Error: %1 @@ -2540,6 +2778,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Затвори + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2872,60 +3115,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (експериментално) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" Синхронизирај ја папката "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 слободен простор - + Virtual files are not available for the selected folder Не се достапни виртуелни датотеки за избраната папка - + Local Sync Folder Локална синхронизирана папка - - + + (%1) (%1) - + There isn't enough free space in the local folder! Нема доволно простор во локалната папка! @@ -2997,7 +3240,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3029,144 +3273,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Успешно поврзување со %1: %2 верзија %3 (%4)</font><br/><br/> - + Invalid URL Невалидна URL - + Failed to connect to %1 at %2:<br/>%3 Неуспешно поврзување со %1 на %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Истече времето за поврзување на %1 во %2. - + Trying to connect to %1 at %2 … Обид за поврзување со %1 во %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Локалната папка %1 веќе постои, поставете ја за синхронизација.<br/><br/> - + Creating local sync folder %1 … Креирање на локална папка за синхронизација %1 … - + OK Добро - + failed. неуспешно. - + Could not create local folder %1 Неможе да се креира локалната папка %1 - + No remote folder specified! Нема избрано папка на серверот! - + Error: %1 Грешка: %1 - + creating folder on Nextcloud: %1 Креирање папка: %1 - + Remote folder %1 created successfully. Папката %1 е успрешно креирана на серверот. - + The remote folder %1 already exists. Connecting it for syncing. Папката %1 веќе постои на серверот. Поврзете се за да ја синхронизирате. - - + + The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Креирањето на папката на серверот беше неуспешно бидејќи акредитивите се неточни!<br/>Вратете се назад и проверете ги вашите акредитиви.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Креирањето на папката на серверот беше неуспешно највероватно бидејќи акредитивите се неточни.</font><br/>Вратете се назад и проверете ги вашите акредитиви.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Креирање на папка %1 на серверот беше неуспешно со грешка <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! Успешно поврзување со %1! - + Connection to %1 could not be established. Please check again. Врската со %1 неможе да се воспостави. Пробајте покасно. - + Folder rename failed Неуспешно преименување на папка - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Локална папка за синхронизација %1 е успешно креирана!</b></font> @@ -3189,12 +3433,12 @@ Note that using any logging command line options will override this setting.Откажи - + Enable experimental feature? Овозможи експерименталена можност? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3205,12 +3449,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe Бидете безбедени @@ -3239,162 +3483,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. Датотека е на листата за игнорирани датотеки. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character Името на датотеката соджи невалиден карактер - + The file name is a reserved name on this file system. Ова име на датотека е резервирано име на системот. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Името на датотеката е премногу долго. - + File/Folder is ignored because it's hidden. Датотека/Папка е игнорирана бидејќи е сокриена. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Конфликт: Верзијата од серверот е преземена, локалната верзија е преименувана и не е прикачена на серверот. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. Името на датотеката е на црна листа на серверот. - + File has extension reserved for virtual files. - + size големина - + permission дозвола - + file id id на датотека - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder Не е дозволено бидејќи немате дозвола да додавате потпапки во оваа папка - + Not allowed because you don't have permission to add files in that folder Не е дозволено бидејќи немате дозвола да додавате датотеки во оваа папка - + Not allowed to upload this file because it is read-only on the server, restoring Не е дозволено да ја прикачите оваа датотека бидејќи е само за читање на серверот, враќање - + Moved to invalid target, restoring - + Not allowed to remove, restoring Не е дозволено бришење, враќање - + Error while reading the database Грешка при вчитување на податоци од датабазата - + Server replied with an error while reading directory "%1" : %2 @@ -3402,22 +3651,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use Датотеката во моментов се користи @@ -3430,19 +3679,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery - + Could not delete file record %1 from local DB @@ -3453,32 +3702,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 Слободниот простор на дискот е помалку од %1 - + File was deleted from server Датотеката е избришана од серверот - + The file could not be downloaded completely. - + The downloaded file is empty, but the server said it should have been %1. @@ -3488,18 +3737,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3520,7 +3774,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 неможе да се избрише датотеката %1, грешка: %2 @@ -3531,16 +3785,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use Датотеката %1, моментално се користи @@ -3548,7 +3807,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3561,46 +3820,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use Датотеката %1, моментално се користи - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Неуспешно преименување на датотека @@ -3621,7 +3885,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Погрешен HTTP код е испратен од серверот. Се очекува 204, но примено е"%1 %2". @@ -3634,12 +3898,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Серверот одговори со погрешен HTTP код. Очевуван одговор 201, но серверот одговори со "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use Датотеката %1, моментално се користи @@ -3647,42 +3911,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Неможе да се примени %1 во %2, грешка: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Серверот одговори со погрешен HTTP код. Очевуван одговор 201, но серверот одговори со "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use Датотеката %1, моментално се користи - + Error setting pin state - + Error writing metadata to the database Грешка при запишување на метаподатоци во базата со податоци @@ -3872,7 +4136,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3890,23 +4154,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Параметри - + %1 Settings This name refers to the application name e.g Nextcloud %1 Параметри - + General Општо - + Network Мрежа - + Account Сметка @@ -3914,17 +4178,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4000,7 +4269,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4009,132 +4278,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … Избери нова локација ... - + I shared something with you Споделив нешто со вас - - + + Share options Опции за споделување - - + + Activity - + Copy private link to clipboard Копирај приватен линк во клипборд - + Send private link by email … Испрати приватен линк преку е-пошта ... + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Повторно споделување на оваа датотека не е дозволено - + Resharing this folder is not allowed Повторно споделување на оваа папка не е дозволено - - + + Copy public link Копирај јавен линк - + Copy internal link Копирај внатрешен линк - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Уреди - + Open in browser Отвори во прелистувач - + Resolve conflict … Реши конфликт ... - + Move and rename … Премести и преименувај ... - + Move, rename and upload … Премести, преименувај и прикачи ... - + Delete local changes Избриши ги локалните измени - + Move and upload … Премести и прикачи ... - + Delete Избриши @@ -4352,63 +4658,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (прескокнато поради предходна грешка, повторен обид за %2) - + Could not update file: %1 Неможе да се ажурира датотеката: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Неразрешен конфликт. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Достапно е %1, потребно е %2 за почеток - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal @@ -4418,12 +4724,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Има малку простор на дискот: Преземањата ќе доведат да просторот на дискот се намали под %1 поради тоа се прескокнува. - + There is insufficient space available on the server for some uploads. @@ -4492,59 +4798,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Додади сметка - + Open main dialog Отвори во прозорец - - + + Pause sync Паузирај синхронизација - - + + Resume sync Продолжи синхронизација - + Settings Параметри - + Help - + Exit %1 Излез %1 - + Pause sync for all Паузирај ја синхронизацијата за сите - + Resume sync for all Продолжи ја синхронизацијата за сите - + %1: %2 %1: %2 @@ -4552,24 +4858,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Клиент за компјутер</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Верзија %1. За повеќе информации кликнете <a href='%2'>тука</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Ова издание е обезбедено од %1</p> @@ -4577,22 +4883,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4600,30 +4906,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Повтори ги сите прикачувања + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Потврди отстранување на сметка - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Дали сте сигурни дека сакате да ја отстраните врската со сметката <i>%1</i>?</p><p><b>Забелешка:</b> Ова <b>нема</b> да избрише ниту една датотека.</p> - + Remove connection Отстрани врска - + Cancel Откажи @@ -4761,8 +5073,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4770,8 +5082,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4869,123 +5181,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Неподдржана верзија на серверот - + 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. Серверот каде што се наоѓа %1 е премногу застарен и не ја поддржува верзијата %2. Користењето клиент со неподдржана верзија на сервер не е тестирано и потенцијално опасно. Продолжете на ваша одговорност. - + Disconnected Исклучен - + Disconnected from some accounts Исклучен од некој сметки - + Disconnected from %1 Исклучен од %1 - + Disconnected from accounts: Исклучен од сметките: - + Account %1: %2 Сметка %1: %2 - + Please sign in Ве молиме најавете се - + Signed out Одјавен - + Account synchronization is disabled Синхронизација на сметката е оневозможена - - + + Synchronization is paused Синхронизацијата е паузирана - + Folder %1: %2 Папка %1: %2 - + Unresolved conflicts Неразрешени конфликти - + Up to date Ажурирано - + Error during synchronization Грешка при синхронизација - + There are no sync folders configured. Нема поставено папки за синхронизација. - + No sync folders configured Нема папки за синхронизација. - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Синхронизација на %1 од %2 (преостануваат %3) - + Syncing %1 of %2 Синхронизација на %1 од %2 - + Syncing %1 (%2 left) Синхронизација на %1 (преостануваат %2) - + Syncing %1 Синхронизација на %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5137,27 +5449,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Нова папка - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5223,30 +5535,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Означи како прочитано + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5262,7 +5650,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5320,6 +5708,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5383,67 +5787,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5527,24 +5931,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Моментална сметка - - + + Resume sync for all Продолжи ја синхронизацијата за сите - - + + Pause sync for all Паузирај ја синхронизацијата за сите @@ -5554,22 +5958,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Додади сметка - + Add new account Додади нова сметка - + Settings Параметри - + Exit Излез @@ -5578,11 +5982,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Аватар на оваа сметка - - - Current account avatar - - Current user status is online @@ -5594,70 +5993,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account Отвори ја локалната папка на оваа сметка - + Connected Поврзан - + Disconnected Исклучен - + Open Nextcloud Talk in browser Отвори разговор во прелистувач - + More apps Повеќе апликации - + Open %1 in browser Отвори %1 во прелистувач - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5665,7 +6069,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Изграден од Git ревизија <a href="%1">%2</a> на %3, %4 со користење на Qt %5, %6</small></p> @@ -5699,72 +6103,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Избришани - + Moved to %1 Преместена во %1 - + Ignored Игнорирана - + Filesystem access error Грешка при пристап до податоците - + Error Грешка - + Updated local metadata Ажурирани локалните метадата податоци - + Unknown Непознат - + downloading преземање - + uploading прикачување - + deleting бришење - + moving поместување - + ignoring игнорирање - + error грешка - + updating local metadata ажурирање на локалната метадата diff --git a/translations/client_nb_NO.ts b/translations/client_nb_NO.ts index 583bba909..653509371 100644 --- a/translations/client_nb_NO.ts +++ b/translations/client_nb_NO.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Åpne %1 lokalt - + In %1 i %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Vis flere handlinger @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Lukk + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Aktivitetsliste @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Flytting til papirkurven er ikke implementert på denne plattformen - + Error removing "%1": %2 Feil ved fjerning av "%1": %2 - + Could not remove folder "%1" Kan ikke slette mappe "%1" @@ -321,7 +331,7 @@ Feil HTTP-kode returnert av serveren. Forventet 204, men mottok "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 feilet med å låse opp kryptert mappe %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Fil %1 er låst av %2 - + Lock operation on %1 failed with error %2 Låsing av %1 feilet med %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Avbryt @@ -400,12 +410,12 @@ Du ser ut til å ha funksjonen virtuelle filer aktivert på denne mappen. For øyeblikket er det ikke mulig å implisitt laste ned virtuelle filer som er ende-til-ende-kryptert. For å få den beste opplevelsen med virtuelle filer og ende-til-ende-kryptering, sørg for at den krypterte mappen er merket med "Gjør alltid tilgjengelig lokalt". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Ikke krypter mappe - + Do not encrypt folder - + Encrypt folder Krypter mappe - + No account configured. Ingen konto konfigurert. - - Display mnemonic - Vis mnemonic + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Vis mnemonic @@ -445,18 +455,23 @@ Aktiver kryptering - + + End-to-end encryption has been enabled for this account + + + + Warning Advarsel - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Du kan ikke kryptere en mappe med innhold, vennligst fjern filene. @@ -469,121 +484,121 @@ Vent på den nye synkroniseringen, og krypter den deretter. - + Encryption failed Kryptering feilet. - + Could not encrypt folder because the folder does not exist anymore Kunne ikke kryptere mappen fordi mappen ikke eksisterer lengre - - + + Open folder Åpne mappe - + Encrypt Krypter - - + + Edit Ignored Files Rediger ignorerte filer - - + + Create new folder Ny mappe - - + + Availability Tilgjengelighet - + Choose what to sync Velg hva som synkroniseres - + Force sync now Tving synkronisering nå - + Restart sync Synkroniser på ny - + Resume sync Fortsett synkronisering - + Pause sync Sett synkronisering på pause - + Remove folder sync connection Fjern tilkobling for synkronisering av mappe - + Disable virtual file support … Deaktiver støtte for virtuelle filer - + Enable virtual file support %1 … Aktiver støtte for virtuelle filer %1 … - + (experimental) (eksperimentell) - + Folder creation failed Oppretting av mappe feilet - + <p>Could not create local folder <i>%1</i>.</p> <p>Kunne ikke opprette lokal mappe <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Bekreft fjerning av tilkobling for synkronisering av mappe - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vil du virkelig stoppe synkronisering av mappen <i>%1</i>?</p><p><b>Merk:</b> Dette vil <b>ikke</b> slette noen filer.</p> - + Remove Folder Sync Connection Fjern tilkobling for mappe-synkronisering - + Disable virtual file support? Deaktiver støtte for virtuelle filer? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Den eneste fordelen med å deaktivere støtte for virtuelle filer er at den sele Denne handlingen vil avbryte enhver synkronisering som kjører. - + Disable support Deaktiver support @@ -606,144 +621,176 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Synkroniserer... - + The syncing operation is running.<br/>Do you want to terminate it? Synkronisering kjører.<br/>Vil du avbryte den? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) av %2 i bruk. Noen mapper, inkludert nettverkstilkoblede eller delte mapper, kan ha andre begrensninger. - + %1 of %2 in use %1 av %2 i bruk - + Currently there is no storage usage information available. Ingen informasjon om bruk av lagringsplass tilgjengelig for øyeblikket. - + %1 in use %1 i bruk - + %1 as %2 %1 som %2 - + The server version %1 is unsupported! Proceed at your own risk. Tjenerversjon %1 er utdatert og ikke støttet! Fortsett på egen risiko! - + Connected to %1. Tilkoblet %1. - + Server %1 is temporarily unavailable. Server %1 er midlertidig utilgjengelig. - + Server %1 is currently in maintenance mode. Server %1 er for øyeblikket i vedlikeholdsmodus. - + Signed out from %1. Logget ut fra %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Innhenting av autorisasjon fra nettleseren. <a href='%1'>Klikk her</a> for å åpne nettleseren på nytt.  - + Connecting to %1 … Kobler til %1 … - + No connection to %1 at %2. Ingen tilkobling til %1 på %2. - + Server configuration error: %1 at %2. Server konfigurasjons-feil: %1 ved %2. - + No %1 connection configured. Ingen %1-forbindelse konfigurert. - + There are folders that were not synchronized because they are too big: Noen mapper ble ikke synkronisert fordi de er for store - + There are folders that were not synchronized because they are external storages: Noen mapper ble ikke synkronisert fordi de er eksterne lagringsplasser: - + There are folders that were not synchronized because they are too big or external storages: Noen mapper ble ikke synkronisert fordi de er for store eller de er eksterne lagringsplasser: - + Confirm Account Removal Bekreft fjerning av konto - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vil du virkelig fjerne tilkoblingen til kontoen <i>%1</i>?</p><p><b>Merk:</b> Dette vil <b>ikke</b> slette noen filer.</p> - + Remove connection Fjern tilkobling - - + This account supports end-to-end encryption Denne kontoen støtter ende-til-ende kryptering - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. OCC::ActivityListModel - + For more activities please open the Activity app. For flere aktiviteter, åpne Aktivitetsappen. @@ -808,12 +855,12 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. - + Fetching activities … Henter aktiviteter… - + Files from the ignore list as well as symbolic links are not synced. Filer fra ignoreringslisten så vel som symbolske lenker synkroniseres ikke. @@ -864,32 +911,59 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Å fortsette betyr <b>slette disse innstillingene</b>. - + Continuing will mean <b>ignoring these settings</b>. Å fortsette betyr <b>ignorere disse innstillingene</b>. - + 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>. Enkelte innstillinger er konfigurert i nyere versjon av denne klienten og bruker funksjoner som ikke er tilgjengelig i denne versjonen.<br><br>%1<br><br>Konfigurasjonsfil er allerede sikkerhetskopiert til <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Avslutt - + Continue Fortsett - + Error accessing the configuration file Feil ved lesing av konfigurasjonsfil @@ -899,12 +973,12 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Avslutt %1 @@ -950,56 +1024,216 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. - + File Removed (start upload) %1 Fil fjernet (start opplasting) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. Lokal fil er endret samtidig med synkronisering. - + Network error: %1 Nettverkfeil: %1 - + Error updating metadata: %1 Feil ved oppdatering av metadata: %1 - + The file %1 is currently in use Filen %1 er i bruk - + The local file was removed during sync.  Lokal fil er slettet samtidig med synkronisering. - + Restoration failed: %1 Gjenoppretting feilet: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Feil ved skriving av metadata til databasen @@ -1017,12 +1251,12 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Oppgi E2E passord @@ -1198,8 +1432,8 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1207,27 +1441,27 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 Mappe ikke funnet: %1 - + Filename encoding is not valid Filnavn koding er ikke gyldig - + Error while reading directory %1 Kunne ikke lese mappen %1 @@ -1235,83 +1469,83 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Denne handlingen vil avbryte enhver synkronisering som kjører. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1448,144 +1682,144 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Lokal mappe %1 eksisterer ikke. - + %1 should be a folder but is not. %1 skal være en mappe men er ikke det. - + %1 is not readable. %1 kan ikke leses. - + %1 and %n other file(s) have been removed. %1 og %n annen fil har blitt fjernet.%1 og %n andre filer har blitt fjernet. - + %1 has been removed. %1 names a file. %1 har blitt fjernet. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 og %n annen fil har blitt oppdatert.%1 og %n andre filer har blitt oppdatert. - + %1 has been updated. %1 names a file. %1 har blitt oppdatert. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 er blitt omdøpt til %2 og %n annen fil har blitt omdøpt.%1 er blitt omdøpt til %2 og %n andre filer har blitt omdøpt. - + %1 has been renamed to %2. %1 and %2 name files. %1 har blitt omdøpt til %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 er blitt flyttet til %2 og %n annen fil har blitt flyttet.%1 er blitt flyttet til %2 og %n andre filer har blitt flyttet. - + %1 has been moved to %2. %1 har blitt flyttet til %2. - + %1 has and %n other file(s) have sync conflicts. %1 og %n andre filer har synkroniseringskonflikter.%1 og %n andre filer har synkroniseringskonflikter. - + %1 has a sync conflict. Please check the conflict file! %1 har en synkroniseringskonflikt. Sjekk konflikt-filen. - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 og %n andre filer kunne ikke synkroniseres pga. feil. Se loggen for detaljer.%1 og %n andre filer kunne ikke synkroniseres på grunn av feil. Se logg for detaljer. - + %1 could not be synced due to an error. See the log for details. %1 kunne ikke synkroniseres på grunn av en feil. Se logg for detaljer. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. %1 er låst. - + Sync Activity Synkroniseringsaktivitet - + Could not read system exclude file Klarte ikke å lese systemets ekskluderingsfil - + A new folder larger than %1 MB has been added: %2. En ny mappe større enn %1 MB er blitt lagt til: %2. - + A folder from an external storage has been added. En mappe fra et eksternt lager er blitt lagt til. - + Please go in the settings to select it if you wish to download it. Gå til Innstillinger og velg den hvis du ønsker å laste den ned. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1594,7 +1828,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1602,24 +1836,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Fjerne alle filer? - + Remove all files Fjern alle filer - + Keep files Behold filer @@ -1655,22 +1889,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Klarte ikke å tilbakestille mappetilstand - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (sikkerhetskopi) - + (backup %1) (sikkerhetskopi %1) @@ -1680,27 +1914,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Udefinert tilstand. - + Undefined state. - + Waiting to start syncing. Venter på å starte synkronisering. - + Preparing for sync. Forbereder synkronisering. - + Sync is running. Synkronisering kjører. - + Sync finished with unresolved conflicts. @@ -1720,62 +1954,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Brukeravbrudd. - + Last sync was successful. Siste synkronisering var vellykket. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Synkronisering er satt på pause. - + %1 (Sync is paused) %1 (Synkronisering er satt på pause) - + No valid folder selected! Ingen gyldig mappe valgt! - + The selected path does not exist! - + The selected path is not a folder! Den valgte stien er ikke en mappe! - + You have no permission to write to the selected folder! Du har ikke skrivetilgang til den valgte mappen! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Den lokale mappen %1 inneholder allerede en mappe brukt i en mappe-synkronisering. Velg en annen! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Den lokale mappen %1 er allerede en undermappe av en mappe brukt i en mappe-synkronisering. Velg en annen! - + There is already a sync from the server to this local folder. Please pick another local folder! Det er allerede en synkronisering fra serveren til denne lokale mappen. Velg en annen mappe! @@ -1788,7 +2022,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Legg til mappe-synkronisering - + File Fil @@ -1796,152 +2030,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Du må være tilkoblet for å legge til en mappe - + Click this button to add a folder to synchronize. Klikk denne knappen for å legge til en mappe som skal synkroniseres. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Feil ved innlasting av listen av mapper fra serveren. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Det finnes uløste konflikter. Klikk for detaljer. - + Virtual file support is enabled. - + Signed out Logget ut - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder Synkroniserer med lokal mappe - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Sammenslår endringer - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synkroniserer %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) nedlasting %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) opplasting %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 av %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 igjen, %1 av %2, fil %3 av %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 av %2, fil %3 av %4 - + file %1 of %2 fil %1 av %2 - + Waiting … Venter … - + Waiting for %n other folder(s) … - + Preparing to sync … Forbereder synkronisering … @@ -2172,13 +2410,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2230,59 +2468,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Opprett debugging-fil - + Server notifications that require attention. Servervarsler som krever oppmerksomhet. - + Show call notification dialogs. Vis ringevarsler-logg - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created Debugging-fil opprettet - + Debug archive is created at %1 Debugging-fil er opprettet under %1 @@ -2290,22 +2528,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error Delingsfeil - + Could not retrieve or create the public link share. Error: %1 @@ -2541,6 +2779,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Lukk + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2873,60 +3116,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Lokal synkroniseringsmappe - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2998,7 +3241,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3030,144 +3274,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Vellykket oppkobling mot %1: %2 versjon %3 (%4)</font><br/><br/> - + Invalid URL Ugyldig URL - + Failed to connect to %1 at %2:<br/>%3 Klarte ikke å koble til %1 på %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Tidsavbrudd ved oppkobling mot %1 på %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Tilgang forbudt av serveren. For å sjekke om du har gyldig tilgang, <a href="%1">klikk her</a> for å aksessere tjenesten med nettleseren din. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Lokal synkroniseringsmappe %1 finnes allerede. Setter den opp for synkronisering.<br/><br/> - + Creating local sync folder %1 … - + OK - + failed. feilet. - + Could not create local folder %1 Klarte ikke å opprette lokal mappe %1 - + No remote folder specified! Ingen ekstern mappe spesifisert! - + Error: %1 Feil: %1 - + creating folder on Nextcloud: %1 oppretter mappe på Nextcloud: %1 - + Remote folder %1 created successfully. Ekstern mappe %1 ble opprettet. - + The remote folder %1 already exists. Connecting it for syncing. Ekstern mappe %1 finnes allerede. Kobler den til for synkronisering. - - + + The folder creation resulted in HTTP error code %1 Oppretting av mappe resulterte i HTTP-feilkode %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Oppretting av ekstern mappe feilet fordi påloggingsinformasjonen er feil!<br/>Gå tilbake og sjekk brukernavnet og passordet ditt.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Oppretting av ekstern mappe feilet, sannsynligvis fordi oppgitt påloggingsinformasjon er feil.</font><br/>Vennligst gå tilbake og sjekk ditt brukernavn og passord.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Oppretting av ekstern mappe %1 feilet med feil <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. En synkroniseringsforbindelse fra %1 til ekstern mappe %2 ble satt opp. - + Successfully connected to %1! Forbindelse til %1 opprettet! - + Connection to %1 could not be established. Please check again. Klarte ikke å etablere forbindelse til %1. Sjekk igjen. - + Folder rename failed Omdøping av mappe feilet - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Oppretting av lokal synkroniseringsmappe %1 vellykket!</b></font> @@ -3190,12 +3434,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3206,12 +3450,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3240,162 +3484,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3403,22 +3652,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3431,19 +3680,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Filen er endret siden den ble oppdaget - + Could not delete file record %1 from local DB @@ -3454,32 +3703,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Fil %1 kan ikke lastes ned på grunn av lokalt sammenfall av filnavn! - + The download would reduce free local disk space below the limit Nedlastingen ville redusert ledig lokal diskplass til under grensen - + Free space on disk is less than %1 Ledig plass på disk er mindre enn %1 - + File was deleted from server Filen ble slettet fra serveren - + The file could not be downloaded completely. Hele filen kunne ikke lastes ned. - + The downloaded file is empty, but the server said it should have been %1. @@ -3489,18 +3738,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Fil %1 kan ikke lagres på grunn av lokal konflikt med filnavn. - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3521,7 +3775,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 klarte ikke å slette fil %1, feil: %2 @@ -3532,16 +3786,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3549,7 +3808,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Kunne ikke fjerne %1 på grunn av lokalt sammenfall av filnavn @@ -3562,46 +3821,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3622,7 +3886,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3635,12 +3899,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Feil HTTP-kode returnert fra server. Ventet 201, men mottok "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3648,42 +3912,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Feil HTTP-kode returnert fra server. Ventet 201, men mottok "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Feil ved skriving av metadata til databasen @@ -3873,7 +4137,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3891,23 +4155,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Innstillinger - + %1 Settings This name refers to the application name e.g Nextcloud - + General Generelt - + Network Nettverk - + Account Konto @@ -3915,17 +4179,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4001,7 +4270,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4010,132 +4279,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Jeg delte noe med deg - - + + Share options Alternativer for deling - - + + Activity - + Copy private link to clipboard Kopier privat lenke til utklippstavlen - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Videre deling av denne filen er ikke tillatt - + Resharing this folder is not allowed - - + + Copy public link Kopier offentlig lenke - + Copy internal link Kopier intern lenke - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Rediger - + Open in browser Åpne i nettleser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Slett @@ -4353,63 +4659,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Uløst konflikt - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Bare %1 er tilgjengelig, trenger minst %2 for å begynne - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Kan ikke lese svartelisten fra den lokale databasen - + Unable to read from the sync journal. Kan ikke lese fra synkroniseringsjournalen - + Cannot open the sync journal Kan ikke åpne synkroniseringsjournalen @@ -4419,12 +4725,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4493,59 +4799,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Legg til en konto - + Open main dialog Åpne hovedvindu - - + + Pause sync Sett synkronisering på pause - - + + Resume sync Fortsett synkronisering - + Settings Innstillinger - + Help Hjelp - + Exit %1 Avslutt %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4553,24 +4859,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4578,22 +4884,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4601,30 +4907,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Prøv alle opplastinger igjen + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Bekreft fjerning av konto - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Fjern tilkobling - + Cancel Avbryt @@ -4762,8 +5074,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4771,8 +5083,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4870,123 +5182,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Server-versjonen støttes ikke - + 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. - + Disconnected Frakoblet - + Disconnected from some accounts - + Disconnected from %1 Koble fra %1 - + Disconnected from accounts: Koblet fra kontoer: - + Account %1: %2 Konto %1: %2 - + Please sign in Vennligst logg inn - + Signed out Logget ut - + Account synchronization is disabled Kontosynkronisering er deaktivert - - + + Synchronization is paused Synkronisering er satt på pause - + Folder %1: %2 Mappe %1: %2 - + Unresolved conflicts Uløst konflikter - + Up to date Oppdatert - + Error during synchronization Feil under synkronisering - + There are no sync folders configured. Ingen synkroniseringsmapper er konfigurert. - + No sync folders configured - + Ingen synkroniseringsmapper konfigurert - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Synkroniserer %1 av %2 (%3 gjenstår) - + Syncing %1 of %2 Synkroniserer %1 av %2 - + Syncing %1 (%2 left) Synkroniserer %1 (%2 gjenstår) - + Syncing %1 Synkroniserer %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5138,27 +5450,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ny mappe - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 Synkronisert %1 @@ -5224,30 +5536,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5263,7 +5651,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5321,6 +5709,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5384,67 +5788,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel Avbryt - + Clear status message - + Set status message @@ -5528,24 +5932,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Nåværende konto - - + + Resume sync for all - - + + Pause sync for all @@ -5555,22 +5959,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Legg til en konto - + Add new account - + Settings Innstillinger - + Exit Avslutt @@ -5579,11 +5983,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5595,70 +5994,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Tilkoblet - + Disconnected Frakoblet - + Open Nextcloud Talk in browser - + More apps Flere apper - + Open %1 in browser Åpne %1 i nettleser - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available System Tray er ikke tilgjengelig - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5666,7 +6070,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5700,72 +6104,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Slettet - + Moved to %1 Flyttet til %1 - + Ignored Ignorert - + Filesystem access error Feil med tilgang til filsystemet - + Error Feil - + Updated local metadata Oppdaterte lokale metadata - + Unknown Ukjent - + downloading laster ned - + uploading laster opp - + deleting sletter - + moving flytter - + ignoring ignorerer - + error feil - + updating local metadata oppdaterer lokale metadata diff --git a/translations/client_nl.ts b/translations/client_nl.ts index 84aad06ea..c37179b44 100644 --- a/translations/client_nl.ts +++ b/translations/client_nl.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally %1 lokaal openen - + In %1 In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Toon meer acties @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Negeren + + + Open file details + Bestandsdetails openen + Open share dialog @@ -37,20 +42,20 @@ ActivityList - + Activity list Activiteitenlijst No activities yet - + Nog geen activiteiten BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Verplaatsen naar de prullenbak wordt niet ondersteund op dit platform - + Error removing "%1": %2 Fout bij verwijderen '%1': %2 - + Could not remove folder "%1" Kan map "%1" niet verwijderen @@ -321,7 +331,7 @@ Foutieve HTTP code ontvangen van de server. Verwacht was 204, maar ontvangen "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 kon versleutelde map %2" niet ontgrendelen. @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Annuleren @@ -400,12 +410,12 @@ Het lijkt erop dat de functie Virtuele bestanden voor deze map is ingeschakeld. Momenteel is het niet mogelijk om impliciet virtuele bestanden te downloaden die end-to-end versleuteld zijn. Om de beste ervaring met virtuele bestanden en end-to-end-versleuteling te krijgen, raden we aan om ervoor te zorgen dat de versleutelde map is gemarkeerd met "Altijd lokaal beschikbaar maken". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Map niet versleutelen - + Do not encrypt folder - + Encrypt folder Versleutel map - + No account configured. Geen account ingesteld. - - Display mnemonic - Geheugensteun weergeven + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Geheugensteun weergeven @@ -445,18 +455,23 @@ Encryptie activeren - + + End-to-end encryption has been enabled for this account + + + + Warning Waarschuwing - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Je kunt een map met inhoud niet versleutelen, verwijder de bestanden. Wacht op de nieuwe synchronisatie en versleutel ze vervolgens. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed Versleuteling mislukt - + Could not encrypt folder because the folder does not exist anymore Kon map niet versleutelen omdat de map niet meer bestaat - - + + Open folder Map openen - + Encrypt Versleutelen - - + + Edit Ignored Files Genegeerde bestanden bewerken - - + + Create new folder Maak nieuwe map aan - - + + Availability Beschikbaarheid - + Choose what to sync Kies wat je wilt synchroniseren - + Force sync now Synchronisatie nu forceren - + Restart sync Synchronisatie herstarten - + Resume sync Synchronisatie hervatten - + Pause sync Synchronisatie pauzeren - + Remove folder sync connection Verwijder verbinding voor mapsynchronisatie - + Disable virtual file support … Ondersteuning voor virtuele bestanden uitschakelen... - + Enable virtual file support %1 … Virtuele bestandsondersteuning inschakelen %1... - + (experimental) (experimenteel) - + Folder creation failed Map maken mislukt - + <p>Could not create local folder <i>%1</i>.</p> <p>Kan lokale map <i>%1</i> niet maken.</p> - + Confirm Folder Sync Connection Removal Bevestig het verwijderen van de verbinding voor mapsynchronisatie - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Weet je zeker dat je het synchroniseren van map <i>%1</i> wilt stoppen?</p><p><b>Opmerking:</b> Dit zal <b>geen</b> bestanden verwijderen.</p> - + Remove Folder Sync Connection Verwijder verbinding voor mapsynchronisatie - + Disable virtual file support? Ondersteuning voor virtuele bestanden uitschakelen? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -595,7 +610,7 @@ Het enige voordeel van het uitschakelen van ondersteuning voor virtuele bestande Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. - + Disable support Ondersteuning uitschakelen @@ -605,144 +620,176 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Bezig met synchroniseren - + The syncing operation is running.<br/>Do you want to terminate it? Bezig met synchroniseren.<br/>Wil je stoppen met synchroniseren? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) van %2 in gebruik. Sommige mappen, inclusief netwerkmappen en gedeelde mappen, kunnen andere limieten hebben. - + %1 of %2 in use %1 van %2 in gebruik - + Currently there is no storage usage information available. Er is nu geen informatie over het gebruik van de opslagruimte beschikbaar. - + %1 in use %1 in gebruik - + %1 as %2 %1 als %2 - + The server version %1 is unsupported! Proceed at your own risk. De serverversie %1 wordt niet ondersteund! Verdergaan is op eigen risico. - + Connected to %1. Verbonden met %1. - + Server %1 is temporarily unavailable. Server %1 is tijdelijk niet beschikbaar. - + Server %1 is currently in maintenance mode. Server %1 is momenteel in onderhoudsmodus. - + Signed out from %1. Uitgelogd van %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Autorisatie van de browser wordt verkregen. <a href='%1'>Klik hier</a> om de browser te heropenen. - + Connecting to %1 … Verbinden met %1 ... - + No connection to %1 at %2. Geen verbinding met %1 op %2. - + Server configuration error: %1 at %2. Serverconfiguratiefout: %1 op %2. - + No %1 connection configured. Geen %1 connectie geconfigureerd. - + There are folders that were not synchronized because they are too big: Er zijn mappen die niet gesynchroniseerd zijn, omdat ze te groot zijn: - + There are folders that were not synchronized because they are external storages: Er zijn mappen die niet gesynchroniseerd zijn, omdat ze op externe opslag staan: - + There are folders that were not synchronized because they are too big or external storages: Er zijn mappen die niet gesynchroniseerd zijn, omdat ze te groot zijn of op externe opslag staan: - + Confirm Account Removal Bevestig verwijderen account - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Wil je de verbinding met het account <i>%1</i> echt verbreken?</p><p><b>Let op:</b> Hierdoor worden <b>geen</b> bestanden verwijderd.</p> - + Remove connection Verbinding verwijderen - - + This account supports end-to-end encryption Dit account ondersteunt end-to-end-versleuteling - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -797,7 +844,7 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. OCC::ActivityListModel - + For more activities please open the Activity app. Voor meer activiteiten open de Activiteit app. @@ -807,12 +854,12 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Bestanden op de negeerlijst en symbolische links worden niet gesynchroniseerd. @@ -863,32 +910,59 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Doorgaan betekent <b>verwijderen van deze instellingen</b>. - + Continuing will mean <b>ignoring these settings</b>. Doorgaan betekent <b>negeren van deze instellingen</b>. - + 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>. Sommige instellingen zijn geconfigureerd in nieuwere versies van deze client en maken gebruik van functies die niet beschikbaar zijn in deze versie.<br><br>%1<br><br> Van het huidige configuratiebestand is al een back-up gemaakt op <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Stoppen - + Continue Doorgaan - + Error accessing the configuration file Fout bij benaderen configuratiebestand @@ -898,12 +972,12 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken.Fout bij het benaderen van het configuratiebestand op %1. Zorg ervoor dat het bestand door je gebruiker kan worden benaderd. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Afsluiten %1 @@ -949,56 +1023,216 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken.Bestand %1 heeft een ongeldige wijzigingstijd. Niet uploaden naar de server. - + File Removed (start upload) %1 Bestand verwijderd (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. Lokaal bestand gewijzigd gedurende synchronisatie. Wordt opnieuw meegenomen. - - + + Local file changed during sync. Lokaal bestand gewijzigd tijdens synchronisatie. - + Network error: %1 Netwerkfout: %1 - + Error updating metadata: %1 Fout bij bijwerken metadata: %1 - + The file %1 is currently in use Bestand %1 is momenteel in gebruik - + The local file was removed during sync. Het lokale bestand werd verwijderd tijdens synchronisatie. - + Restoration failed: %1 Herstellen mislukt: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Fout bij schrijven van metadata naar de database @@ -1016,12 +1250,12 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken.Voer je end-to-end versleutelingswachtwoord in: <br><br>Gebruiker: %2<br>Account: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Invoeren E2E wachtwoord @@ -1197,8 +1431,8 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Serverfout: PROPFIND-antwoord heeft geen XML-opmaak! @@ -1206,27 +1440,27 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Fout bij het openen van map %1 - + Directory not accessible on client, permission denied Map niet toegankelijk op client, toegang geweigerd - + Directory not found: %1 Map niet gevonden: %1 - + Filename encoding is not valid Bestandsnaamcodering is niet geldig - + Error while reading directory %1 Fout tijdens lezen van map %1 @@ -1234,83 +1468,83 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - + Kon geen bestand vinden om lokaal te bewerken. Zorg ervoor dat het pad juist is en dat het lokaal gesynchroniseerd is. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1318,7 +1552,7 @@ Dit zal alle synchronisaties, die op dit moment bezig zijn, afbreken. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Kan de metadata voor versleuteling niet genereren, de map wordt ontgrendeld. @@ -1448,145 +1682,145 @@ Dit kan een probleem zijn met je OpenSSL-bibliotheken. OCC::Folder - + Local folder %1 does not exist. Lokale map %1 bestaat niet. - + %1 should be a folder but is not. %1 zou een map moeten zijn, maar is dat niet. - + %1 is not readable. %1 is niet leesbaar. - + %1 and %n other file(s) have been removed. %1 en %n ander bestand(en) zijn verwijderd.%1 en %n andere bestand(en) zijn verwijderd. - + %1 has been removed. %1 names a file. %1 is verwijderd. - + %1 and %n other file(s) have been added. %1 en %n andere bestand zijn toegevoegd.%1 en %n andere bestanden zijn toegevoegd. - + %1 has been added. %1 names a file. %1 is toegevoegd. - + %1 and %n other file(s) have been updated. %1 en %n ander bestand(en) zijn bijgewerkt.%1 en %n andere bestand(en) zijn bijgewerkt. - + %1 has been updated. %1 names a file. %1 is bijgewerkt. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 is hernoemd naar %2 en %n ander bestand(en) is hernoemd.%1 is hernoemd naar %2 en %n andere bestand(en) zijn hernoemd. - + %1 has been renamed to %2. %1 and %2 name files. %1 is hernoemd naar %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 is verplaatst naar %2 en %n ander bestand(en) is verplaatst.%1 is verplaatst naar %2 en %n andere bestand(en) zijn verplaatst. - + %1 has been moved to %2. %1 is verplaatst naar %2. - + %1 has and %n other file(s) have sync conflicts. %1 en %n ander bestand(en) hebben een sync conflict.%1 en %n andere bestand(en) hebben synchronisatie-conflicten. - + %1 has a sync conflict. Please check the conflict file! %1 heeft een synchronisatie-conflict. Controleer het conflictbestand! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 en %n ander bestand(en) konden niet worden gesynchroniseerd wegens fouten. Bekijk het log voor details.%1 en %n andere bestand(en) konden niet worden gesynchroniseerd wegens fouten. Bekijk het log voor details. - + %1 could not be synced due to an error. See the log for details. %1 kon niet worden gesynchroniseerd door een fout. Bekijk het log voor details. - + %1 and %n other file(s) are currently locked. %1 en %n ander bestand zijn momenteel op slot.%1 en %n ander(e) bestand(en) zijn momenteel op slot. - + %1 is currently locked. %1 is momenteel op slot. - + Sync Activity Synchronisatie-activiteit - + Could not read system exclude file Kon het systeem-uitsluitingsbestand niet lezen - + A new folder larger than %1 MB has been added: %2. Er is een nieuwe map groter dan %1 MB toegevoegd: %2. - + A folder from an external storage has been added. Er is een map op externe opslag toegevoegd. - + Please go in the settings to select it if you wish to download it. Ga naar de instellingen om het te selecteren als u deze wilt downloaden. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Map %1 is gecreëerd, maar eerder uitgesloten van synchronisatie. Bestanden erin worden niet gesynchroniseerd. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Bestand %1 is gecreëerd, maar eerder uitgesloten van synchronisatie. Het wordt niet gesynchroniseerd. - + 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). @@ -1599,7 +1833,7 @@ Dit betekent dat de synchronisatieclient misschien niet meteen lokale wijziginge %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1610,7 +1844,7 @@ Als je de bestanden wilt behouden, worden ze opnieuw gesynchroniseerd met de ser Als je de bestanden wilt verwijderen, worden ze niet beschikbaar, tenzij je de eigenaar bent. - + 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. @@ -1618,17 +1852,17 @@ If this was an accident and you decide to keep your files, they will be re-synce Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw gesynchroniseerd met de server. - + Remove All Files? Alle bestanden verwijderen? - + Remove all files Alle bestanden verwijderen - + Keep files Bestanden bewaren @@ -1664,22 +1898,22 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge OCC::FolderMan - + Could not reset folder state Kan de beginstaat van de map niet terugzetten - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Een oud synchronisatieverslag "%1" is gevonden maar kan niet worden verwijderd. Zorg ervoor dat geen applicatie dit bestand gebruikt. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1689,27 +1923,27 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge Ongedefiniëerde staat - + Undefined state. - + Waiting to start syncing. In afwachting van synchronisatie. - + Preparing for sync. Synchronisatie wordt voorbereid - + Sync is running. Bezig met synchroniseren. - + Sync finished with unresolved conflicts. Synchronisatie beëindigd met niet opgeloste conflicten. @@ -1729,62 +1963,62 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge Afgebroken door gebruiker. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Synchronisatie gepauzeerd. - + %1 (Sync is paused) %1 (Synchronisatie onderbroken) - + No valid folder selected! Geen geldige map geselecteerd! - + The selected path does not exist! Het geselecteerde pad bestaat niet! - + The selected path is not a folder! Het geselecteerde pad is geen map! - + You have no permission to write to the selected folder! U heeft geen machtiging om te schrijven naar de geselecteerde map! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Lokale map %1 bevat al een map die wordt gebruikt voor een mapsync verbinding. Kies een andere! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Lokale map %1 zit al in een map die wordt gebruikt voor een mapsync verbinding. Kies een andere! - + There is already a sync from the server to this local folder. Please pick another local folder! Er wordt vanaf de server al naar deze lokale map gesynchroniseerd. Kies een andere lokale map! @@ -1797,7 +2031,7 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge Toevoegen mapsynchronisatie verbinding - + File Bestand @@ -1805,153 +2039,157 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge OCC::FolderStatusModel - + You need to be connected to add a folder U moet verbonden zijn om een map toe te voegen - + Click this button to add a folder to synchronize. Klik op deze knop om een te synchroniseren map toe te voegen. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Fout bij ophalen mappenlijst van de server. - + Fetching folder list from server … Mappenlijst ophalen van de server ... - + There are unresolved conflicts. Click for details. Er zijn nog niet-opgehelderde conflicten. Klik voor details. - + Virtual file support is enabled. Virtuele bestandsondersteuning is ingeschakeld. - + Signed out Afgemeld - + Synchronizing VirtualFiles with local folder Synchroniseren VirtualFiles met lokale map - + Synchronizing with local folder Synchroniseren met lokale map - + Checking for changes in remote "%1" Controleren op wijzigingen in externe "%1" - + Checking for changes in local "%1" Controleren op wijzigingen in lokale "%1" - + Reconciling changes Wijzigingen in overeenstemming brengen - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synchroniseren %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) download %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) upload %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 van %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 over, %1 van %2, bestand %3 van %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 van %2, bestand %3 van %4 - + file %1 of %2 bestand %1 van %2 - + Waiting … Wachten ... - + Waiting for %n other folder(s) … Wacht op %n andere map ...Wacht op %n andere mappen ... - + Preparing to sync … Voorbereiden synchronisatie ... @@ -2182,13 +2420,13 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge - + stable stabiel - + beta beta @@ -2240,32 +2478,32 @@ Als dit een ongelukje was en je de bestanden wilt behouden, worden ze opnieuw ge - + Create Debug Archive Debugarchief maken - + Server notifications that require attention. Servermeldingen die aandacht nodig hebben. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. Je kunt autostart niet uitschakelen omdat systeem-brede autostart is ingeschakeld. - + Change update channel? Wijzigen bijwerkkanaal? - + 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. 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. @@ -2274,27 +2512,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Merk op dat dit alleen selecteert van welke pool upgrades worden overgenomen en dat er geen downgrades zijn: teruggaan van het betakanaal naar het stabiele kanaal kan meestal niet onmiddellijk worden gedaan en dat betekent wachten op een stabiele versie die nieuwer is dan de momenteel geïnstalleerde betaversie. - + Change update channel Wijzigen bijwerkkanaal - + Cancel Annuleren - + Zip Archives Zip Archieven - + Debug Archive Created Debugarchief Aangemaakt - + Debug archive is created at %1 Debugarchief is gemaakt op %1 @@ -2302,22 +2540,22 @@ Merk op dat dit alleen selecteert van welke pool upgrades worden overgenomen en OCC::GetOrCreatePublicLinkShare - + Password for share required Wachtwoord voor deellink vereist - + Please enter a password for your link share: Voer het wachtwoord in voor je deellink: - + Sharing error Fout bij delen - + Could not retrieve or create the public link share. Error: %1 @@ -2559,6 +2797,11 @@ Onderdelen die gewist mogen worden, worden verwijderd als ze verhinderen dat een Close Sluiten + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2894,60 +3137,60 @@ Merk op dat het gebruik van logging-opdrachtregel opties deze instelling zal ove - + Use &virtual files instead of downloading content immediately %1 Gebruik &virtuele bestanden in plaats van direct downloaden content%1 - + (experimental) (experimenteel) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Virtuele bestanden worden niet ondersteund voor Windows-partitie-hoofdmappen als lokale map. Kies een geldige submap onder de stationsletter. - + %1 folder "%2" is synced to local folder "%3" %1 map "%2" is gesynchroniseerd naar de lokale map "%3" - + Sync the folder "%1" Synchroniseer de map "%1" - + Warning: The local folder is not empty. Pick a resolution! Waarschuwing: De lokale map is niet leeg. Maak een keuze! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 vrije ruimte - + Virtual files are not available for the selected folder Virtuele bestanden zijn niet beschikbaar voor de geselecteerde map - + Local Sync Folder Lokale synchronisatiemap - - + + (%1) (%1) - + There isn't enough free space in the local folder! Er is niet genoeg ruimte beschikbaar in de lokale map! @@ -3019,7 +3262,8 @@ Merk op dat het gebruik van logging-opdrachtregel opties deze instelling zal ove OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Onmogelijk om wijzigingstijd te krijgen voor bestand in conflict %1) @@ -3051,144 +3295,144 @@ Merk op dat het gebruik van logging-opdrachtregel opties deze instelling zal ove OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Succesvol verbonden met %1: %2 versie %3 (%4)</font><br/><br/> - + Invalid URL Ongeldige URL - + Failed to connect to %1 at %2:<br/>%3 Kon geen verbinding maken met %1 op %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Time-out bij verbinden met %1 op %2. - + Trying to connect to %1 at %2 … Probeer te verbinden met %1 om %2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. De geauthentiseerde aanvraag voor de server werd omgeleid naar "%1". De URL is onjuist, de server is verkeerd geconfigureerd. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Toegang door server verboden. Om te verifiëren dat je toegang mag hebben, <a href="%1">klik hier</a> om met je browser toegang tot de service te krijgen. - + There was an invalid response to an authenticated WebDAV request Er is een ongeldig antwoord ontvangen op een geauthenticeerde WebDAV opvraging - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Lokale synchronisatie map %1 bestaat al, deze wordt ingesteld voor synchronisatie.<br/><br/> - + Creating local sync folder %1 … Creëren lokale synchronisatie map %1 ... - + OK OK - + failed. mislukt. - + Could not create local folder %1 Kan lokale map %1 niet aanmaken - + No remote folder specified! Geen externe map opgegeven! - + Error: %1 Fout: %1 - + creating folder on Nextcloud: %1 aanmaken map op Nextcloud: %1 - + Remote folder %1 created successfully. Externe map %1 succesvol gecreëerd. - + The remote folder %1 already exists. Connecting it for syncing. De externe map %1 bestaat al. Verbinden voor synchroniseren. - - + + The folder creation resulted in HTTP error code %1 Het aanmaken van de map resulteerde in HTTP foutcode %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Het aanmaken van de externe map is mislukt, waarschijnlijk omdat je inloggegevens fout waren.<br/>Ga terug en controleer je inloggegevens.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Het aanmaken van de externe map is mislukt, waarschijnlijk omdat je inloggegevens fout waren.</font><br/>ga terug en controleer je inloggevens.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Aanmaken van externe map %1 mislukt met fout <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Er is een synchronisatie verbinding van %1 naar externe map %2 opgezet. - + Successfully connected to %1! Succesvol verbonden met %1! - + Connection to %1 could not be established. Please check again. Er kan geen verbinding worden gemaakt met %1. Probeer het nog eens. - + Folder rename failed Hernoemen map mislukt - + Cannot 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. Kan de map niet verwijderen en back-uppen, 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Lokale synch map %1 is succesvol aangemaakt!</b></font> @@ -3211,12 +3455,12 @@ Merk op dat het gebruik van logging-opdrachtregel opties deze instelling zal ove Annuleren - + Enable experimental feature? Inschakelen experimentele functies? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3233,12 +3477,12 @@ Als je naar deze modus overschakelt, wordt elke momenteel lopende synchronisatie Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen we je om eventuele problemen te melden. - + Enable experimental placeholder mode Inschakelen experimentele aanduider modus - + Stay safe Blijf veilig @@ -3267,162 +3511,167 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Symbolische links worden niet ondersteund bij het synchroniseren. - + File is listed on the ignore list. Het bestand is opgenomen op de negeerlijst. - + File names ending with a period are not supported on this file system. Bestandsnamen die eindigen met een punt worden niet ondersteund door het bestandssysteem. - + File names containing the character "%1" are not supported on this file system. Bestandsnamen met een "%1" symbool worden niet ondersteund door het bestandssysteem. - + File name contains at least one invalid character De bestandsnaam bevat ten minste één ongeldig teken - + The file name is a reserved name on this file system. De bestandsnaam is een gereserveerde naam op dit bestandssysteem. - + Filename contains trailing spaces. De bestandsnaam bevat spaties achteraan. - + Filename contains leading spaces. De bestandsnaam bevat spaties vooraan. - + Filename contains leading and trailing spaces. De bestandsnaam bevat spaties vooraan en achteraan. - + Filename is too long. De bestandsnaam is te lang. - + File/Folder is ignored because it's hidden. Bestand/Map is genegeerd omdat het verborgen is. - + Stat failed. Stat mislukt. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Bestandsconflict: serverversie is gedownload, de lokale kopie is hernoemd en niet geüpload - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. De bestandsnaam kan op je bestandssysteem niet worden gecodeerd. - + The filename is blacklisted on the server. De bestandsnaam staat op de negeerlijst van de server. - + File has extension reserved for virtual files. Bestand heeft een extensie gereserveerd voor virtuele bestanden. - + size omvang - + permission machtiging - + file id bestand id - + Server reported no %1 Server rapporteerde nr %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! Conflict bij het uploaden van een map. Het wordt opgeruimd! - + Conflict when uploading a file. It's going to get removed! Conflict bij het uploaden van een bestand. Het wordt verwijderd! - + Ignored because of the "choose what to sync" blacklist Genegeerd vanwege de "wat synchroniseren" negeerlijst - + Not allowed because you don't have permission to add subfolders to that folder Niet toegestaan, omdat je geen machtiging hebt om submappen aan die map toe te voegen - + Not allowed because you don't have permission to add files in that folder Niet toegestaan omdat je geen machtiging hebt om bestanden in die map toe te voegen - + Not allowed to upload this file because it is read-only on the server, restoring Niet toegestaan om dit bestand te uploaden, omdat het alleen-lezen is op de server, herstellen - + Moved to invalid target, restoring Verplaatst naar ongeldig doel, herstellen - + Not allowed to remove, restoring Niet toegestaan om te verwijderen, herstellen - + Error while reading the database Fout bij lezen database - + Server replied with an error while reading directory "%1" : %2 Server gaf een foutmelding bij lezen directory "%1'": %2 @@ -3430,22 +3679,22 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 Fout bij bijwerken metadata: %1 - + File is currently in use Bestand is al in gebruik @@ -3458,19 +3707,19 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen - + File %1 cannot be downloaded because encryption information is missing. Bestand %1 kan niet worden gedownload, omdat crypto informatie ontbreekt. - - + + File has changed since discovery Het bestand is gewijzigd sinds het is gevonden - + Could not delete file record %1 from local DB @@ -3481,32 +3730,32 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Bestand %1 kan niet worden gedownload, omdat de naam conflicteert met een lokaal bestand - + File %1 can not be downloaded because of a local file name clash! Bestand %1 kan niet worden gedownload, omdat de naam conflicteert met een lokaal bestand - + The download would reduce free local disk space below the limit De download zou de vrije lokale schijfruimte beperken tot onder de limiet - + Free space on disk is less than %1 Vrije schijfruimte is minder dan %1 - + File was deleted from server Bestand was verwijderd van de server - + The file could not be downloaded completely. Het bestand kon niet volledig worden gedownload. - + The downloaded file is empty, but the server said it should have been %1. Het gedownloade bestand is leeg, maar de server meldde dat het %1 zou moeten zijn. @@ -3516,18 +3765,23 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Bestand %1 kan niet worden opgeslagen wegens een lokaal bestandsnaam conflict! - - + + File %1 has invalid modified time reported by server. Do not save it. Bestand %1 heeft een ongeldige wijzigingstijd gerapporteerd door de server. Bewaar het niet. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Fout bij bijwerken metadata: %1 - + The file %1 is currently in use Bestand %1 is al in gebruik @@ -3548,7 +3802,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 kon bestand file %1 niet verwijderen, fout: %2 @@ -3559,16 +3813,21 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Kon map %1 niet maken - + Error updating metadata: %1 Fout bij bijwerken metadata: %1 - + The file %1 is currently in use Bestand %1 is al in gebruik @@ -3576,7 +3835,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Bestand %1 kon niet worden verwijderd, omdat de naam conflicteert met een lokaal bestand @@ -3589,46 +3848,51 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Bestand %1 kan niet worden hernoemd naar %2, omdat de naam conflicteert met een lokaal bestand - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Fout bij instellen pin status - - + + Error updating metadata: %1 Fout bij bijwerken metadata: %1 - + The file %1 is currently in use Bestand %1 is al in gebruik - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Kon bestand niet hernoemen @@ -3649,7 +3913,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Foutieve HTTP code ontvangen van de server. Verwacht was 204, maar ontvangen "%1 %2". @@ -3662,12 +3926,12 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Foutieve HTTP code ontvangen van de server. Verwacht was 201, maar ontvangen "%1 %2". - + Error writing metadata to the database: %1 Fout bij schrijven van metadata naar de database: %1 - + The file %1 is currently in use Bestand %1 is al in gebruik @@ -3675,42 +3939,42 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Kon niet %1 hernoemen naar %2, fout: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Foutieve HTTP code ontvangen van de server. Verwacht werd 201, maar ontvangen "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Fout bij bijwerken metadata: %1 - + The file %1 is currently in use Bestand %1 is al in gebruik - + Error setting pin state Fout bij instellen pin status - + Error writing metadata to the database Fout bij schrijven van Metadata naar de database @@ -3900,7 +4164,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::ServerNotificationHandler - + Reply Antwoord @@ -3918,23 +4182,23 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Instellingen - + %1 Settings This name refers to the application name e.g Nextcloud %1 Instellingen - + General Algemeen - + Network Netwerk - + Account Account @@ -3942,17 +4206,22 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4022,13 +4291,13 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Password protect - Wachtwoord beveiligd + Beveiligen met wachtwoord OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4037,132 +4306,169 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Contextmenu delen - + Select new location … Selecteer nieuwe locatie ... - + I shared something with you Ik deelde iets met u - - + + Share options Deelopties - - + + Activity Activiteit - + Copy private link to clipboard Kopiëren privé-link naar klembord - + Send private link by email … Verstuur privélink per e-mail --- + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Verder delen van dit bestand is niet toegestaan - + Resharing this folder is not allowed Verder delen van deze map is niet toegestaan - - + + Copy public link Kopieer openbare link - + Copy internal link Kopieer interne link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Bewerken - + Open in browser Openen in browser - + Resolve conflict … Oplossen conflict ... - + Move and rename … Verplaatsen en hernoemen ... - + Move, rename and upload … Verplaatsen, hernoemen en uploaden ... - + Delete local changes Verwijder lokale aanpassingen - + Move and upload … Verplaatsen en uploaden ... - + Delete Verwijderen @@ -4380,63 +4686,63 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (overgeslagen wegens een eerdere fout, probeer opnieuw over %2) - + Could not update file: %1 Kon bestand niet bijwerken: %1 - + Could not update virtual file metadata: %1 Kon virtuele bestand metadata niet bijwerken: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Bestandsconflict - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Slechts %1 beschikbaar, maar heeft minimaal %2 nodig om te starten - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Kon de lokale sync-database niet openen of aanmaken. Zorg ervoor dat je schrijf-toegang hebt in de sync-map - + Using virtual files with suffix, but suffix is not set gebruik maken van virtuele bestanden met achtervoegsel, maar achtervoegsel niet ingesteld - + Unable to read the blacklist from the local database Kan de blacklist niet lezen uit de lokale database - + Unable to read from the sync journal. Niet mogelijk om te lezen uit het synchronisatie verslag. - + Cannot open the sync journal Kan het sync transactielog niet openen @@ -4446,12 +4752,12 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Synchronisatie wordt spoedig hervat. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Schijfruimte laag: Downloads die de vrije ruimte tot onder %1 zouden reduceren, zijn overgeslagen. - + There is insufficient space available on the server for some uploads. Onvoldoende schijfruimte op de server voor sommige uploads. @@ -4520,59 +4826,59 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::Systray - + Download Download - + Add account Account toevoegen - + Open main dialog Open het hoofdvenster - - + + Pause sync Pauzeer sync - - + + Resume sync Vervolg sync - + Settings Instellingen - + Help Help - + Exit %1 Verlaat %1 - + Pause sync for all Pauzeer sync voor iedereen - + Resume sync for all Vervolg sync voor iedereen - + %1: %2 %1: %2 @@ -4580,24 +4886,24 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Desktop Client</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versie %1. Voor meer informatie klik <a href='%2'>hier</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Gebruik makend van virtuele bestanden plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Deze release is geleverd door %1</p> @@ -4605,22 +4911,22 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Fout bij het laden van providers. - + Failed to fetch search providers for '%1'. Error: %2 Fout bij het zoeken van providers voor '%1'. Error: %2 - + Search has failed for '%2'. Fout bij het zoeken naar '%2'. - + Search has failed for '%1'. Error: %2 Fout bij het zoeken naar '%1'. Error: %2 @@ -4628,30 +4934,36 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::User - + Retry all uploads Probeer alle uploads opnieuw + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Bevestig verwijderen account - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Wilt je echt de verbinding met het account <i>%1</i> verbreken?</p><p><b>Let op:</b> Hierdoor verwijder je <b>geen</b> bestanden.</p> - + Remove connection Verwijderen verbinding - + Cancel Annuleren @@ -4789,8 +5101,8 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4798,8 +5110,8 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4897,123 +5209,123 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen OCC::ownCloudGui - + Unsupported Server Version Niet-ondersteunde server versie - + 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. De server van account %1 gebruikt een niet ondersteunde versie %2. Het gebruik van deze clientsoftware met niet-ondersteunde server versies is niet getest en mogelijk gevaarlijk. Verdergaan is op eigen risico. - + Disconnected Niet verbonden - + Disconnected from some accounts Niet verbonden met sommige accounts - + Disconnected from %1 Losgekoppeld van %1 - + Disconnected from accounts: Losgekoppeld van account: - + Account %1: %2 Account %1: %2 - + Please sign in Log alstublieft in - + Signed out Afgemeld - + Account synchronization is disabled Account synchronisatie is uitgeschakeld - - + + Synchronization is paused Synchronisatie is gepauzeerd - + Folder %1: %2 Map %1: %2 - + Unresolved conflicts Niet opgeloste conflicten - + Up to date Bijgewerkt - + Error during synchronization Fout bij synchronisatie - + There are no sync folders configured. Er zijn geen synchronisatie-mappen geconfigureerd. - + No sync folders configured Geen syncmappen geconfigureerd - + Checking for changes in remote "%1" Controleren op wijzigingen in externe "%1" - + Checking for changes in local "%1" Controleren op wijzigingen in lokale "%1" - + Syncing %1 of %2 (%3 left) Sync %1 van %2 (%3 over) - + Syncing %1 of %2 Synchroniseren %1 van %2 - + Syncing %1 (%2 left) Sync %1 (%2 over) - + Syncing %1 Synchroniseren %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5165,27 +5477,27 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Nieuwe map - + You renamed %1 Je hernoemde %1 - + You deleted %1 Je verwijderde %1 - + You created %1 Je creëerde %1 - + You changed %1 Je wijzigde %1 - + Synced %1 Gesynchroniseerd %1 @@ -5251,30 +5563,106 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Markeren als gelezen + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + Beveiligen met wachtwoord + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5290,7 +5678,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen SyncJournalDb - + Failed to connect database. Kon niet verbinden met database. @@ -5348,6 +5736,22 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Laad meer resultaten + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5411,67 +5815,67 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen UserStatusSelector - + Online status Online status - + Online Online - + Away Afwezig - + Do not disturb Niet storen - + Mute all notifications - + Invisible Onzichtbaar - + Appear offline - + Status message Statusbericht - + What is your status? Wat is je status? - + Clear status message after Statusbericht wissen na - + Cancel - + Clear status message Statusbericht wissen - + Set status message Statusbericht instellen @@ -5555,24 +5959,24 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Window - + Nextcloud desktop main dialog Nextcloud desktop hoofddialoog - + Current account Huidige account - - + + Resume sync for all Hervat de synchronisatie voor iedereen - - + + Pause sync for all Synchronisatie voor iedereen onderbreken @@ -5582,22 +5986,22 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Gebruikersstatus instellen - + Add account Account toevoegen - + Add new account Nieuw account toevoegen - + Settings Instellingen - + Exit Afsluiten @@ -5606,11 +6010,6 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Current user avatar Huidige gebruikersavatar - - - Current account avatar - - Current user status is online @@ -5622,70 +6021,75 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Huidige gebruikersstatus is niet storen - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + %1 - Bestandsactiviteit + + + Account switcher and settings menu Accountswitcher en instellingenmenu - + Open local folder of current account Open lokale map van huidig account - + Connected Verbonden - + Disconnected Niet verbonden - + Open Nextcloud Talk in browser Open Nextcloud Talk in browser - + More apps Meer apps - + Open %1 in browser Open %1 in browser - + Unified search results list Samengevoegde zoekresultaten lijst - - - %1 - File activity - %1 - Bestandsactiviteit - main.cpp - + System Tray not available Systeemvak niet beschikbaar - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 heeft een werkend systeemvak nodig. Als je XFCE draait volg je <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">deze instructies</a>. Installeer anders een systeemvak applicatie zoals "trayer" en probeer het opnieuw. @@ -5693,7 +6097,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Gebouwd vanaf Git revisie <a href="%1">%2</a> op %3, %4 gebruik makend van Qt %5, %6</small></p> @@ -5727,72 +6131,77 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Verwijderd - + Moved to %1 Verplaatst naar %1 - + Ignored Genegeerd - + Filesystem access error Toegangsfout van het bestandssysteem - + Error Fout - + Updated local metadata Lokale metadata geüploaded - + Unknown Onbekend - + downloading downloaden - + uploading uploaden - + deleting verwijderen - + moving verplaatsen - + ignoring negerend - + error fout - + updating local metadata Bijwerken lokale metadata @@ -6044,7 +6453,7 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen Password protect - Wachtwoord beveiligen + Beveiligen met wachtwoord diff --git a/translations/client_oc.ts b/translations/client_oc.ts index 48bba0d27..41a289865 100644 --- a/translations/client_oc.ts +++ b/translations/client_oc.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Dobrir %1 localement - + In %1 Dins %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostrar mai d’accions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Ignorar + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista d’activitats @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Lo desplaçament a l’escobilhièr es pas implementat sus aquesta plataforma - + Error removing "%1": %2 Error de supression « %1 » : %2 - + Could not remove folder "%1" Supression impossibla del dossièr « %1 » @@ -321,7 +331,7 @@ Marrit còdi HTTP tornat pel servidor. Esperat 204, mas recebut « %1 %2 ». - + "%1 Failed to unlock encrypted folder %2". « %1 Fracàs del desverrolhatge del dossièr chifrat %2 » @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Anullar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ Chifrar pas lo dossièr - + Do not encrypt folder - + Encrypt folder Chifrar lo dossièr - + No account configured. Cap de compte pas configurat. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Activar lo chiframent - + + End-to-end encryption has been enabled for this account + + + + Warning Atencion - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed Fracàs del chiframent - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Dobrir lo dossièr - + Encrypt Chifrar - - + + Edit Ignored Files Modificar los fichièrs ignorats - - + + Create new folder Crear un dossièr novèl - - + + Availability Disponibilitat - + Choose what to sync Causir qué sincronizar - + Force sync now Forçar la sincronizacion ara - + Restart sync Tornar sincronizar - + Resume sync Reprendre la sincro. - + Pause sync Suspendre la sincro. - + Remove folder sync connection Suprimir la sincro. del dossièr - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) (experimental) - + Folder creation failed Creacion del dossièr pas reüssida - + <p>Could not create local folder <i>%1</i>.</p> <p>Creacion impossibla del dossièr local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove Folder Sync Connection - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Execucion de la sincro. - + The syncing operation is running.<br/>Do you want to terminate it? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) sus %2 utilizat. D’unes dossièrs, coma los dossièrs montats sul ret o partejats, pòdon possedir diferentas limitas. - + %1 of %2 in use %1 sus %2 en utilizacion - + Currently there is no storage usage information available. Per ara i a pas cap d’informacion sus l’utilizacion de l’espaci d’emmaganizatge. - + %1 in use %1 es utilizat - + %1 as %2 %1 coma %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Connectat a %1. - + Server %1 is temporarily unavailable. Lo servidor %1 es temporàriament indisponible. - + Server %1 is currently in maintenance mode. Lo servidor %1 es actualament en mòde mantenença. - + Signed out from %1. Desconnexion de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. - + Connecting to %1 … Connexion a %1… - + No connection to %1 at %2. Cap de connexion a %1 a %2. - + Server configuration error: %1 at %2. Error de configuracion servidor : %1 a %2. - + No %1 connection configured. Cap de connexion %1 configurat. - + There are folders that were not synchronized because they are too big: - + There are folders that were not synchronized because they are external storages: - + There are folders that were not synchronized because they are too big or external storages: - + Confirm Account Removal Confirmatz la supression del compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Suprimir la connexion - - + This account supports end-to-end encryption Aqueste compte es compatible amb lo chiframent del cap a la fin - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Los fichièrs de la lista d’ignorar e los ligams simbolics son pas sincronizats. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Daissar - + Continue Contunhar - + Error accessing the configuration file Error d’accès al fichièr de configuracion @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Quitar %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Error en escrivent las metadonadas dins la basa de donadas @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Picatz la frasa secreta E2E @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Error en dobrissent lo repertòri %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 Repertòri pas trobat : %1 - + Filename encoding is not valid - + Error while reading directory %1 Error en legissent lo repertòri %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,143 +1675,143 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Lo dossièr lical %1 existís pas. - + %1 should be a folder but is not. %1 deuriá èsser un dossièr mas n’es pas un. - + %1 is not readable. %1 es pas ligible. - + %1 and %n other file(s) have been removed. %1 e %n autre fichièr son estats suprimits.%1 e %n autres fichièrs son estats suprimits. - + %1 has been removed. %1 names a file. %1 es estat suprimit. - + %1 and %n other file(s) have been added. %1 e %n autre fichièr son estats aponduts.%1 e %n autres fichièrs son estats aponduts. - + %1 has been added. %1 names a file. %s es estat apondut - + %1 and %n other file(s) have been updated. - + %1 has been updated. %1 names a file. %1 es estat actualizat. - + %1 has been renamed to %2 and %n other file(s) have been renamed. - + %1 has been renamed to %2. %1 and %2 name files. %1 es estat renomenat en %2. - + %1 has been moved to %2 and %n other file(s) have been moved. - + %1 has been moved to %2. %1 es estat desplaçat a %2. - + %1 has and %n other file(s) have sync conflicts. - + %1 has a sync conflict. Please check the conflict file! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. Sincronizacion impossibla de %1 e de %n autre(s) fichièr(s) a causa d’una error. Vejatz lo jornal per de detalhs.Sincronizacion impossibla de %1 e de %n autre(s) fichièr(s) a causa d’una error. Vejatz lo jornal per de detalhs. - + %1 could not be synced due to an error. See the log for details. Sincronizacion impossibla de %1 a causa d’una error. Vejatz lo jornal per de detalhs. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. %1 es actualament verrolhat. - + Sync Activity Activitat de la sincro. - + Could not read system exclude file - + A new folder larger than %1 MB has been added: %2. - + A folder from an external storage has been added. - + Please go in the settings to select it if you wish to download it. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1586,7 +1820,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1594,24 +1828,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Suprimit totes los fichièrs ? - + Remove all files Suprimir totes los fichièrs - + Keep files Gardar los fichièrs @@ -1647,22 +1881,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (salvagarda) - + (backup %1) (salvagarda %1) @@ -1672,27 +1906,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estat desconegut. - + Undefined state. - + Waiting to start syncing. En espèra del començament de la sincronizacion. - + Preparing for sync. Preparacion per sincronizar. - + Sync is running. Sincronizacion en cors. - + Sync finished with unresolved conflicts. @@ -1712,62 +1946,62 @@ If this was an accident and you decide to keep your files, they will be re-synce L’utilizaire a abandonat. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. La sincronizacion es suspenduda. - + %1 (Sync is paused) %1 (Sincro. en pausa) - + No valid folder selected! - + The selected path does not exist! - + The selected path is not a folder! - + You have no permission to write to the selected folder! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - + There is already a sync from the server to this local folder. Please pick another local folder! @@ -1780,7 +2014,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Apondre connexion de sincro. dossièr - + File Fichièr @@ -1788,152 +2022,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Devètz èsser connectat per apondre un dossièr - + Click this button to add a folder to synchronize. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. I a de conflictes pas resolguts. Clicatz pels detalhs. - + Virtual file support is enabled. - + Signed out Desconnectat - + Synchronizing VirtualFiles with local folder Sincronizacion VirtualFiles amb lo dossièr local - + Synchronizing with local folder Sincronizacion amb lo dossièr local - + Checking for changes in remote "%1" Verificacion de las modificacions distantas dins « %1 » - + Checking for changes in local "%1" Verificacion de las modificacions localas dins « %1 » - + Reconciling changes - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizacion %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) telecargament %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) mandadís %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 sus %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 demòran %5, %1 de %2, %3 fichièrs de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 sus %2, fichièr %3 sus %4 - + file %1 of %2 fichièr %1 sus %2 - + Waiting … En espèra… - + Waiting for %n other folder(s) … - + Preparing to sync … Preparacion de la sincro.… @@ -2164,13 +2402,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable estable - + beta beta @@ -2222,59 +2460,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Crear un archiu de debugatge - + Server notifications that require attention. Las notificacions del servidor que demanda vòstra atencion. - + Show call notification dialogs. Mostrar las notificacions de sonadas - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel Anullar - + Zip Archives Archius ZIP - + Debug Archive Created - + Debug archive is created at %1 @@ -2282,22 +2520,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Protegir amb senhal - + Please enter a password for your link share: Mercés de picar un senhal pel ligam de partatge : - + Sharing error Error de partatge - + Could not retrieve or create the public link share. Error: %1 @@ -2531,6 +2769,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Tampar + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2863,60 +3106,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 espaci liure - + Virtual files are not available for the selected folder - + Local Sync Folder - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2988,7 +3231,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3020,144 +3264,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> - + Invalid URL URL invalida - + Failed to connect to %1 at %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> - + Creating local sync folder %1 … - + OK D’acòrdi - + failed. - + Could not create local folder %1 Impossible de crear lo dossièr local « %s » - + No remote folder specified! - + Error: %1 Error : %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. - + The remote folder %1 already exists. Connecting it for syncing. - - + + The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! - + Connection to %1 could not be established. Please check again. - + Folder rename failed - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> @@ -3180,12 +3424,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3196,12 +3440,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe Demoratz en seguretat @@ -3230,162 +3474,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size talha - + permission permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3393,22 +3642,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3421,19 +3670,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery - + Could not delete file record %1 from local DB @@ -3444,32 +3693,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 - + File was deleted from server - + The file could not be downloaded completely. - + The downloaded file is empty, but the server said it should have been %1. @@ -3479,18 +3728,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3511,7 +3765,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 @@ -3522,16 +3776,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3539,7 +3798,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3552,46 +3811,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3612,7 +3876,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Marrit còdi HTTP tornat pel servidor. Esperat 204, mas recebut « %1 %2 ». @@ -3625,12 +3889,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3638,42 +3902,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database @@ -3863,7 +4127,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3881,23 +4145,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Paramètres - + %1 Settings This name refers to the application name e.g Nextcloud Paramètres %1 - + General General - + Network Ret - + Account Compte @@ -3905,17 +4169,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3991,7 +4260,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4000,132 +4269,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Menú contèxtual del partatge - + Select new location … - + I shared something with you Ai partejat quicòm amb tu - - + + Share options Opcions de partatge - - + + Activity Activitat - + Copy private link to clipboard Copiar lo ligam privat al quichapapièr - + Send private link by email … Enviar un ligam privat per mail … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Tornar partejar aqueste - + Resharing this folder is not allowed - - + + Copy public link Copiar lo ligam public - + Copy internal link Copiar lo ligam intèrn - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Modificar - + Open in browser Dobrir dins lo navegador - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Suprimir @@ -4343,63 +4649,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal @@ -4409,12 +4715,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4483,59 +4789,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Apondre un compte - + Open main dialog Dobrir fenèstra principala - - + + Pause sync Suspendre la sincro. - - + + Resume sync Reprendre la sincro. - + Settings Paramètres - + Help Ajuda - + Exit %1 Quitar %1 - + Pause sync for all Suspendre la sincro. per totes - + Resume sync for all Reprendre la sincro. per totes - + %1: %2 %1: %2 @@ -4543,24 +4849,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Client de burèu %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Version %1. Per mai d’informacion clicatz <a href='%2'>aquí</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Usatge extension pels fichièrs virtuals : %1</small></p> - + <p>This release was supplied by %1</p> <p>Aquesta version es provesida per %1</p> @@ -4568,22 +4874,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4591,30 +4897,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Tornar enviar totes los fichièrs + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Confirmatz la supression del compte - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection Suprimir la connexion - + Cancel Anullar @@ -4752,8 +5064,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4761,8 +5073,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4860,123 +5172,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version - + 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. - + Disconnected Desconnectat - + Disconnected from some accounts - + Disconnected from %1 Desconnectat de %1 - + Disconnected from accounts: Desconnectat dels comptes : - + Account %1: %2 Compte %1 : %2 - + Please sign in Mercés de vos connectar - + Signed out Desconnectat - + Account synchronization is disabled Sincronizacion del compte desactivada - - + + Synchronization is paused La sincronizacion es suspenduda - + Folder %1: %2 Dossièr %1 : %2 - + Unresolved conflicts - + Up to date A jorn - + Error during synchronization Error pendent la sincronizacion - + There are no sync folders configured. - + No sync folders configured - + Checking for changes in remote "%1" Verificacion de las modificacions distantas dins « %1 » - + Checking for changes in local "%1" Verificacion de las modificacions localas dins « %1 » - + Syncing %1 of %2 (%3 left) Sincro. %1 sus %2 (%3 demorant) - + Syncing %1 of %2 Sincronizacion %1 sus %2 - + Syncing %1 (%2 left) Sincronizacion %1 (%2 restantas) - + Syncing %1 Sincronizacion %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5128,27 +5440,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Dossièr novèl - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 Avètz modificat %1 - + Synced %1 @@ -5214,30 +5526,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5253,7 +5641,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5311,6 +5699,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5374,67 +5778,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online En linha - + Away Absent - + Do not disturb Desrengar pas - + Mute all notifications - + Invisible Invisible - + Appear offline - + Status message Messatge d’estatut - + What is your status? Quin es vòstre estatut ? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5518,24 +5922,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Compte actual - - + + Resume sync for all Reprendre la sincro. per totes - - + + Pause sync for all Suspendre la sincro. per totes @@ -5545,22 +5949,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Apondre un compte - + Add new account Apondre un compte novèl - + Settings Paramètres - + Exit Quitar @@ -5569,11 +5973,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5585,70 +5984,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Connectat - + Disconnected Desconnectat - + Open Nextcloud Talk in browser - + More apps Mai d’app - + Open %1 in browser - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5656,7 +6060,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Construit de la revision Git <a href="%1">%2</a> sus %3, %4 using Qt %5, %6</small></p> @@ -5690,72 +6094,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Suprimit - + Moved to %1 Desplaçat dins %1 - + Ignored Ignorat - + Filesystem access error Error d’accès als fichièrs sistèma - + Error Error - + Updated local metadata Metadonadas localas mesas a jorn - + Unknown Desconegut - + downloading telecargament - + uploading mandadís - + deleting supression - + moving desplaçament - + ignoring passant - + error error - + updating local metadata actualizacion de las metadonadas localas diff --git a/translations/client_pl.ts b/translations/client_pl.ts index 7b16ee480..8ee2a5b22 100644 --- a/translations/client_pl.ts +++ b/translations/client_pl.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Otwórz lokalnie %1 - + In %1 W %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Pokaż więcej akcji @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Odrzuć + + + Open file details + Otwórz szczegóły pliku + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista aktywności @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Wyczyść menu komunikatu statusu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Odrzuć + + + Activity Aktywność - + Sharing Udostępnianie @@ -226,12 +236,12 @@ Przeniesienie do kosza nie jest możliwe na tej platformie - + Error removing "%1": %2 Błąd podczas usuwania "%1": %2 - + Could not remove folder "%1" Nie można usunąć katalogu "%1" @@ -321,7 +331,7 @@ Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 204, ale otrzymano "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Nie udało się odblokować zaszyfrowanego katalogu %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Plik %1 jest już zablokowany przez %2. - + Lock operation on %1 failed with error %2 Operacja blokady %1 nie powiodła się z powodu błędu %2 - + Unlock operation on %1 failed with error %2 Operacja odblokowania na %1 nie powiodła się z powodu błędu %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Anuluj @@ -400,14 +410,14 @@ Wygląda na to, że funkcja Pliki wirtualne jest włączona w tym katalogu. W tej chwili nie jest możliwe bezpośrednie pobieranie plików wirtualnych, które są zaszyfrowane end-to-end. Aby uzyskać jak najlepsze korzystanie z Plików wirtualnych i Szyfrowania end-to-end, upewnij się, że zaszyfrowany katalog jest oznaczony jako "Dostępne zawsze lokalnie". - + End-to-end Encryption with Virtual Files Szyfrowanie end-to-end za pomocą wirtualnych plików - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". - + Wygląda na to, że w tym katalogu włączono funkcję plików wirtualnych. W tej chwili nie jest możliwe niejawne pobieranie wirtualnych plików, które są szyfrowane metodą end-to-end. Aby uzyskać najlepsze efekty z plikami wirtualnymi i szyfrowaniem end-to-end, upewnij się, że zaszyfrowany katalog jest oznaczony jako "Dostępne zawsze lokalnie". @@ -415,29 +425,29 @@ Nie szyfruj katalogu - + Do not encrypt folder Nie szyfruj katalogu - + Encrypt folder Zaszyfruj katalog - + No account configured. Brak skonfigurowanych kont. - - Display mnemonic - Wyświetl mnemonik + + Disable encryption + Wyłącz szyfrowanie - End-to-end encryption has been enabled for this account - Na tym koncie włączono szyfrowanie typu end-to-end + Display mnemonic + Wyświetl mnemonik @@ -445,19 +455,24 @@ Włącz szyfrowanie - + + End-to-end encryption has been enabled for this account + Na tym koncie włączono szyfrowanie typu end-to-end + + + Warning Ostrzeżenie - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? Szyfrowanie end-to-end nie jest skonfigurowane na tym urządzeniu. Po skonfigurowaniu będziesz mógł zaszyfrować ten katalog. Czy chcesz skonfigurować szyfrowanie end-to-end? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Nie można zaszyfrować katalogu z zawartością, usuń pliki. @@ -470,121 +485,121 @@ Poczekaj na nową synchronizację, a następnie ją zaszyfruj. To konto obsługuje szyfrowanie end-to-end - + Encryption failed Szyfrowanie nie powiodło się - + Could not encrypt folder because the folder does not exist anymore Nie można zaszyfrować katalogu, ponieważ katalog już nie istnieje - - + + Open folder Otwórz katalog - + Encrypt Szyfruj - - + + Edit Ignored Files Edytuj pliki ignorowane - - + + Create new folder Utwórz nowy katalog - - + + Availability Dostępność - + Choose what to sync Wybierz co synchronizować - + Force sync now Zsynchronizuj teraz - + Restart sync Uruchom ponownie synchronizację - + Resume sync Wznów synchronizację - + Pause sync Wstrzymaj synchronizację - + Remove folder sync connection Usuń katalog synchronizacji - + Disable virtual file support … Wyłącz obsługę plików wirtualnych… - + Enable virtual file support %1 … Włącz obsługę plików wirtualnych %1… - + (experimental) (eksperymentalne) - + Folder creation failed Utworzenie katalogu nie powiodło się - + <p>Could not create local folder <i>%1</i>.</p> <p>Nie można utworzyć katalogu lokalnego <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Potwierdź usunięcie katalogu synchronizacji - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Czy na pewno chcesz zatrzymać synchronizację katalogu <i>%1</i>?</p><p><b>Uwaga:</b> Ta operacja <b>nie</b> usunie żadnych plików.</p> - + Remove Folder Sync Connection Usuń katalog synchronizacji - + Disable virtual file support? Wyłączyć obsługę plików wirtualnych? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ Jedyną zaletą wyłączenia obsługi plików wirtualnych jest to, że funkcja s Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji. - + Disable support Wyłącz wsparcie @@ -607,145 +622,177 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji.Pamięciowe szyfrowanie end-to-end - + End-to-end encryption mnemonic Mnemonik szyfrowania end-to-end - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Aby chronić Twoją tożsamość kryptograficzną, szyfrujemy ją za pomocą mnemonika z 12 słów słownikowych. Hasło zachowaj w bezpiecznym miejscu. Będzie ono potrzebne do dodania innych urządzeń do Twojego konta (takich jak telefon komórkowy lub laptop). - + + Disable end-to-end encryption + Wyłącz szyfrowanie end-to-end + + + + Disable end-to-end encryption for %1? + Wyłączyć szyfrowanie end-to-end dla %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Usunięcie szyfrowania end-to-end spowoduje usunięcie plików zsynchronizowanych lokalnie, które są zaszyfrowane.<br>Zaszyfrowane pliki pozostaną na serwerze. + + + Sync Running Synchronizacja uruchomiona - + The syncing operation is running.<br/>Do you want to terminate it? Operacja synchronizacji jest uruchomiona.<br/>Czy chcesz ją zakończyć? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) z %2 w użyciu. Niektóre katalogi, w tym zamontowane lub udostępnione katalogi w sieci, mogą mieć różne ograniczenia. - + %1 of %2 in use Wykorzystane: %1 z %2 - + Currently there is no storage usage information available. Obecnie nie ma dostępnych informacji o wykorzystaniu pamięci. - + %1 in use Wykorzystane: %1 - + %1 as %2 %1 jako %2 - + The server version %1 is unsupported! Proceed at your own risk. Wersja serwera %1 nie jest już obsługiwana! Kontynuujesz na własne ryzyko. - + Connected to %1. Połączono z %1. - + Server %1 is temporarily unavailable. Serwer %1 jest tymczasowo niedostępny. - + Server %1 is currently in maintenance mode. Serwer %1 jest obecnie w trybie konserwacji. - + Signed out from %1. Wylogowano z %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Uzyskiwanie autoryzacji z przeglądarki. <a href='%1'>Kliknij tutaj</a>, aby ponownie otworzyć przeglądarkę. - + Connecting to %1 … Łączenie do %1… - + No connection to %1 at %2. Brak połączenia do %1 z %2. - + Server configuration error: %1 at %2. Błąd konfiguracji serwera: %1 w %2. - + No %1 connection configured. Nie skonfigurowano połączenia %1. - + There are folders that were not synchronized because they are too big: Katalogi te nie zostały zsynchronizowane ponieważ są zbyt duże: - + There are folders that were not synchronized because they are external storages: Katalogi te nie zostały zsynchronizowane, ponieważ znajdują się w magazynach zewnętrznych: - + There are folders that were not synchronized because they are too big or external storages: Katalogi te nie zostały zsynchronizowane, ponieważ są zbyt duże lub znajdują się w magazynach zewnętrznych: - + Confirm Account Removal Potwierdź usunięcie konta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Czy na pewno chcesz usunąć połączenie z kontem <i>%1</i>?</p><p><b>Uwaga:</b> Ta operacja <b>nie</b> usunie plików klienta.</p> - + Remove connection Usuń połączenie - - + This account supports end-to-end encryption To konto obsługuje szyfrowanie end-to-end - + Set up encryption Włącz szyfrowanie - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Szyfrowanie end-to-end zostało włączone na tym koncie z innym urządzeniu.<br>Można je włączyć na tym urządzeniu, wprowadzając swój mnemonik.<br>Umożliwi to synchronizację istniejących zaszyfrowanych katalogów. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Żądanie uwierzytelnienia do serwera zostało przekierowane do "%1". Adres URL jest nieprawidłowy, serwer został źle skonfigurowany. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Dostęp zabroniony przez serwer. Aby sprawdzić, czy masz odpowiednie uprawnienia, <a href="%1">kliknij tutaj</a>, aby połączyć się z usługą poprzez przeglądarkę. + + + + There was an invalid response to an authenticated WebDAV request + Wystąpiła nieprawidłowa odpowiedź na żądanie uwierzytelnienia WebDav @@ -799,7 +846,7 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji. OCC::ActivityListModel - + For more activities please open the Activity app. Aby uzyskać więcej informacji o działaniach, otwórz aplikację Aktywność. @@ -809,12 +856,12 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji.Pobieranie aktywności… - + Fetching activities … Pobieranie aktywności… - + Files from the ignore list as well as symbolic links are not synced. Pliki z listy ignorowanych oraz dowiązania symboliczne nie są synchronizowane. @@ -865,32 +912,59 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Kontynuacja będzie oznaczać <b>usunięcie tych ustawień</b>. - + Continuing will mean <b>ignoring these settings</b>. Kontynuacja będzie oznaczać <b>zignorowanie tych ustawień</b>. - + 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>. Niektóre ustawienia zostały skonfigurowane w nowszych wersjach tego klienta i używają funkcji, które nie są dostępne w tej wersji.<br><br>%1<br><br>Bieżący plik konfiguracyjny został już utworzony w <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Wyjdź - + Continue Kontynuuj - + Error accessing the configuration file Błąd dostępu do pliku konfiguracyjnego @@ -900,12 +974,12 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji.Wystąpił błąd podczas uzyskiwania dostępu do pliku konfiguracyjnego w %1. Upewnij się, że użytkownik może uzyskać dostęp do pliku. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Wystąpił błąd podczas dostępu do pliku konfiguracyjnego w %1. Upewnij się, że dostęp do pliku jest możliwy z Twojego konta systemowego. - + Quit %1 Zamknij %1 @@ -951,56 +1025,216 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji.Plik %1 ma nieprawidłowy czas modyfikacji. Nie wysyłaj na serwer. - + File Removed (start upload) %1 Plik usunięty (rozpocznij wysyłanie) %1 - + File %1 has invalid modification time. Do not upload to the server. Plik %1 ma nieprawidłowy czas modyfikacji. Nie wysyłaj na serwer. - + Local file changed during syncing. It will be resumed. Plik lokalny zmieniony podczas synchronizacji. Zostanie wznowiony. - - + + Local file changed during sync. Plik lokalny zmieniony podczas synchronizacji. - + Network error: %1 Błąd sieci: %1 - + Error updating metadata: %1 Błąd podczas aktualizowania metadanych: %1 - + The file %1 is currently in use Plik %1 jest aktualnie używany - + The local file was removed during sync. Plik lokalny został usunięty podczas synchronizacji. - + Restoration failed: %1 Przywracanie nie powiodło się: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Nie można zmienić nazwy pliku, ponieważ plik o tej samej nazwie już istnieje na serwerze. Wybierz inną nazwę. + + + + Could not rename file. Please make sure you are connected to the server. + Nie udało się zmienić nazwy pliku. Upewnij się, że masz połączenie z serwerem. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Nie masz uprawnień do zmiany nazwy tego pliku. Poproś autora pliku o zmianę jego nazwy. + + + + Failed to fetch permissions with error %1 + Nie udało się pobrać uprawnień z błędem %1 + + + + Filename contains leading and trailing spaces. + Nazwa pliku zawiera spacje poprzedzające i końcowe. + + + + Filename contains leading spaces. + Nazwa pliku zawiera spacje na początku. + + + + Filename contains trailing spaces. + Nazwa pliku zawiera spacje na końcu. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Konflikt niezgodności + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Nie można zsynchronizować pliku, ponieważ generuje on konflikt między wielkościami liter z istniejącym plikiem w tym systemie. + + + + Error + Błąd + + + + Existing file + Istniejący plik + + + + file A + + + + + fileA + plik A + + + + + today + dzisiaj + + + + + 0 byte + 0 bajtów + + + + + Open existing file + Otwórz istniejący plik + + + + Case clashing file + Plik kolidujący + + + + file B + + + + + fileB + plik B + + + + + Open clashing file + Otwórz plik kolidujący + + + + Please enter a new name for the clashing file: + Podaj nową nazwę kolidującego pliku: + + + + New filename + Nowa nazwa pliku + + + + Rename file + Zmień nazwę pliku + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Plik "%1" nie mógł zostać zsynchronizowany z powodu konfliktu związanego z wielkością liter z istniejącym plikiem w tym systemie. + + + + %1 does not support equal file names with only letter casing differences. + %1 nie obsługuje jednakowych nazw plików z różnicą wielkości liter. + + + + Filename contains leading and trailing spaces. + Nazwa pliku zawiera spacje na początku i na końcu. + + + + Filename contains leading spaces. + Nazwa pliku zawiera spacje na początku. + + + + Filename contains trailing spaces. + Nazwa pliku zawiera spacje na końcu. + + + + Use invalid name + Użyj nieprawidłowej nazwy + + + + Filename contains illegal characters: %1 + Nazwa pliku zawiera niedozwolone znaki: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Błąd zapisu metadanych do bazy danych @@ -1018,12 +1252,12 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji.Wprowadź hasło szyfrowania end to end:<br><br>Użytkownik: %2<br>Konto: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Wprowadź hasło szyfrowania End-to-End:<br><br>Nazwa użytkownika: %2<br>Konto: %3<br> - + Enter E2E passphrase Wprowadź hasło dla end to end @@ -1199,8 +1433,8 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Błąd serwera: odpowiedź PROPFIND nie ma formatu XML! @@ -1208,27 +1442,27 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Błąd podczas otwierania katalogu %1 - + Directory not accessible on client, permission denied Katalog niedostępny w kliencie, odmowa uprawnienia - + Directory not found: %1 Nie znaleziono katalogu: %1 - + Filename encoding is not valid Kodowanie nazwy pliku jest nieprawidłowe - + Error while reading directory %1 Błąd podczas odczytu katalogu %1 @@ -1236,91 +1470,91 @@ Ta czynność spowoduje przerwanie aktualnie uruchomionej synchronizacji. OCC::EditLocallyJob - + Invalid token received. Otrzymano nieprawidłowy token. - - - - - - + + + + + + Please try again. Spróbuj ponownie. - + Invalid file path was provided. Podano nieprawidłową ścieżkę do pliku. - + Could not find an account for local editing. Nie udało się znaleźć konta do lokalnej edycji. - - + + Could not validate the request to open a file from server. Nie można zweryfikować żądania otwarcia pliku z serwera. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Nie udało się znaleźć pliku do lokalnej edycji. Upewnij się, że jego ścieżka jest prawidłowa i jest zsynchronizowana lokalnie. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Nie udało się znaleźć pliku do lokalnej edycji. Upewnij się, że nie jest wykluczony przez synchronizację wybiórczą. - + Server error: PROPFIND reply is not XML formatted! - + Błąd serwera: odpowiedź PROPFIND nie ma formatu XML! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Nie można znaleźć informacji o zdalnym pliku do edycji lokalnej. Upewnij się, że jego ścieżka jest poprawna. - + Could not open %1 - + Nie można otworzyć %1 - + File %1 already locked. - + Plik %1 jest już zablokowany. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Blokada będzie trwała przez %1 minut. Możesz także odblokować ten plik ręcznie po zakończeniu edycji. - + File %1 now locked. - + Plik %1 jest teraz zablokowany. - + File %1 could not be locked. - + Nie można zablokować pliku %1. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Nie można wygenerować metadanych do szyfrowania, odblokowanie katalogu. @@ -1450,145 +1684,145 @@ Może to być problem z bibliotekami OpenSSL. OCC::Folder - + Local folder %1 does not exist. Katalog lokalny %1 nie istnieje. - + %1 should be a folder but is not. %1 powinien być katalogiem, ale nim nie jest. - + %1 is not readable. %1 nie jest do odczytu. - + %1 and %n other file(s) have been removed. %1 i %n inny plik został usunięty.%1 i %n inne pliki zostały usunięte.%1 i %n innych plików zostało usuniętych.%1 i %n innych plików zostało usuniętych. - + %1 has been removed. %1 names a file. %1 został usunięty. - + %1 and %n other file(s) have been added. %1 i %n inny plik został dodany.%1 i %n inne pliki zostały dodane.%1 i %n innych plików zostało dodanych.%1 i %n innych plik(ów) zostało dodanych. - + %1 has been added. %1 names a file. %1 został dodany. - + %1 and %n other file(s) have been updated. %1 i %n inny plik został zaktualizowany.%1 i %n inne pliki zostały zaktualizowane.%1 i %n innych plików zostało zaktualizowanych.%1 i %n innych plików zostało zaktualizowanych. - + %1 has been updated. %1 names a file. %1 został zaktualizowany. - + %1 has been renamed to %2 and %n other file(s) have been renamed. Nazwa %1 została zmieniona na %2 i w %n innym pliku.Nazwa %1 została zmieniona na %2 i w %n innych plikach.Nazwa %1 została zmieniona na %2 i w %n innych plikach.Nazwa %1 została zmieniona na %2 i w %n innych plikach. - + %1 has been renamed to %2. %1 and %2 name files. Nazwa %1 została zmieniona na %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 został przeniesiony do %2 i %n inny plik.%1 został przeniesiony do %2 i %n inne pliki.%1 został przeniesiony do %2 i %n innych plików.%1 został przeniesiony do %2 i %n innych plików. - + %1 has been moved to %2. %1 został przeniesiony do %2. - + %1 has and %n other file(s) have sync conflicts. %1 i %n inny plik ma konflikt synchronizacji.%1 i %n inne pliki mają konflikt synchronizacji.%1 i %n innych plików mają konflikt synchronizacji.%1 i %n innych plików mają konflikt synchronizacji. - + %1 has a sync conflict. Please check the conflict file! %1 ma konflikt synchronizacji. Sprawdź plik konfliktu! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 i %n inny plik nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w dzienniku.%1 i %n inne pliki nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w dzienniku.%1 i %n innych plików nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w dzienniku.%1 i %n innych plików nie mogą zostać zsynchronizowane z powodu błędów. Sprawdź szczegóły w dzienniku. - + %1 could not be synced due to an error. See the log for details. %1 nie może zostać zsynchronizowany z powodu błędu. Zobacz szczegóły w dzienniku. - + %1 and %n other file(s) are currently locked. %1 i %n inny plik jest obecnie zablokowany.%1 i %n inne pliki są obecnie zablokowane.%1 i %n innych plików są obecnie zablokowane.%1 i %n innych plików są obecnie zablokowane. - + %1 is currently locked. %1 jest obecnie zablokowany. - + Sync Activity Synchronizuj aktywność - + Could not read system exclude file Nie można odczytać systemowego pliku wykluczeń - + A new folder larger than %1 MB has been added: %2. Dodano nowy katalog większy niż %1 MB: %2. - + A folder from an external storage has been added. Dodano katalog z magazynu zewnętrznego. - + Please go in the settings to select it if you wish to download it. Przejdź do ustawień, aby go wybrać do pobrania. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Katalog %1 został utworzony, ale wcześniej został wykluczony z synchronizacji. Dane w nim zawarte nie zostaną zsynchronizowane. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Plik %1 został utworzony, ale wcześniej został wykluczony z synchronizacji. Nie zostanie on zsynchronizowany. - + 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). @@ -1601,7 +1835,7 @@ Oznacza to, że klient synchronizacji może nie przesyłać natychmiast zmian lo %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ Jeśli zdecydujesz się przywrócić pliki i posiadasz odpowiednie uprawnienia, Jeśli zdecydujesz się je usunąć, nie będą już dostępne. - + 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. @@ -1621,17 +1855,17 @@ Czy na pewno chcesz zsynchronizować te działania z serwerem? Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one przywrócone z serwera. - + Remove All Files? Usunąć wszystkie pliki? - + Remove all files Usuń wszystkie pliki - + Keep files Zachowaj pliki @@ -1667,22 +1901,22 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one OCC::FolderMan - + Could not reset folder state Nie można zresetować stanu katalogu - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Znaleziono stary dziennik synchronizacji "%1", ale nie można go usunąć. Upewnij się, że żadna aplikacja go nie używa. - + (backup) (kopia zapasowa) - + (backup %1) (kopia zapasowa %1) @@ -1692,27 +1926,27 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one Niezdefiniowany stan. - + Undefined state. Stan niezdefiniowany. - + Waiting to start syncing. Oczekiwanie na rozpoczęcie synchronizacji. - + Preparing for sync. Przygotowanie do synchronizacji. - + Sync is running. Synchronizacja jest uruchomiona. - + Sync finished with unresolved conflicts. Synchronizacja zakończona z nierozwiązanymi konfliktami. @@ -1732,62 +1966,62 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one Użytkownik anulował. - + Last sync was successful. Ostatnia synchronizacja zakończona powodzeniem. - + Setup error. Błąd ustawień. - + Sync request was cancelled. Żądanie o synchronizację zostało anulowane. - + Sync is paused. Synchronizacja wstrzymana. - + %1 (Sync is paused) %1 (Synchronizacja wstrzymana) - + No valid folder selected! Nie wybrano prawidłowego katalogu! - + The selected path does not exist! Wybrana ścieżka nie istnieje! - + The selected path is not a folder! Wybrana ścieżka nie jest katalogiem! - + You have no permission to write to the selected folder! Nie masz uprawnień do zapisu w wybranym katalogu! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Katalog lokalny %1 zawiera już katalog używany w połączeniu do synchronizacji katalogów. Wybierz inny! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! W katalogu lokalnym %1 jest już zawarty katalog używany w obsłudze do synchronizacji katalogów. Wybierz inny! - + There is already a sync from the server to this local folder. Please pick another local folder! Ten katalog jest już wybrany do synchronizacji z serwerem. Wybierz inny katalog lokalny! @@ -1800,7 +2034,7 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one Dodaj katalog synchronizacji - + File Plik @@ -1808,152 +2042,156 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one OCC::FolderStatusModel - + You need to be connected to add a folder Musisz być połączony, aby dodać katalog - + Click this button to add a folder to synchronize. Kliknij ten przycisk, aby dodać katalog do synchronizacji. - - + + Could not decrypt! + Nie można odszyfrować! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Wystąpił błąd podczas pobierania listy katalogów z serwera. - + Fetching folder list from server … Pobieranie listy katalogów z serwera… - + There are unresolved conflicts. Click for details. Wystąpiły nierozwiązane konflikty. Kliknij, aby poznać szczegóły. - + Virtual file support is enabled. Obsługa plików wirtualnych jest włączona. - + Signed out Wylogowany - + Synchronizing VirtualFiles with local folder Synchronizacja VirtualFiles z katalogiem lokalnym - + Synchronizing with local folder Synchronizacja z katalogiem lokalnym - + Checking for changes in remote "%1" Sprawdzanie zmian w zdalnym "%1" - + Checking for changes in local "%1" Sprawdzanie zmian w lokalnym "%1" - + Reconciling changes Sprawdzanie zmian - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synchronizowanie %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) pobieranie %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) wysyłanie %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 z %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Zostało kilka sekund, %1 z %2, plik %3 z %4 - + %5 left, %1 of %2, file %3 of %4 Plik %3 z %4, pozostało %5 (%1 z %2) - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" Plik %3 z %4, %1 z %2 - + file %1 of %2 plik %1 z %2 - + Waiting … Oczekiwanie… - + Waiting for %n other folder(s) … Oczekiwanie na %n inny katalog…Oczekiwanie na %n inne katalogi…Oczekiwanie na %n innych katalogów…Oczekiwanie na %n inny katalog(i)… - + Preparing to sync … Przygotowywanie do synchronizacji… @@ -2184,13 +2422,13 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one - + stable stabilny - + beta beta @@ -2242,32 +2480,32 @@ Jeśli to był przypadek i zdecydujesz się zachować swoje pliki, zostaną one - + Create Debug Archive Utwórz archiwum debugowania - + Server notifications that require attention. Powiadomienia serwera, które wymagają uwagi. - + Show call notification dialogs. Pokaż dialogi w powiadomieniu połączenia. - + You cannot disable autostart because system-wide autostart is enabled. Nie można wyłączyć autostartu, ponieważ autostart całego systemu jest włączony. - + Change update channel? Zmienić kanał aktualizacji? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Zwróć uwagę, że wybiera to tylko, z której puli aktualizacje są pobierane oraz że nie można powrócić do niższej wersji. Więc powrót z kanału beta do stabilnego zwykle nie może być wykonany natychmiast i oznacza to oczekiwanie na stabilną wersję, która jest nowsza niż aktualnie zainstalowana wersja beta. - + Change update channel Zmień kanał aktualizacji - + Cancel Anuluj - + Zip Archives Archiwa Zip - + Debug Archive Created Utworzono archiwum debugowania - + Debug archive is created at %1 Archiwum debugowania jest utworzone w %1 @@ -2304,22 +2542,22 @@ Zwróć uwagę, że wybiera to tylko, z której puli aktualizacje są pobierane OCC::GetOrCreatePublicLinkShare - + Password for share required Wymagane hasło dla udostępnienia - + Please enter a password for your link share: Wprowadź hasło dla udostępnionego linku: - + Sharing error Błąd udostępniania - + Could not retrieve or create the public link share. Error: %1 @@ -2461,7 +2699,7 @@ Elementy, dla których usunięcie jest dozwolone, zostaną usunięte, o ile umo Please enter a new name for the file: - Wprowadź nową nazwę pliku: + Podaj nową nazwę pliku: @@ -2557,6 +2795,11 @@ Elementy, dla których usunięcie jest dozwolone, zostaną usunięte, o ile umo Close Zamknij + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Prawa autorskie 2017-2023 Nextcloud GmbH<br />Prawa autorskie 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2892,60 +3135,60 @@ Zauważ, że użycie jakichkolwiek opcji wiersza poleceń logowania spowoduje za - + Use &virtual files instead of downloading content immediately %1 Użyj plików &wirtualnych zamiast bezpośrednio pobierać ich zawartość %1 - + (experimental) (eksperymentalne) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Pliki wirtualne nie są obsługiwane w przypadku katalogów głównych partycji Windows jako katalogu lokalnego. Wybierz prawidłowy podkatalog według litery dysku. - + %1 folder "%2" is synced to local folder "%3" Katalog %1 "%2" jest synchronizowany z katalogiem lokalnym "%3" - + Sync the folder "%1" Synchronizuj katalog "%1" - + Warning: The local folder is not empty. Pick a resolution! Uwaga: Katalog lokalny nie jest pusty. Bądź ostrożny! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 wolnej przestrzeni - + Virtual files are not available for the selected folder Pliki wirtualne nie są dostępne dla wybranego katalogu - + Local Sync Folder Lokalny katalog synchronizacji - - + + (%1) (%1) - + There isn't enough free space in the local folder! W katalogu lokalnym nie ma wystarczającej ilości wolnego miejsca! @@ -3017,7 +3260,8 @@ Zauważ, że użycie jakichkolwiek opcji wiersza poleceń logowania spowoduje za OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Nie można uzyskać czasu modyfikacji pliku w konflikcie %1 @@ -3049,144 +3293,144 @@ Zauważ, że użycie jakichkolwiek opcji wiersza poleceń logowania spowoduje za OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Udane połączenie z %1: %2 wersja %3 (%4)</font><br/><br/> - + Invalid URL Nieprawidłowy adres URL - + Failed to connect to %1 at %2:<br/>%3 Nie udało się połączyć do %1 w %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Przekroczono limit czasu podczas próby połączenia do %1 na %2. - + Trying to connect to %1 at %2 … Próba połączenia z %1 w %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Uwierzytelnione zapytanie do serwera zostało przekierowane do "%1". Adres URL jest nieprawidłowy, serwer został źle skonfigurowany. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Dostęp zabroniony przez serwer. Aby sprawdzić, czy masz odpowiednie uprawnienia, <a href="%1">kliknij tutaj</a>, aby połączyć się z usługą poprzez przeglądarkę. - + There was an invalid response to an authenticated WebDAV request Wystąpiła nieprawidłowa odpowiedź na żądanie uwierzytelnienia WebDav - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Lokalny katalog synchronizacji %1 już istnieje. Ustawiam go do synchronizacji.<br/><br/> - + Creating local sync folder %1 … Tworzenie lokalnego katalogu synchronizacji %1… - + OK OK - + failed. błąd. - + Could not create local folder %1 Nie można utworzyć katalogu lokalnego %1 - + No remote folder specified! Nie określono katalogu zdalnego! - + Error: %1 Błąd: %1 - + creating folder on Nextcloud: %1 tworzenie katalogu w Nextcloud: %1 - + Remote folder %1 created successfully. Katalog zdalny %1 został pomyślnie utworzony. - + The remote folder %1 already exists. Connecting it for syncing. Zdalny katalog %1 już istnieje. Podłączam go do synchronizowania. - - + + The folder creation resulted in HTTP error code %1 Tworzenie katalogu spowodowało kod błędu HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Nie udało się utworzyć zdalnego katalogu ponieważ podane poświadczenia są nieprawidłowe!<br/>Powróć i sprawdź poświadczenia.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Tworzenie katalogu zdalnego nie powiodło się. Prawdopodobnie dostarczone poświadczenia są nieprawidłowe.</font><br/>Powróć i sprawdź poświadczenia.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Tworzenie katalogu zdalnego %1 nie powiodło się z powodu błędu <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Połączenie synchronizacji z %1 do katalogu zdalnego %2 zostało utworzone. - + Successfully connected to %1! Udane połączenie z %1! - + Connection to %1 could not be established. Please check again. Nie można nawiązać połączenia z %1. Sprawdź ponownie. - + Folder rename failed Zmiana nazwy katalogu nie powiodła się - + Cannot 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. Nie można usunąć oraz wykonać kopii zapasowej katalogu, ponieważ katalog lub plik znajdujący się w nim jest otwarty w innym programie. Zamknij katalog lub plik i naciśnij przycisk "Ponów próbę" lub anuluj konfigurację. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Utworzenie lokalnego katalogu synchronizowanego %1 zakończone pomyślnie!</b></font> @@ -3209,12 +3453,12 @@ Zauważ, że użycie jakichkolwiek opcji wiersza poleceń logowania spowoduje za Anuluj - + Enable experimental feature? Włączyć funkcję eksperymentalną? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3231,12 +3475,12 @@ Przełączenie do tego trybu spowoduje przerwanie aktualnie uruchomionej synchro To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgłoś wszelkie pojawiające się problemy. - + Enable experimental placeholder mode Włącz eksperymentalny tryb symboli zastępczych - + Stay safe Bądź bezpieczny @@ -3265,162 +3509,167 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Linki symboliczne nie są obsługiwane podczas synchronizacji. - + File is listed on the ignore list. Plik znajduje się na liście ignorowanych. - + File names ending with a period are not supported on this file system. Nazwy plików kończące się kropką nie są obsługiwane w tym systemie plików. - + File names containing the character "%1" are not supported on this file system. Nazwy plików zawierające znak "%1" nie są obsługiwane w tym systemie plików. - + File name contains at least one invalid character Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak - + The file name is a reserved name on this file system. Nazwa pliku jest nazwą zarezerwowaną w tym systemie plików. - + Filename contains trailing spaces. - Nazwa pliku zawiera na końcu spacje. + Nazwa pliku zawiera spacje na końcu. - + Filename contains leading spaces. Nazwa pliku zawiera spacje poprzedzające. - + Filename contains leading and trailing spaces. Nazwa pliku zawiera spacje poprzedzające i końcowe. - + Filename is too long. Nazwa pliku jest za długa. - + File/Folder is ignored because it's hidden. Plik/katalog jest ignorowany, ponieważ jest ukryty. - + Stat failed. Błąd statystyk. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Pobrano wersję z serwera, nazwa lokalnej kopii została zmieniona i nie wysłana. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Konflikt niezgodności: Pobrano plik z serwera i zmieniono jego nazwę, aby uniknąć kolizji. + + + The filename cannot be encoded on your file system. Nazwa pliku nie może być zakodowana w systemie plików. - + The filename is blacklisted on the server. Nazwa pliku jest na czarnej liście na serwerze. - + File has extension reserved for virtual files. Plik ma rozszerzenie zarezerwowane dla plików wirtualnych. - + size rozmiar - + permission pozwolenie - + file id id pliku - + Server reported no %1 Serwer zgłosił brak %1 - + Cannot sync due to invalid modification time Nie można zsynchronizować z powodu nieprawidłowego czasu modyfikacji - + Error while deleting file record %1 from the database Błąd podczas usuwania rekordu pliku %1 z bazy danych - + Conflict when uploading a folder. It's going to get cleared! Konflikt podczas wysyłania katalogu. To się wyjaśni! - + Conflict when uploading a file. It's going to get removed! Konflikt podczas wysyłania pliku. Zostanie usunięty! - + Ignored because of the "choose what to sync" blacklist Ignorowane z powodu czarnej listy "Wybierz co synchronizować" - + Not allowed because you don't have permission to add subfolders to that folder Niedozwolone, ponieważ nie masz uprawnień do dodawania podkatalogów do tego katalogu - + Not allowed because you don't have permission to add files in that folder Niedozwolone, ponieważ nie masz uprawnień do dodawania plików w tym katalogu - + Not allowed to upload this file because it is read-only on the server, restoring Wysyłanie niedozwolone, ponieważ plik jest tylko do odczytu na serwerze, przywracanie - + Moved to invalid target, restoring Przeniesiono do nieprawidłowego obiektu, przywracanie - + Not allowed to remove, restoring Brak uprawnień by usunąć, przywracanie - + Error while reading the database Błąd podczas odczytu bazy danych - + Server replied with an error while reading directory "%1" : %2 Serwer odpowiedział z błędem podczas odczytu katalogu "%1" : %2 @@ -3428,22 +3677,22 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::PropagateDirectory - + could not delete file %1 from local DB Nie można usunąć pliku %1 z lokalnej bazy danych - + Error updating metadata due to invalid modification time Błąd podczas aktualizacji metadanych z powodu nieprawidłowego czasu modyfikacji - + Error updating metadata: %1 Błąd podczas aktualizowania metadanych: %1 - + File is currently in use Plik jest aktualnie używany @@ -3456,19 +3705,19 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Nie można pobrać pliku %1 z lokalnej bazy danych - + File %1 cannot be downloaded because encryption information is missing. Nie można pobrać pliku %1 z powodu braku informacji o szyfrowaniu. - - + + File has changed since discovery W trakcie wyszukiwania plik uległ zmianie - + Could not delete file record %1 from local DB Nie można usunąć rekordu pliku %1 z lokalnej bazy danych @@ -3479,32 +3728,32 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Nie można pobrać pliku %1 z powodu konfliktu nazwy pliku lokalnego! - + File %1 can not be downloaded because of a local file name clash! Nie można pobrać pliku %1 ze względu na konflikt nazwy pliku lokalnego! - + The download would reduce free local disk space below the limit Pobranie zmniejszyłoby wolne miejsce na dysku lokalnym poniżej limitu - + Free space on disk is less than %1 Wolne miejsce na dysku jest mniejsze niż %1 - + File was deleted from server Plik został usunięty z serwera - + The file could not be downloaded completely. Plik nie mógł być całkowicie pobrany. - + The downloaded file is empty, but the server said it should have been %1. Pobrany plik jest pusty, ale serwer odpowiedział, że powinien mieć %1. @@ -3514,18 +3763,23 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Nie można zapisać pliku %1 z powodu lokalnego konfliktu nazwy pliku! - - + + File %1 has invalid modified time reported by server. Do not save it. Plik %1 ma nieprawidłowy czas modyfikacji zgłoszony przez serwer. Nie zapisuj go. - + + File %1 downloaded but it resulted in a local file name clash! + Plik %1 został pobrany, ale spowodowało to lokalną kolizję nazwy pliku! + + + Error updating metadata: %1 Błąd podczas aktualizowania metadanych: %1 - + The file %1 is currently in use Plik %1 jest aktualnie używany @@ -3546,7 +3800,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 nie można usunąć pliku %1, błąd: %2 @@ -3557,16 +3811,21 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł + Folder %1 cannot be created because of a local file or folder name clash! + Nie można utworzyć katalogu %1 z powodu konfliktu nazwy lokalnego pliku lub katalogu! + + + Could not create folder %1 Nie można utworzyć katalogu %1 - + Error updating metadata: %1 Błąd podczas aktualizowania metadanych: %1 - + The file %1 is currently in use Plik %1 jest aktualnie używany @@ -3574,7 +3833,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Nie można usunąć %1 z powodu kolizji z lokalną nazwą pliku @@ -3587,46 +3846,51 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Nie można zmienić nazwy pliku %1 na %2 z powodu konfliktu nazwy pliku lokalnego - - - + + File %1 downloaded but it resulted in a local file name clash! + Plik %1 został pobrany, ale spowodowało to lokalną kolizję nazwy pliku! + + + + + could not get file %1 from local DB Nie można pobrać pliku %1 z lokalnej bazy danych - + Error setting pin state Błąd podczas ustawiania stanu przypięcia - - + + Error updating metadata: %1 Błąd podczas aktualizowania metadanych: %1 - + The file %1 is currently in use Plik %1 jest aktualnie używany - - + + Could not delete file record %1 from local DB Nie można usunąć rekordu pliku %1 z lokalnej bazy danych - + Failed to propagate directory rename in hierarchy Nie udało się rozszerzyć zmiany nazwy katalogu w hierarchii - + Failed to rename file Nie udało się zmienić nazwy pliku @@ -3647,7 +3911,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 204, ale otrzymano "%1 %2". @@ -3660,12 +3924,12 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 201, a otrzymano "%1 %2". - + Error writing metadata to the database: %1 Błąd zapisu metadanych do bazy danych: %1 - + The file %1 is currently in use Plik %1 jest aktualnie używany @@ -3673,42 +3937,42 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Nie można zmienić nazwy %1 na %2, błąd: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 201, a otrzymano "%1 %2". - + could not get file %1 from local DB Nie można pobrać pliku %1 z lokalnej bazy danych - + Could not delete file record %1 from local DB Nie można usunąć rekordu pliku %1 z lokalnej bazy danych - + Error updating metadata: %1 Błąd podczas aktualizowania metadanych: %1 - + The file %1 is currently in use Plik %1 jest aktualnie używany - + Error setting pin state Błąd podczas ustawiania stanu przypięcia - + Error writing metadata to the database Błąd zapisu metadanych do bazy danych @@ -3898,7 +4162,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::ServerNotificationHandler - + Reply Odpowiedz @@ -3916,23 +4180,23 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Ustawienia - + %1 Settings This name refers to the application name e.g Nextcloud Ustawienia %1 - + General Ogólne - + Network Sieć - + Account Konto @@ -3940,17 +4204,22 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::ShareModel - + Share link Udostępnij link - + Link share Udostępnianie linków - + + Internal link + Link wewnętrzny + + + Enter a note for the recipient Napisz notatkę dla odbiorcy @@ -4026,7 +4295,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4035,132 +4304,171 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::SocketApi - + + Failed to encrypt folder at "%1" + Nie udało się zaszyfrować katalogu w "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + Konto %1 nie ma skonfigurowanego szyfrowania end-to-end. Skonfiguruj to w ustawieniach konta, aby włączyć szyfrowanie katalogów. + + + + Failed to encrypt folder + Nie udało się zaszyfrować katalogu + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Nie można zaszyfrować następującego katalogu: "%1". + +Serwer odpowiedział błędem: %2 + + + + Folder encrypted successfully + Katalog zaszyfrowano pomyślnie + + + + The following folder was encrypted successfully: "%1" + Następujący katalog został zaszyfrowany pomyślnie: "%1" + + + Context menu share Menu kontekstowe udostępniania - + Select new location … Wybierz nową lokalizację… - + I shared something with you Coś Tobie udostępniłem - - + + Share options Opcje udostępniania - - + + Activity Aktywność - + Copy private link to clipboard Kopiuj link prywatny do schowka - + Send private link by email … Wyślij link prywatny e-mailem… + + + Expire in %1 minutes + remaining time before lock expire + Wygaśnie za %1 minutęWygaśnie za %1 minutyWygaśnie za %1 minutWygaśnie za %1 minut + - + Leave this share Opuść udostępnienie - + Resharing this file is not allowed Udostępnianie dalej tego pliku jest niedozwolone - + Resharing this folder is not allowed Udostępnianie dalej tego katalogu jest niedozwolone - - + + Copy public link Kopiuj link publiczny - + Copy internal link Kopiuj link wewnętrzny - + + Encrypt + Zaszyfruj + + + Lock file Zablokuj plik - + Unlock file Odblokuj plik - + Locked by %1 Zablokowany przez %1 - - Expire in %1 minutes - remaining time before lock expire - Wygaśnie za %1 minutęWygaśnie za %1 minutyWygaśnie za %1 minutWygaśnie za %1 minut - - - + Expires in %1 minutes remaining time before lock expires Wygasa za %1 minutęWygasa za %1 minutyWygasa za %1 minutWygasa za %1 minut - + Edit Edytuj - + Open in browser Otwórz w przeglądarce - + Resolve conflict … Rozwiąż konflikt… - + Move and rename … Przenieś i zmień nazwę… - + Move, rename and upload … Przenieś, zmień nazwę i wyślij… - + Delete local changes Usuń zmiany lokalne - + Move and upload … Przenieś i wyślij… - + Delete Usuń @@ -4378,63 +4686,63 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (pominięty z powodu wcześniejszego błędu, próbuję ponownie %2) - + Could not update file: %1 Nie można zaktualizować pliku: %1 - + Could not update virtual file metadata: %1 Nie można zaktualizować metadanych pliku wirtualnego: %1 - + Could not update file metadata: %1 Nie można zaktualizować metadanych pliku: %1 - + Could not set file record to local DB: %1 Nie można ustawić rekordu pliku na lokalną bazę danych: %1 - + Unresolved conflict. Nierozpoznany konflikt. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Dostępnych jest tylko %1, aby rozpocząć, potrzebujesz co najmniej %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Nie można otworzyć lub utworzyć lokalnej bazy danych synchronizacji. Upewnij się, że masz dostęp do zapisu w katalogu synchronizacji. - + Using virtual files with suffix, but suffix is not set Używanie plików wirtualnych z przyrostkiem, lecz przyrostek nie jest ustawiony - + Unable to read the blacklist from the local database Nie można odczytać czarnej listy z lokalnej bazy danych - + Unable to read from the sync journal. Nie można odczytać z dziennika synchronizacji. - + Cannot open the sync journal Nie można otworzyć dziennika synchronizacji @@ -4444,12 +4752,12 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Synchronizacja zostanie wkrótce wznowiona. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Brak miejsca na dysku: Pominięto pobieranie plików, które zmniejszyłyby ilość wolnego miejsca poniżej %1. - + There is insufficient space available on the server for some uploads. Na serwerze nie ma wystarczającej ilości miejsca na niektóre wysłane pliki. @@ -4518,59 +4826,59 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::Systray - + Download Pobierz - + Add account Dodaj konto - + Open main dialog Otwórz główne okno dialogowe - - + + Pause sync Wstrzymaj synchronizację - - + + Resume sync Wznów synchronizację - + Settings Ustawienia - + Help Pomoc - + Exit %1 Wyjdź z %1 - + Pause sync for all Wstrzymaj wszystkie synchronizacje - + Resume sync for all Wznów wszystkie synchronizacje - + %1: %2 %1: %2 @@ -4578,24 +4886,24 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Desktop Client</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Wersja %1. Aby uzyskać więcej informacji, kliknij <a href='%2'>tutaj</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Używanie wtyczki plików wirtualnych: %1</small></p> - + <p>This release was supplied by %1</p> <p>To wydanie zostało dostarczone przez %1</p> @@ -4603,22 +4911,22 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Nie udało się pobrać dostawców. - + Failed to fetch search providers for '%1'. Error: %2 Nie udało się pobrać dostawców wyszukiwania dla '%1'. Błąd: %2 - + Search has failed for '%2'. Wyszukiwanie nie powiodło się dla '%2'. - + Search has failed for '%1'. Error: %2 Wyszukiwanie nie powiodło się dla '%1'. Błąd: %2 @@ -4626,30 +4934,36 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::User - + Retry all uploads Ponów wysłanie wszystkich plików + + + + Resolve conflict + Rozwiąż konflikt + OCC::UserModel - + Confirm Account Removal Potwierdź usunięcie konta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Czy na pewno chcesz usunąć połączenie z kontem <i>%1</i>?</p><p><b>Uwaga:</b> Ta operacja <b>nie</b> usunie plików klienta.</p> - + Remove connection Usuń połączenie - + Cancel Anuluj @@ -4787,8 +5101,8 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Błąd podczas aktualizacji metadanych z powodu nieprawidłowego czasu modyfikacji @@ -4796,8 +5110,8 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Błąd podczas aktualizacji metadanych z powodu nieprawidłowego czasu modyfikacji @@ -4895,123 +5209,123 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł OCC::ownCloudGui - + Unsupported Server Version Niewspierana wersja serwera - + 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. Serwer na koncie %1 uruchomiony jest na starej i niewspieranej wersji %2. Używanie klienta z niewspieraną wersją serwera nie zostało przetestowane i jest potencjalnie niebezpieczne. Kontynuujesz na własne ryzyko. - + Disconnected Rozłączony - + Disconnected from some accounts Odłączono kilka kont - + Disconnected from %1 Rozłączony z %1 - + Disconnected from accounts: Rozłączony z kontami: - + Account %1: %2 Konto %1: %2 - + Please sign in Proszę się zalogować - + Signed out Odłączony - + Account synchronization is disabled Synchronizacja konta jest wyłączona - - + + Synchronization is paused Synchronizacja jest wstrzymana - + Folder %1: %2 Katalog %1: %2 - + Unresolved conflicts Nierozpoznane konflikty - + Up to date Aktualny - + Error during synchronization Błąd podczas synchronizacji - + There are no sync folders configured. Nie skonfigurowano żadnych katalogów synchronizacji. - + No sync folders configured Nie skonfigurowano katalogów do synchronizacji - + Checking for changes in remote "%1" Sprawdzanie zmian w zdalnym "%1" - + Checking for changes in local "%1" Sprawdzanie zmian w lokalnym "%1" - + Syncing %1 of %2 (%3 left) Synchronizacja %1 z %2 (pozostało %3) - + Syncing %1 of %2 Synchronizacja %1 z %2 - + Syncing %1 (%2 left) Synchronizacja %1 (%2 pozostało) - + Syncing %1 Synchronizacja %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5163,27 +5477,27 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Nowy katalog - + You renamed %1 Zmieniłeś nazwę %1 - + You deleted %1 Usunąłeś %1 - + You created %1 Utworzyłeś %1 - + You changed %1 Zmieniłeś %1 - + Synced %1 Zsynchronizowano %1 @@ -5249,30 +5563,106 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Oznacz jako przeczytane + + ShareDelegate + + + Create a new share link + Utwórz nowy link udostępnienia + + + + Copy share link location + Skopiuj lokalizację linku udostępniania + + + + Share options + Opcje udostępniania + + + + ShareDetailsPage + + + An error occurred setting the share password. + Wystąpił błąd podczas ustawiania hasła udostępniania. + + + + Edit share + Edytuj udostępnianie + + + + Dismiss + Odrzuć + + + + Share label + Udostępnij etykietę + + + + Allow editing + Zezwalaj na edytowanie + + + + Password protect + Zabezpiecz hasłem + + + + Set expiration date + Ustaw datę wygaśnięcia + + + + Note to recipient + Notatka dla odbiorcy + + + + Unshare + Zatrzymaj udostępnianie + + + + Add another link + Dodaj kolejny link + + + + Copy share link + Skopiuj link udostępniania + + ShareView - + Password required for new share Hasło wymagane do nowego udostępnienia - + Share password Udostępnij hasło - + Sharing is disabled Udostępnianie jest wyłączone - + This item cannot be shared. Nie można udostępnić tego elementu. - + Sharing is disabled. Udostępnianie jest wyłączone. @@ -5288,7 +5678,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł SyncJournalDb - + Failed to connect database. Nie udało się połączyć z bazą danych. @@ -5346,6 +5736,22 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Wczytaj więcej wyników + + UnifiedSearchResultNothingFound + + + No results for + Brak wyników dla + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Sekcja wyników wyszukiwania %1 + + UserLine @@ -5409,67 +5815,67 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł UserStatusSelector - + Online status Status online - + Online Online - + Away Bezczynny - + Do not disturb Nie przeszkadzać - + Mute all notifications Wycisz wszystkie powiadomienia - + Invisible Niewidoczny - + Appear offline Widnieje jako offline - + Status message Komunikat statusu - + What is your status? Jaki jest Twój status? - + Clear status message after Wyczyść komunikat statusu po - + Cancel Anuluj - + Clear status message Wyczyść komunikat statusu - + Set status message Ustaw komunikat statusu @@ -5553,24 +5959,24 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Window - + Nextcloud desktop main dialog Główne okno pulpitu Nextcloud - + Current account Bieżące konto - - + + Resume sync for all Wznów synchronizację dla wszystkich - - + + Pause sync for all Wstrzymaj synchronizację dla wszystkich @@ -5580,22 +5986,22 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Ustaw status użytkownika - + Add account Dodaj konto - + Add new account Dodaj nowe konto - + Settings Ustawienia - + Exit Wyjście @@ -5604,11 +6010,6 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Current user avatar Aktualny awatar użytkownika - - - Current account avatar - Aktualny awatar konta - Current user status is online @@ -5620,70 +6021,75 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł Aktualny status użytkownika to "Nie przeszkadzać" - + + Current account avatar + Aktualny awatar konta + + + Current account status is online Aktualny status konta to "Online" - + Current account status is do not disturb Aktualny status konta to "Nie przeszkadzać" - + + %1 - File activity + %1 — Aktywność pliku + + + Account switcher and settings menu Przełączenie konta i menu ustawień - + Open local folder of current account Otwórz katalog lokalny bieżącego konta - + Connected Połączony - + Disconnected Rozłączony - + Open Nextcloud Talk in browser Otwórz Nextcloud Talk w przeglądarce - + More apps Więcej aplikacji - + Open %1 in browser Otwórz %1 w przeglądarce - + Unified search results list Ujednolicona lista wyników wyszukiwania - - - %1 - File activity - %1 — Aktywność pliku - main.cpp - + System Tray not available Systemowy pasek nie dostępny - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 wymaga działającego zasobnika systemowego. Jeśli korzystasz z XFCE, postępuj zgodnie <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">z tymi instrukcjami</a>. W przeciwnym razie zainstaluj aplikację zasobnika systemowego, taką jak "trayer" i spróbuj ponownie. @@ -5691,7 +6097,7 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Zbudowany na podstawie wersji Git <a href="%1">%2</a> na %3, %4 przy użyciu Qt %5, %6</small></p> @@ -5725,72 +6131,77 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł + Server version downloaded, copied changed local file into case conflict conflict file + Pobrano wersję z serwera, skopiowano zmieniony plik lokalny do konfliktu niezgodności pliku + + + Deleted Usunięto - + Moved to %1 Przeniesione do %1 - + Ignored Ignorowany - + Filesystem access error Błąd dostępu do systemu plików - + Error Błąd - + Updated local metadata Zaktualizowano lokalne metadane - + Unknown Nieznany - + downloading pobiernie - + uploading przesyłanie - + deleting usuwanie - + moving przenoszenie - + ignoring ignorowanie - + error błąd - + updating local metadata aktualizacja lokalnych metadanych diff --git a/translations/client_pt.ts b/translations/client_pt.ts index 3da808232..a31403778 100644 --- a/translations/client_pt.ts +++ b/translations/client_pt.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Abrir %1 localmente - + In %1 Em %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostrar mais ações @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Dispensar + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista de atividades @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Mover para o lixo não está implementado neste sistema - + Error removing "%1": %2 Erro ao remover "%1": %2 - + Could not remove folder "%1" Não foi possível remover a pasta "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Nenhuma conta configurada. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Ativar a encriptação - + + End-to-end encryption has been enabled for this account + + + + Warning Aviso - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Abrir pasta - + Encrypt Encriptar - - + + Edit Ignored Files Editar Ficheiros Ignorados - - + + Create new folder - - + + Availability Disponibilidade - + Choose what to sync Escolher o que sincronizar - + Force sync now Forçar a sincronização - + Restart sync Retomar sincronização - + Resume sync Retomar sincronização - + Pause sync Pausar sincronização - + Remove folder sync connection Remover ligação de sincronização de pasta - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) (experimental) - + Folder creation failed Não foi possível criar a pasta - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar Remoção da Ligação de Sincronização de Pasta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Deseja mesmo parar a sincronização da pasta <i>%1</i>?</p><p><b>Nota:</b> isto <b>não</b> irá eliminar qualquer ficheiro.</p> - + Remove Folder Sync Connection Remover Ligação da Sincronização de Pasta - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support Desativar suporte @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronização em Execução - + The syncing operation is running.<br/>Do you want to terminate it? A operação de sincronização está em execução.<br/>Deseja terminá-la? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 em utilização. Algumas pastas, incluindo a rede montada ou as pastas partilhadas, podem ter limites diferentes. - + %1 of %2 in use %1 de %2 em utilização - + Currently there is no storage usage information available. Atualmente não está disponível nenhuma informação da utilização do armazenamento. - + %1 in use %1 em utilização - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Ligado a %1. - + Server %1 is temporarily unavailable. O servidor %1 está temporariamente indisponível. - + Server %1 is currently in maintenance mode. O Servidor %1 encontra-se em manutenção - + Signed out from %1. Terminou a sessão de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. A obter autorização do browser <a href='%1'>Clique aqui</a> para reabrir o browser - + Connecting to %1 … A ligar a %1 … - + No connection to %1 at %2. Sem ligação para %1 em %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. %1 sem ligação configurada. - + There are folders that were not synchronized because they are too big: Existem pastas que não foram sincronizadas por serem demasiado grandes: - + There are folders that were not synchronized because they are external storages: Existem pastas que não foram sincronizadas por serem armazenamento externo: - + There are folders that were not synchronized because they are too big or external storages: Existem pastas que não foram sincronizadas por serem demasiado grandes ou armazenamento externo: - + Confirm Account Removal Confirmar Remoção da Conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Deseja mesmo remover a ligação da conta <i>%1</i>?</p><p><b>Nota:</b> isto <b>não</b> irá eliminar quaisquer ficheiros.</p> - + Remove connection Remover ligação - - + This account supports end-to-end encryption Esta conta suporta encriptação ponto-a-ponto - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Sair - + Continue Continuar - + Error accessing the configuration file Erro a aceder ao ficheiro de configuração @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. Ocorreu um erro enquanto se acedia ao ficheiro de configuração em %1. Por favor tenha a certeza que o ficheiro pode ser acedido pelo seu utilizador. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Sair do %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Erro ao gravar os metadados para a base de dados @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. Por favor, insira a sua palavra-passe de encriptação %1:<br><br>Utilizador: %2<br>Conta: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Introduza palavra passe E2E @@ -1191,8 +1425,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1200,27 +1434,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1228,83 +1462,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1312,7 +1546,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1441,145 +1675,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. A pasta local %1 não existe. - + %1 should be a folder but is not. %1 deveria ser uma pasta, mas não é. - + %1 is not readable. %1 não é legível. - + %1 and %n other file(s) have been removed. '%1' e %n outro(s) ficheiro(s) foram removidos'%1' e %n outros ficheiros foram removidos.'%1' e %n outros ficheiros foram removidos. - + %1 has been removed. %1 names a file. %1 foi removido. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 e %n outro ficheiro foram actualizados.%1 e %n outros ficheiros foram actualizados.%1 e %n outros ficheiros foram actualizados. - + %1 has been updated. %1 names a file. %1 foi atualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 foi renomeado para %2 e %n outro ficheiro foi renomeado.%1 foi renomeado para %2 e %n outros ficheiros foram renomeados.%1 foi renomeado para %2 e %n outros ficheiros foram renomeados. - + %1 has been renamed to %2. %1 and %2 name files. %1 foi renomeado para %2 - + %1 has been moved to %2 and %n other file(s) have been moved. %1 foi movido para %2 e %n outro ficheiro foi movido.%1 foi movido para %2 e %n outros ficheiros foram movidos.%1 foi movido para %2 e %n outros ficheiros foram movidos. - + %1 has been moved to %2. %1 foi movido para %2 - + %1 has and %n other file(s) have sync conflicts. %1 tem e %n outro ficheiro têm problemas de sincronização.%1 tem e %n outros ficheiros têm problemas de sincronização.%1 tem e %n outros ficheiros têm problemas de sincronização. - + %1 has a sync conflict. Please check the conflict file! %1 tem um problema de sincronização. Por favor, verifique o ficheiro com conflito! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 e %n outro ficheiro não podem ser sincronizados devido a erros. Consulte o registo de eventos para mais detalhes.%1 e %n outros ficheiros não podem ser sincronizados devido a erros. Consulte o registo de eventos para mais detalhes.%1 e %n outros ficheiros não podem ser sincronizados devido a erros. Consulte o registo de eventos para mais detalhes. - + %1 could not be synced due to an error. See the log for details. Não foi possível sincronizar %1 devido a um erro. Consulte o registo para detalhes. - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. %1 está atualmente bloqueado. - + Sync Activity Atividade de Sincronização - + Could not read system exclude file Não foi possível ler o ficheiro excluir do sistema - + A new folder larger than %1 MB has been added: %2. Foi adicionada uma nova pasta maior que %1 MB: %2. - + A folder from an external storage has been added. Foi adicionada uma pasta vinda de armazenamento externo. - + Please go in the settings to select it if you wish to download it. Por favor, vá às definições para a selecionar, se desejar transferi-la. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. A pasta% 1 foi criada, mas foi excluída da sincronização anteriormente. Os dados dentro dela não serão sincronizados. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. A pasta% 1 foi criada, mas foi excluída da sincronização anteriormente. Não será sincronizada. - + 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). @@ -1588,7 +1822,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1596,24 +1830,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Remover todos os ficheiros? - + Remove all files Remover todos os ficheiros - + Keep files Manter ficheiros @@ -1649,22 +1883,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Não foi possível reiniciar o estado da pasta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (cópia de segurança) - + (backup %1) (cópia de segurança %1) @@ -1674,27 +1908,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado indefinido. - + Undefined state. - + Waiting to start syncing. A aguardar para iniciar a sincronização. - + Preparing for sync. A preparar para sincronizar. - + Sync is running. A sincronização está em execução. - + Sync finished with unresolved conflicts. @@ -1714,62 +1948,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Abortado pelo utilizador. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. A sincronização está pausada. - + %1 (Sync is paused) %1 (A sincronização está pausada) - + No valid folder selected! Não foi selecionada nenhuma pasta válida! - + The selected path does not exist! - + The selected path is not a folder! O caminho selecionado não é uma pasta! - + You have no permission to write to the selected folder! Não tem permissão para gravar para a pasta selecionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! A pasta local %1 já contém uma pasta utilizada numa ligação de sincronização de pasta. Por favor, escolha outra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! A pasta local %1 já contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra! - + There is already a sync from the server to this local folder. Please pick another local folder! Já existe uma sincronização do servidor para esta pasta local. Por favor escolha outra pasta local! @@ -1782,7 +2016,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Adicionar Ligação de Sincronização de Pasta - + File Ficheiro @@ -1790,152 +2024,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Precisa de estar ligado para adicionar uma pasta - + Click this button to add a folder to synchronize. Clique neste botão para adicionar uma pasta para sincronizar. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Erro durante o carregamento da lista de pastas a partir do servidor. - + Fetching folder list from server … - + There are unresolved conflicts. Click for details. Há conflitos por resolver. Clique para detalhes. - + Virtual file support is enabled. - + Signed out Sessão terminada - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Reconciliar alterações - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" A sincronizar %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) transferir %s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) enviar %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 restante, %1 de %2, ficheiro %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, ficheiro %3 de %4 - + file %1 of %2 ficheiro %1 de %2 - + Waiting … A aguardar... - + Waiting for %n other folder(s) … - + Preparing to sync … @@ -2166,13 +2404,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2224,59 +2462,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Notificações do Servidor que requerem atenção. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel Cancelar - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2284,22 +2522,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error Erro de partilha - + Could not retrieve or create the public link share. Error: %1 @@ -2535,6 +2773,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Fechar + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2867,60 +3110,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Pasta de Sincronização Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! Não existe espaço disponível na pasta local! @@ -2992,7 +3235,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3024,144 +3268,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Ligado com sucesso a %1: %2 - versão: %3 (%4)</font><br/><br/> - + Invalid URL URL inválido - + Failed to connect to %1 at %2:<br/>%3 Não foi possível ligar a %1 em %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Tempo expirou enquanto tentava ligar a %1 em %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acesso proibido pelo servidor. Para verificar que tem o acesso adequado, <a href="%1">clique aqui</a> para aceder ao serviço com o seu navegador. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> A pasta de sincronização local %1 já existe, a configurar para sincronizar.<br/><br/> - + Creating local sync folder %1 … - + OK OK - + failed. Falhou. - + Could not create local folder %1 Não foi possível criar a pasta local %1 - + No remote folder specified! Não foi indicada a pasta remota! - + Error: %1 Erro: %1 - + creating folder on Nextcloud: %1 a criar a pasta na Nextcloud: %1 - + Remote folder %1 created successfully. Criação da pasta remota %1 com sucesso! - + The remote folder %1 already exists. Connecting it for syncing. A pasta remota %1 já existe. Ligue-a para sincronizar. - - + + The folder creation resulted in HTTP error code %1 A criação da pasta resultou num erro HTTP com o código %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> A criação da pasta remota falhou, provavelmente por ter introduzido as credenciais erradas.<br/>Por favor, verifique as suas credenciais.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">A criação da pasta remota falhou, provavelmente por ter introduzido as credenciais erradas.</font><br/>Por favor, verifique as suas credenciais.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. A criação da pasta remota %1 falhou com o erro <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. A sincronização de %1 com a pasta remota %2 foi criada com sucesso. - + Successfully connected to %1! Conectado com sucesso a %1! - + Connection to %1 could not be established. Please check again. Não foi possível ligar a %1 . Por Favor verifique novamente. - + Folder rename failed Erro ao renomear a pasta - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Pasta de sincronização local %1 criada com sucesso!</b></font> @@ -3184,12 +3428,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? Ativar funcionalidade experimental? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3200,12 +3444,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3234,162 +3478,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size tamanho - + permission permissão - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3397,22 +3646,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3425,19 +3674,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery O ficheiro alterou-se desde a sua descoberta - + Could not delete file record %1 from local DB @@ -3448,32 +3697,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Não é possível transferir o ficheiro %1 devido a um conflito com o nome de ficheiro local! - + The download would reduce free local disk space below the limit A transferência iria reduzir o espaço livre local acima do limite - + Free space on disk is less than %1 O Espaço livre no disco é inferior a %1 - + File was deleted from server O ficheiro foi eliminado do servidor - + The file could not be downloaded completely. Não foi possível transferir o ficheiro na totalidade. - + The downloaded file is empty, but the server said it should have been %1. @@ -3483,18 +3732,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Ficheiro %1 não pode ser guardado devido à existência de um ficheiro local com o mesmo nome. - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3515,7 +3769,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 Não foi possivel eliminar o ficheiro %1, erro: %2 @@ -3526,16 +3780,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3543,7 +3802,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Nao foi possivel remover %1 devido a conflito local com nome de ficheiro @@ -3556,46 +3815,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3616,7 +3880,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3629,12 +3893,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Código HTTP errado devolvido pelo servidor. Esperado 201, mas foi recebido "%1 %2". - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3642,42 +3906,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código HTTP errado devolvido pelo servidor. Esperado 201, mas foi recebido "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Erro ao escrever a meta-informação par a base de dados @@ -3867,7 +4131,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3885,23 +4149,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Definições - + %1 Settings This name refers to the application name e.g Nextcloud - + General Geral - + Network Rede - + Account Conta @@ -3909,17 +4173,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3995,7 +4264,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4004,132 +4273,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Partilha do menu de contexto - + Select new location … - + I shared something with you Partilhei alguma coisa consigo - - + + Share options Opções de partilha - - + + Activity Atividade - + Copy private link to clipboard Copiar link privado para a área de transferência - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Voltar a partilhar não é permitido - + Resharing this folder is not allowed - - + + Copy public link Copiar link publico - + Copy internal link Copiar ligação interna - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Editar - + Open in browser Abrir no navegador - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Eliminar @@ -4347,63 +4653,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (ignorado devido a erro anterior, tentando novamente em %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Conflito por resolver. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Apenas %1 estão disponíveis, é preciso um mínimo de %2 para começar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Não foi possível abrir ou criar a base de dados de sincronização local. Verifique se tem acesso de gravação na pasta de sincronização. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Não foi possível ler a lista negra a partir da base de dados local - + Unable to read from the sync journal. Não foi possível ler a partir do jornal de sincronização. - + Cannot open the sync journal Impossível abrir o jornal de sincronismo @@ -4413,12 +4719,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. O espaço em disco é baixo: foram ignoradas as transferências que reduziriam o espaço abaixo de %1. - + There is insufficient space available on the server for some uploads. Não há espaço livre suficiente no servidor para alguns uploads. @@ -4487,59 +4793,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Adicionar conta - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Configurações - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4547,24 +4853,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versão %1. Para mais informação por favor clique <a href='%2'>aqui</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Esta versão foi fornecida por %1</p> @@ -4572,22 +4878,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4595,30 +4901,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel Cancelar @@ -4756,8 +5068,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4765,8 +5077,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4864,123 +5176,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Versão de servidor não suportada - + 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. - + Disconnected Desligado - + Disconnected from some accounts Desconectado de algumas contas - + Disconnected from %1 Desconetado de %1 - + Disconnected from accounts: Desconetado das contas: - + Account %1: %2 Conta %1: %2 - + Please sign in Por favor inicie a sessão - + Signed out Sessão terminada - + Account synchronization is disabled A sincronização de contas está desactivada - - + + Synchronization is paused Sincronização em pausa - + Folder %1: %2 Pasta %1: %2 - + Unresolved conflicts Conflitos por resolver - + Up to date Atualizado - + Error during synchronization Erro durante a sincronização - + There are no sync folders configured. Não há pastas de sincronização configurado. - + No sync folders configured Não há pastas de sincronização configuradas - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 A sincronizar %1 de %2 - + Syncing %1 (%2 left) A sincronizar %1 (%2 em falta) - + Syncing %1 A sincronizar %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5132,27 +5444,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5218,30 +5530,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5257,7 +5645,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5315,6 +5703,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5378,67 +5782,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5522,24 +5926,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Conta atual - - + + Resume sync for all - - + + Pause sync for all @@ -5549,22 +5953,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Adicionar conta - + Add new account - + Settings Configurações - + Exit Sair @@ -5573,11 +5977,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5589,70 +5988,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Ligado - + Disconnected Desligado - + Open Nextcloud Talk in browser - + More apps Mais apps - + Open %1 in browser Abrir %1 no navegador - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Barra de sistema indisponível - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5660,7 +6064,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Construido a partir da revisão Git <a href="%1">%2</a> em %3, %4 usando Qt %5, %6</small></p> @@ -5694,72 +6098,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Apagado - + Moved to %1 Movido para %1 - + Ignored Ignorado. - + Filesystem access error Erro ao acesso do sistema de ficheiros - + Error Erro - + Updated local metadata Metadados locais atualizados - + Unknown Desconhecido - + downloading a transferir - + uploading a enviar - + deleting a apagar - + moving a mover - + ignoring ignorado - + error erro - + updating local metadata a atualizar metadados locais diff --git a/translations/client_pt_BR.ts b/translations/client_pt_BR.ts index 4ba007808..e46bddaf3 100644 --- a/translations/client_pt_BR.ts +++ b/translations/client_pt_BR.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Abrir %1 localmente - + In %1 Em %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Mostrar mais ações @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Dispensar + + + Open file details + Abrir detalhes do arquivo + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista de atividades @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Limpar menu de mensagem de status @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Dispensar + + + Activity Atividade - + Sharing Compartilhando @@ -226,12 +236,12 @@ Mover para a lixeira não está implementada nesta plataforma - + Error removing "%1": %2 Erro ao remover "%1": %2 - + Could not remove folder "%1" Não foi possível remover a pasta "%1" @@ -321,7 +331,7 @@ Código HTTP incorreto devolvido pelo servidor. Esperado 204, mas recebido "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Falha ao desbloquear a pasta criptografada %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Arquivo %1 está bloqueado por %2. - + Lock operation on %1 failed with error %2 Bloquear operações em %1 falhou com o erro %2 - + Unlock operation on %1 failed with error %2 Desbloquear operações em %1 falhou com o erro %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Cancelar @@ -400,14 +410,14 @@ Parece que o recurso Arquivos Virtuais está ativado nesta pasta. No momento, não é possível baixar implicitamente arquivos virtuais criptografados de ponta a ponta. Para obter a melhor experiência com arquivos virtuais e criptografia de ponta a ponta, certifique-se de que a pasta criptografada esteja marcada com "Tornar sempre disponível localmente". - + End-to-end Encryption with Virtual Files Criptografia Ponta a Ponta com Arquivos Virtuais - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". - + Parece que o recurso Arquivos virtuais está ativado nesta pasta. No momento, não é possível baixar implicitamente arquivos virtuais criptografados de ponta a ponta. Para obter a melhor experiência com arquivos virtuais e criptografia de ponta a ponta, certifique-se de que a pasta criptografada esteja marcada com "Tornar sempre disponível localmente". @@ -415,29 +425,29 @@ Não criptografar pasta - + Do not encrypt folder Não criptografar pasta - + Encrypt folder Criptografar pasta - + No account configured. Nenhuma conta configurada. - - Display mnemonic - Mostrar mnemônico + + Disable encryption + Desativar criptografia - End-to-end encryption has been enabled for this account - Criptografia Ponta a Ponta foi habilitado para essa conta + Display mnemonic + Mostrar mnemônico @@ -445,19 +455,24 @@ Ativar criptografia - + + End-to-end encryption has been enabled for this account + Criptografia Ponta a Ponta foi habilitado para essa conta + + + Warning Aviso - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? Criptografia Ponta a Ponta não está configurada para este dispositivo. Quando estiver, você poderá criptografar esta pasta. Você gostaria de configurar a criptografia ponta a ponta? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Você não pode criptografar uma pasta com o conteúdo. Remova os arquivos. @@ -470,121 +485,121 @@ Aguarde a nova sincronização e criptografe-a. Esta conta é compatível com criptografia de ponta a ponta - + Encryption failed A criptografia falhou - + Could not encrypt folder because the folder does not exist anymore Não foi possível criptografar a pasta porque ela não existe mais - - + + Open folder Abrir pasta - + Encrypt Criptografar - - + + Edit Ignored Files Editar arquivos a ignorar - - + + Create new folder Criar nova pasta - - + + Availability Disponibilidade - + Choose what to sync Escolher o que sincronizar - + Force sync now Forçar sincronização agora - + Restart sync Reiniciar a sincronização - + Resume sync Retomar sincronização - + Pause sync Pausar sincronização - + Remove folder sync connection Remover conexão de sincronização de pastas - + Disable virtual file support … Desativar suporte a arquivo virtual... - + Enable virtual file support %1 … Habilitar suporte de arquivo virtual %1 … - + (experimental) (experimental) - + Folder creation failed Falha na criação da pasta - + <p>Could not create local folder <i>%1</i>.</p> <p>Não foi possível criar a pasta local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmar a Remoção da Sincronização de Pasta - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Deseja realmente parar a sincronização desta pasta <i>%1</i>?</p><p><b>Nota:</b> Isto <b>não</b> vai excluir qualquer arquivo.</p> - + Remove Folder Sync Connection Remover conexão de sincronização de pasta - + Disable virtual file support? Desativar suporte a arquivo virtual? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,155 +612,187 @@ A única vantagem de desativar o suporte a arquivos virtuais é que o recurso de Esta ação irá cancelar qualquer sincronização atualmente em execução. - + Disable support Desativar suporte End-to-End encryption mnemonic - + Mnemônico de criptografia de ponta a ponta - + End-to-end encryption mnemonic - + Mnemônico da criptografia ponta a ponta - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + Para proteger sua identidade criptográfica, nós a criptografamos com um mnemônico de 12 palavras do dicionário. Por favor, anote-os e mantenha-os seguros. Eles serão necessários para adicionar outros dispositivos à sua conta (como seu celular ou computador) + + + + Disable end-to-end encryption + Desative a criptografia de ponta a ponta + + + + Disable end-to-end encryption for %1? + Desative a criptografia de ponta a ponta para %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + A remoção da criptografia de ponta a ponta removerá os arquivos criptografados localmente sincronizados.<br>Os arquivos criptografados permanecerão no servidor. - + Sync Running Sincronização ocorrendo - + The syncing operation is running.<br/>Do you want to terminate it? A operação de sincronização está ocorrendo.<br/>Deseja finalizá-la? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 em uso. Algumas pastas, incluindo as montadas na rede ou pastas compartilhadas, podem ter limites diferentes. - + %1 of %2 in use %1 de %2 em uso - + Currently there is no storage usage information available. Atualmente, não há informação disponível do uso de armazenamento. - + %1 in use %1 em uso - + %1 as %2 %1 como %2 - + The server version %1 is unsupported! Proceed at your own risk. A versão do servidor %1 não é suportada! Prossiga por sua própria conta e risco. - + Connected to %1. Conectado a %1. - + Server %1 is temporarily unavailable. O servidor %1 está temporariamente indisponível. - + Server %1 is currently in maintenance mode. O servidor %1 está em modo de manutenção. - + Signed out from %1. Desconectado de %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Obtendo autorização do navegador. <a href='%1'>Clique aqui</a> para reabrir o navegador. - + Connecting to %1 … Conectando a %1 … - + No connection to %1 at %2. Sem conexão para %1 em %2. - + Server configuration error: %1 at %2. Erro na configuração do servidor: %1 em %2. - + No %1 connection configured. Nenhuma conexão %1 configurada. - + There are folders that were not synchronized because they are too big: Existem pastas que não foram sincronizadas porque são muito grandes: - + There are folders that were not synchronized because they are external storages: Existem pastas que não foram sincronizadas porque são armazenamentos externos: - + There are folders that were not synchronized because they are too big or external storages: Existem pastas que não foram sincronizadas porque são muito grandes ou são armazenamentos externos: - + Confirm Account Removal Confirmar a Remoção da Conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Deseja realmente remover a conexão desta conta<i>%1</i>?</p><p><b>Nota:</b> Isto <b>não</b> irá excluir nenhum arquivo.</p> - + Remove connection Remover conexão - - + This account supports end-to-end encryption Esta conta suporta criptografia de ponta-a-ponta - + Set up encryption Configurar criptografia - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + A criptografia de ponta a ponta foi habilitada nesta conta com outro dispositivo.<br>Ele pode ser ativado neste dispositivo inserindo seu mnemônico.<br>Isso permitirá a sincronização de pastas criptografadas existentes. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + A solicitação autenticada para o servidor foi redirecionada para "%1". O URL está incorreto, o servidor está configurado incorretamente. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Acesso proibido pelo servidor. Para verificar se você tem acesso adequado, <a href="%1">clique aqui</a> para acessar o serviço com seu navegador. + + + + There was an invalid response to an authenticated WebDAV request + Houve uma resposta inválida para uma solicitação autenticada do WebDAV @@ -799,7 +846,7 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução. OCC::ActivityListModel - + For more activities please open the Activity app. Para mais atividades, abra o aplicativo Atividade. @@ -809,12 +856,12 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução.Buscando atividades… - + Fetching activities … Buscando atividades… - + Files from the ignore list as well as symbolic links are not synced. Arquivos da lista de ignorados e links simbólicos não são sincronizados. @@ -865,32 +912,59 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Continuar significa <b>excluir essas configuracões</b>. - + Continuing will mean <b>ignoring these settings</b>. Continuar significa <b>ignorar essas configuraçães</b>. - + 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>. Algumas configurações foram definidas em versões mais recentes deste cliente e usam recursos que não estão disponíveis nesta versão. <br><br>%1<br><br>O arquivo de configuração atual já foi copiado para <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Sair - + Continue Continuar - + Error accessing the configuration file Erro acessando o arquivo de configuração @@ -900,12 +974,12 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução.Houve um erro ao acessar o arquivo de configuração em % 1. Certifique-se que o arquivo pode ser acessado pelo seu usuário. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Ocorreu um erro ao acessar o arquivo de configuração em %1. Certifique-se de que o arquivo pode ser acessado por sua conta do sistema. - + Quit %1 Sair %1 @@ -951,56 +1025,216 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução.O arquivo %1 possui data/hora de modificação inválida. Não enviar ao servidor. - + File Removed (start upload) %1 Arquivo removido (iniciar envio) %1 - + File %1 has invalid modification time. Do not upload to the server. O arquivo %1 tem hora de modificação inválida. Não envie para o servidor. - + Local file changed during syncing. It will be resumed. Arquivo local alterado durante a sincronização. Será retomado. - - + + Local file changed during sync. Arquivo local alterado durante a sincronização. - + Network error: %1 Erro de rede: %1 - + Error updating metadata: %1 Erro ao atualizar metadados: %1 - + The file %1 is currently in use O arquivo %1 está atualmente em uso - + The local file was removed during sync. O arquivo local foi removido durante a sincronização. - + Restoration failed: %1 Falha na restauração: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Não é possível renomear o arquivo porque já existe um arquivo com o mesmo nome no servidor. Escolha outro nome. + + + + Could not rename file. Please make sure you are connected to the server. + Não foi possível renomear o arquivo. Verifique se você está conectado ao servidor. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Você não tem permissão para renomear este arquivo. Por favor, peça ao autor do arquivo para renomeá-lo. + + + + Failed to fetch permissions with error %1 + Falha ao buscar permissões com erro %1 + + + + Filename contains leading and trailing spaces. + O nome do arquivo contém espaços iniciais e finais. + + + + Filename contains leading spaces. + O nome do arquivo contém espaços à esquerda. + + + + Filename contains trailing spaces. + O nome do arquivo contém espaços à direita. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Conflito de Clash Case + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + O arquivo não pôde ser sincronizado porque gera um conflito de caso com um arquivo existente neste sistema. + + + + Error + Erro + + + + Existing file + Arquivo existente + + + + file A + arquivo A + + + + fileA + arquivoA + + + + + today + hoje + + + + + 0 byte + 0 byte + + + + + Open existing file + Abrir arquivo existente + + + + Case clashing file + Arquivo de conflito de caso + + + + file B + arquivo B + + + + fileB + arquivoB + + + + + Open clashing file + Abrir arquivo conflitante + + + + Please enter a new name for the clashing file: + Insira um novo nome para o arquivo conflitante: + + + + New filename + Novo nome de arquivo + + + + Rename file + Novo nome de arquivo + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + O arquivo "%1" não pôde ser sincronizado devido a um conflito de conflito de caso com um arquivo existente neste sistema. + + + + %1 does not support equal file names with only letter casing differences. + %1 não oferece suporte a nomes de arquivo iguais apenas com diferenças de maiúsculas e minúsculas. + + + + Filename contains leading and trailing spaces. + O nome do arquivo contém espaços iniciais e finais. + + + + Filename contains leading spaces. + O nome do arquivo contém espaços à esquerda. + + + + Filename contains trailing spaces. + O nome do arquivo contém espaços à direita. + + + + Use invalid name + Usar nome inválido + + + + Filename contains illegal characters: %1 + O nome do arquivo contém caracteres ilegais: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Ocorreu um erro ao escrever metadados no banco de dados @@ -1018,12 +1252,12 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução.Insira a senha da criptografia de ponta-a-ponta:<br><br>Usuário: %2<br>Conta: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Digite sua senha de criptografia ponta a ponta:<br><br>Usuário: %2<br>Conta: %3<br> - + Enter E2E passphrase Digite a senha E2E @@ -1199,8 +1433,8 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Erro do servidor: a resposta PROPFIND não está formatada em XML! @@ -1208,27 +1442,27 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Erro ao abrir diretório %1 - + Directory not accessible on client, permission denied Diretório não acessível no cliente, permissão negada - + Directory not found: %1 Diretório não encontrado: %1 - + Filename encoding is not valid A codificação do nome do arquivo não é válida - + Error while reading directory %1 Erro enquanto lia o diretório %1 @@ -1236,91 +1470,91 @@ Esta ação irá cancelar qualquer sincronização atualmente em execução. OCC::EditLocallyJob - + Invalid token received. - + Token inválido recebido. - - - - - - + + + + + + Please try again. Por favor, tente novamente. - + Invalid file path was provided. O caminho do arquivo fornecido é inválido - + Could not find an account for local editing. Não foi possível encontrar uma conta para edição local. - - + + Could not validate the request to open a file from server. Não foi possível validar a solicitação para abrir um arquivo do servidor. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Não foi possível encontrar um arquivo para edição local. Certifique-se de que seu caminho seja válido e esteja sincronizado localmente. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Não foi possível encontrar um arquivo para edição local. Certifique-se de que não seja excluído por meio de sincronização seletiva. - + Server error: PROPFIND reply is not XML formatted! - + Erro no servidor: resposta PROPFIND não está formatado em XML! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Não foi possível encontrar um arquivo para edição local. Certifique-se de que seu caminho seja válido. - + Could not open %1 - + Não foi possível abrir %1 - + File %1 already locked. - + Arquivo %1 já está bloqueado. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Bloqueio vai durar por %1 minutos. Você também pode desbloquear este arquivo manualmente quando terminar de editar. - + File %1 now locked. - + Arquivo %1 bloqueado. - + File %1 could not be locked. - + Arquivo %1 não pode ser bloqueado. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Não foi possível gerar os metadados para criptografia, desbloqueando a pasta. @@ -1369,7 +1603,7 @@ Isso pode ser um problema com suas bibliotecas OpenSSL. Locked by %1 - Expires in %2 minute(s) remaining time before lock expires - + Bloqueado por %1 - Expira em %2 minuto(s)Bloqueado por %1 - Expira em %2 minuto(s)Bloqueado por %1 - Expira em %2 minuto(s) @@ -1450,145 +1684,145 @@ Isso pode ser um problema com suas bibliotecas OpenSSL. OCC::Folder - + Local folder %1 does not exist. A pasta local %1 não existe. - + %1 should be a folder but is not. %1 deveria ser uma pasta mas não é. - + %1 is not readable. %1 não pode ser lido. - + %1 and %n other file(s) have been removed. %1 e %n outro arquivo foram removidos.%1 e %n outros arquivos foram removidos.%1 e %n outros arquivos foram removidos. - + %1 has been removed. %1 names a file. %1 foi removido. - + %1 and %n other file(s) have been added. %1 e %n outro(s) arquivo(s) foram adicionados. %1 e %n outro arquivo foi adicionado. %1 e %n outro arquivo foi adicionado. - + %1 has been added. %1 names a file. %1 foi adicionado. - + %1 and %n other file(s) have been updated. %1 e %n outro arquivo foram atualizados.%1 e %n outros arquivos foram atualizados.%1 e %n outros arquivos foram atualizados. - + %1 has been updated. %1 names a file. %1 foi atualizado. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 foi renomeado para %2 e %n outro arquivo foi renomeado.%1 foi renomeado para %2 e %n outros arquivos foram renomeados.%1 foi renomeado para %2 e %n outros arquivos foram renomeados. - + %1 has been renamed to %2. %1 and %2 name files. %1 foi renomeado para %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 foi movido para %2 e %n outro arquivo foi movido.%1 foi movido para %2 e %n outros arquivos foram movidos.%1 foi movido para %2 e %n outros arquivos foram movidos. - + %1 has been moved to %2. %1 foi movido para %2. - + %1 has and %n other file(s) have sync conflicts. %1 tem e %n outro arquivo têm conflitos na sincronização.%1 tem e %n outros arquivos têm conflitos na sincronização.%1 tem e %n outros arquivos têm conflitos na sincronização. - + %1 has a sync conflict. Please check the conflict file! %1 tem um conflito na sincronização. Verifique o arquivo conflitante! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 e %n outro arquivo não puderam ser sincronizados devido a erros. Veja o log para detalhes.%1 e %n outros arquivos não puderam ser sincronizados devido a erros. Veja o log para detalhes.%1 e %n outros arquivos não puderam ser sincronizados devido a erros. Veja o log para detalhes. - + %1 could not be synced due to an error. See the log for details. %1 não pôde ser sincronizado devido a um erro. Veja o log para obter detalhes. - + %1 and %n other file(s) are currently locked. %1 e %n outro(s) arquivo(s) estão atualmente bloqueado(s).%1 e %n outro(s) arquivo(s) estão atualmente bloqueado(s).%1 e %n outro(s) arquivo(s) estão atualmente bloqueado(s). - + %1 is currently locked. %1 está atualmente bloqueado. - + Sync Activity Atividade de Sincronização - + Could not read system exclude file Não foi possível ler o arquivo de exclusão do sistema - + A new folder larger than %1 MB has been added: %2. Uma nova pasta maior que %1 MB foi adicionada: %2 - + A folder from an external storage has been added. Uma pasta de um armazenamento externo foi adicionada. - + Please go in the settings to select it if you wish to download it. Por favor, vá às configurações para selecioná-la se desejar baixá-la. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. A pasta %1 foi criada, mas foi excluída da sincronização anteriormente. Dados dentro dela não serão sincronizados. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. O arquivo %1 foi criado, mas foi excluído da sincronização anteriormente. Não será sincronizado. - + 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). @@ -1601,7 +1835,7 @@ Isso significa que o cliente de sincronização pode não fazer upload de altera %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,24 +1846,24 @@ Se você decidir restaurar os arquivos, eles serão sincronizados novamente com Se você decidir excluir os arquivos, eles ficarão indisponíveis para você, a menos que você seja o proprietário. - + 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. Todos os arquivos em sua pasta de sincronização local "%1" foram excluídos. Essas exclusões serão sincronizadas com seu servidor, tornando esses arquivos indisponíveis a menos que sejam 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 sincronizados novamente a partir do servidor. - + Remove All Files? Remover todos os arquivos? - + Remove all files Remover todos os arquivos - + Keep files Manter arquivos @@ -1665,22 +1899,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Não foi possível redefinir o estado da pasta - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Um antigo diário de sincronização "%1" foi encontrado, mas não pôde ser removido. Certifique-se de que nenhum aplicativo o esteja usando no momento. - + (backup) (backup) - + (backup %1) (backup %1) @@ -1690,27 +1924,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Estado indefinido. - + Undefined state. Estado indefinido. - + Waiting to start syncing. À espera do início da sincronização. - + Preparing for sync. Preparando para a sincronização. - + Sync is running. A sincronização está ocorrendo. - + Sync finished with unresolved conflicts. Sincronização concluída com conflitos não resolvidos. @@ -1730,62 +1964,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Interrompido pelo Usuário. - + Last sync was successful. Última sincronização foi bem sucedida. - + Setup error. Erro de configuração. - + Sync request was cancelled. Pedido de sincronismo foi cancelado. - + Sync is paused. Sincronização pausada. - + %1 (Sync is paused) %1 (Pausa na sincronização) - + No valid folder selected! Nenhuma pasta válida selecionada! - + The selected path does not exist! O caminho selecionado não existe! - + The selected path is not a folder! O caminho selecionado não é uma pasta! - + You have no permission to write to the selected folder! Voce não tem permissão para escrita na pasta selecionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! A pasta local %1 já contém uma pasta utilizada numa ligação de sincronização de pasta. Por favor, escolha outra! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! A pasta local %1 já está contida em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra! - + There is already a sync from the server to this local folder. Please pick another local folder! Já existe uma sincronização do servidor para esta pasta local. Por favor, escolha outra pasta local! @@ -1798,7 +2032,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Adicionar conexão de sincronização de pasta - + File Arquivo @@ -1806,152 +2040,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Você precisa estar conectado para adicionar uma pasta - + Click this button to add a folder to synchronize. Clique nesse botão para adicionar uma pasta a sincronizar. - - + + Could not decrypt! + Não foi possível descriptografar! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Erro ao carregar a lista de pastas do servidor. - + Fetching folder list from server … Buscando a lista de pastas do servidor… - + There are unresolved conflicts. Click for details. Existem conflitos não resolvidos. Clique para detalhes. - + Virtual file support is enabled. O suporte a arquivos virtuais está habilitado. - + Signed out Desconectado - + Synchronizing VirtualFiles with local folder Sincronizando ArquivosVirtuais com a pasta local - + Synchronizing with local folder Sincronizando com a pasta local - + Checking for changes in remote "%1" Verificando mudanças no controle remoto "%1" - + Checking for changes in local "%1" Verificando se há mudanças no local "%1" - + Reconciling changes Reconciliando mudanças - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizando %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) baixar %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) enviar %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Alguns segundos restantes, %1 de %2, arquivo %3 de %4 - + %5 left, %1 of %2, file %3 of %4 %5 restando, %1 de %2, arquivo %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, arquivo %3 de %4 - + file %1 of %2 arquivo %1 de %2 - + Waiting … Esperando... - + Waiting for %n other folder(s) … Esperando por %n outras pasta(s)…Esperando por %n outras pasta(s)…Esperando por %n outras pasta(s)… - + Preparing to sync … Preparando para sincronizar... @@ -2182,13 +2420,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable estável - + beta beta @@ -2240,32 +2478,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Criar arquivamento de depuração - + Server notifications that require attention. Notificações do servidor que exigem atenção. - + Show call notification dialogs. Mostrar diálogos de notificação de chamada. - + You cannot disable autostart because system-wide autostart is enabled. Você não pode desativar a inicialização automática porque a inicialização automática em todo o sistema está ativada. - + Change update channel? Mudar canal de atualização? - + 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. 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. @@ -2274,27 +2512,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Observe que isso seleciona apenas quais upgrades de pool são retirados, e que não há downgrades: 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 que a beta instalada atualmente versão. - + Change update channel Mudar canal de atualização - + Cancel Cancelar - + Zip Archives Arquivos Zip - + Debug Archive Created Depurar arquivamento criado - + Debug archive is created at %1 Arquivo de depuração é criado às %1 @@ -2302,22 +2540,22 @@ Observe que isso seleciona apenas quais upgrades de pool são retirados, e que n OCC::GetOrCreatePublicLinkShare - + Password for share required É necessária uma senha de compartilhamento - + Please enter a password for your link share: Digite uma senha para seu link: - + Sharing error Erro de compartilhamento - + Could not retrieve or create the public link share. Error: %1 @@ -2555,6 +2793,11 @@ Os itens em que a exclusão é permitida serão excluídos se impedirem a remoç Close Fechar + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Direitos Autorais 2017-2023 Nextcloud GmbH<br />Direitos Autorais 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2889,60 +3132,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 Use os arquivos &virtuais em vez de baixar o conteúdo imediatamente %1 - + (experimental) (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Arquivos virtuais não são suportados como partição raiz do Windows como pasta local. Escolha uma subpasta válida na letra da unidade. - + %1 folder "%2" is synced to local folder "%3" %1 pasta "%2" está sincronizada com a pasta local "%3" - + Sync the folder "%1" Sincronizar a pasta "%1" - + Warning: The local folder is not empty. Pick a resolution! Aviso: A pasta local não está vazia. Escolha uma resolução! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 de espaço livre - + Virtual files are not available for the selected folder Os arquivos virtuais não estão disponíveis para a pasta selecionada - + Local Sync Folder Pasta de Sincronização Local - - + + (%1) (%1) - + There isn't enough free space in the local folder! Não há espaço livre na pasta local! @@ -3014,7 +3257,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Impossível obter a hora de modificação para o arquivo em conflito %1 @@ -3046,144 +3290,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Conectado com sucesso a %1: %2 versão %3 (%4)</font><br/><br/> - + Invalid URL URL inválida - + Failed to connect to %1 at %2:<br/>%3 Falhou ao conectar com %1 em %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Atingido o tempo limite ao tentar conectar com %1 em %2. - + Trying to connect to %1 at %2 … Tentando conectar em %1 às %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. A solicitação autenticada para o servidor foi redirecionada para "%1". O URL está incorreto, o servidor está configurado incorretamente. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Acesso proibido pelo servidor. Para verificar se você tem acesso adequado, <a href="%1">clique aqui</a> para acessar o serviço com seu navegador. - + There was an invalid response to an authenticated WebDAV request Houve uma resposta inválida para uma solicitação autenticada do WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Pasta de sincronização local %1 já existe, configurando-a para sincronização. <br/><br/> - + Creating local sync folder %1 … Criando pasta de sincronização local %1… - + OK OK - + failed. falhou. - + Could not create local folder %1 Não foi possível criar pasta local %1 - + No remote folder specified! Nenhuma pasta remota foi especificada! - + Error: %1 Erro: %1 - + creating folder on Nextcloud: %1 criando pasta no Nextcloud: %1 - + Remote folder %1 created successfully. Pasta remota %1 criada com sucesso. - + The remote folder %1 already exists. Connecting it for syncing. A pasta remota %1 já existe. Conectando-a para sincronizar. - - + + The folder creation resulted in HTTP error code %1 A criação da pasta resultou em um erro HTTP de código %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> A criação da pasta remota falhou porque as credenciais fornecidas estão erradas!<br/>Por favor, volte e verifique suas credenciais.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">A criação da pasta remota falhou provavelmente devido a credenciais incorretas</font><br/>Por favor, volte e verifique suas credenciais.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. A criação da pasta remota %1 falhou com erro <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Uma conexão de sincronização de %1 para o diretório remoto %2 foi realizada. - + Successfully connected to %1! Conectado com sucesso a %1! - + Connection to %1 could not be established. Please check again. A conexão a %1 não foi estabelecida. Por favor, verifique novamente. - + Folder rename failed Falha ao renomear pasta - + Cannot 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. Não foi possível remover e fazer o backup da pasta porque a pasta ou algum arquivo presente dentro desta pasta está aberto em outro programa. Por favor feche o arquivo ou a pasta e tente novamente ou cancele a operação. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Pasta de sincronização local %1 criada com sucesso!</b></font> @@ -3206,12 +3450,12 @@ Note that using any logging command line options will override this setting.Cancelar - + Enable experimental feature? Ativar recurso experimental? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3229,12 +3473,12 @@ Mudar para este modo abortará qualquer sincronização em execução. Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer problemas que surgirem. - + Enable experimental placeholder mode Ativar modo de marcador de posição experimental - + Stay safe Fique seguro @@ -3263,162 +3507,167 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Links simbólicos não são suportados na sincronização. - + File is listed on the ignore list. O arquivo está listado na lista de ignorados. - + File names ending with a period are not supported on this file system. File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. Nomes de arquivos contendo o caractere "%1" não são suportados neste sistema de arquivos. - + File name contains at least one invalid character O nome do arquivo contém pelo menos um caractere inválido - + The file name is a reserved name on this file system. O nome do arquivo é um nome reservado neste sistema de arquivos. - + Filename contains trailing spaces. O nome do arquivo contém espaços deixados para trás . - + Filename contains leading spaces. O nome do arquivo contém espaços antes. - + Filename contains leading and trailing spaces. O nome do arquivo contém espaços antes e depois. - + Filename is too long. O arquivo é muito grande. - + File/Folder is ignored because it's hidden. Arquivo/pasta será ignorado porque está oculto. - + Stat failed. Stat falhou. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Conflito: versão do servidor baixada, cópia local renomeada e não carregada. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Conflito de conflito de caso: arquivo do servidor baixado e renomeado para evitar conflitos. + + + The filename cannot be encoded on your file system. O nome do arquivo não pode ser codificado em seu sistema de arquivos. - + The filename is blacklisted on the server. O nome do arquivo está na lista negra do servidor. - + File has extension reserved for virtual files. O arquivo tem extensão reservada para arquivos virtuais. - + size tamanho - + permission permissão - + file id ID do arquivo - + Server reported no %1 Servidor relatou não %1 - + Cannot sync due to invalid modification time Não é possível sincronizar devido ao horário de modificação inválido - + Error while deleting file record %1 from the database Erro ao excluir o registro de arquivo %1 do banco de dados - + Conflict when uploading a folder. It's going to get cleared! Conflito ao enviar uma pasta. Vai ser limpa! - + Conflict when uploading a file. It's going to get removed! Conflito ao enviar um arquivo. Vai ser removido! - + Ignored because of the "choose what to sync" blacklist Ignorado devido à lista negra "escolher o que sincronizar" - + Not allowed because you don't have permission to add subfolders to that folder Não permitido porque você não tem permissão para adicionar subpastas a essa pasta - + Not allowed because you don't have permission to add files in that folder Não permitido porque você não tem permissão para adicionar arquivos nessa pasta - + Not allowed to upload this file because it is read-only on the server, restoring Não é permitido fazer upload deste arquivo porque ele é somente leitura no servidor, restaurando - + Moved to invalid target, restoring Movido para destino inválido, restaurando - + Not allowed to remove, restoring Não tem permissão para remover, restaurar - + Error while reading the database Erro ao ler o banco de dados - + Server replied with an error while reading directory "%1" : %2 O servidor respondeu com um erro ao ler o diretório "%1" : %2 @@ -3426,22 +3675,22 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::PropagateDirectory - + could not delete file %1 from local DB não foi possível eliminar o arquivo %1 do BD local - + Error updating metadata due to invalid modification time Erro ao atualizar os metadados devido a erro na data/hora modificada - + Error updating metadata: %1 Erro ao atualizar metadados: %1 - + File is currently in use O arquivo está atualmente em uso @@ -3454,19 +3703,19 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr não foi possível obter o arquivo %1 do BD local - + File %1 cannot be downloaded because encryption information is missing. O arquivo %1 não pode ser baixado porque está faltando informações de criptografia. - - + + File has changed since discovery O arquivo foi alterado desde a descoberta - + Could not delete file record %1 from local DB Não foi possível excluir o registro de arquivo %1 do BD local @@ -3477,32 +3726,32 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr O arquivo %1 não pode ser baixado devido a um conflito local no nome do arquivo! - + File %1 can not be downloaded because of a local file name clash! O arquivo %1 não pode ser baixado devido a um conflito local no nome do arquivo! - + The download would reduce free local disk space below the limit O download reduziria o espaço livre no disco local abaixo do limite - + Free space on disk is less than %1 O espaço livre no disco é inferior a %1 - + File was deleted from server O arquivo foi apagado do servidor - + The file could not be downloaded completely. O arquivo não pôde ser baixado completamente. - + The downloaded file is empty, but the server said it should have been %1. O arquivo baixado está vazio, mas o servidor disse que deveria ser %1. @@ -3512,18 +3761,23 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr O arquivo %1 não pôde ser salvo devido a um conflito com um nome de arquivo local! - - + + File %1 has invalid modified time reported by server. Do not save it. O arquivo %1 possui erro na data/hora modificada informado pelo servidor. Não salvar. - + + File %1 downloaded but it resulted in a local file name clash! + O arquivo %1 baixado, mas resultou em um confronto de nome de arquivo local! + + + Error updating metadata: %1 Erro ao atualizar metadados: %1 - + The file %1 is currently in use O arquivo %1 está correntemente em uso @@ -3544,7 +3798,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 não foi possível excluir o arquivo %1, erro: %2 @@ -3555,16 +3809,21 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr + Folder %1 cannot be created because of a local file or folder name clash! + A pasta %1 não pode ser criado devido a um conflito de nome de pasta ou arquivo local! + + + Could not create folder %1 Não foi possível criar a pasta %1 - + Error updating metadata: %1 Erro ao atualizar metadados: %1 - + The file %1 is currently in use O arquivo %1 está correntemente em uso @@ -3572,7 +3831,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Não foi possível remover %1 devido a um conflito com o nome de um arquivo local @@ -3585,46 +3844,51 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash O arquivo %1 não pode ser renomeada para %2 devido a um conflito com o nome de um arquivo local - - - + + File %1 downloaded but it resulted in a local file name clash! + O arquivo %1 baixado, mas resultou em um confronto de nome de arquivo local! + + + + + could not get file %1 from local DB não foi possível obter o arquivo %1 do BD local - + Error setting pin state Erro ao definir o estado do pin - - + + Error updating metadata: %1 Erro ao atualizar metadados: %1 - + The file %1 is currently in use O arquivo %1 está correntemente em uso - - + + Could not delete file record %1 from local DB Não foi possível excluir o registro de arquivo %1 do BD local - + Failed to propagate directory rename in hierarchy - + Falha ao propagar a renomeação do diretório na hierarquia - + Failed to rename file Falha ao renomear arquivo @@ -3645,7 +3909,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Código HTTP incorreto retornado pelo servidor. Esperado 204, mas recebido "%1 %2". @@ -3658,12 +3922,12 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Código HTTP errado retornado pelo servidor. 201 esperado, mas recebeu "%1 %2". - + Error writing metadata to the database: %1 Erro ao gravar metadados no banco de dados: %1 - + The file %1 is currently in use O arquivo %1 está atualmente em uso @@ -3671,42 +3935,42 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Não foi possível renomear %1 para %2, erro: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Código HTTP errado retornado pelo servidor. 201 esperado, mas recebeu "%1 %2". - + could not get file %1 from local DB Não foi possível excluir o registro de arquivo %1 do BD local - + Could not delete file record %1 from local DB Não foi possível excluir o registro de arquivo %1 do BD local - + Error updating metadata: %1 Erro ao atualizar metadados: %1 - + The file %1 is currently in use O arquivo %1 está correntemente em uso - + Error setting pin state Erro ao definir o estado do pin - + Error writing metadata to the database Ocorreu um erro ao escrever metadados no banco de dados @@ -3896,7 +4160,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::ServerNotificationHandler - + Reply Responder @@ -3914,23 +4178,23 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Configurações - + %1 Settings This name refers to the application name e.g Nextcloud Configurações de %1 - + General Geral - + Network Rede - + Account Conta @@ -3938,19 +4202,24 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::ShareModel - + Share link Compartilhar link - + Link share Link para compartilhar - + + Internal link + Link interno + + + Enter a note for the recipient - + Insira uma observação para o destinatário @@ -4024,7 +4293,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4033,132 +4302,171 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::SocketApi - + + Failed to encrypt folder at "%1" + Falha ao criptografar a pasta em "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + A conta %1 não tem criptografia de ponta a ponta configurada. Configure isso nas configurações da sua conta para habilitar a criptografia de pastas. + + + + Failed to encrypt folder + Falha ao criptografar a pasta + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Não foi possível criptografar a seguinte pasta: "%1". + +Servidor respondeu com erro: %2 + + + + Folder encrypted successfully + Pasta criptografada com sucesso + + + + The following folder was encrypted successfully: "%1" + A seguinte pasta foi criptografada com sucesso: "%1" + + + Context menu share Compartilhamento do menu de contexto - + Select new location … Selecionar novo local... - + I shared something with you Eu compartilhei algo com você - - + + Share options Opções de compartilhamento - - + + Activity Atividade - + Copy private link to clipboard Copiar link privado para a área de transferência - + Send private link by email … Enviar link privado por e-mail... + + + Expire in %1 minutes + remaining time before lock expire + Expira em %1 minutosExpira em %1 minutoExpira em %1 minuto + - + Leave this share - + Sair deste compartilhamento - + Resharing this file is not allowed Não é permitido recompartilhar este arquivo - + Resharing this folder is not allowed Compartilhar de novo esta pasta não é permitido - - + + Copy public link Copiar link público - + Copy internal link Copiar link interno - + + Encrypt + Criptografar + + + Lock file Bloquear arquivo - + Unlock file Desbloquear arquivo - + Locked by %1 Bloqueado por %1 - - Expire in %1 minutes - remaining time before lock expire - Expira em %1 minutosExpira em %1 minutoExpira em %1 minuto - - - + Expires in %1 minutes remaining time before lock expires Expira em 1% minutosExpira em 1% minutosExpira em 1% minutos - + Edit Editar - + Open in browser Abrir no navegador - + Resolve conflict … Resolver conflito… - + Move and rename … Mover e renomear... - + Move, rename and upload … Mova, renomeie e faça upload... - + Delete local changes Excluir alterações locais - + Move and upload … Mover e fazer upload... - + Delete Excluir @@ -4376,63 +4684,63 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (ignorado devido a um erro anterior, tentando novamente em %2) - + Could not update file: %1 Não foi possível atualizar o arquivo: %1 - + Could not update virtual file metadata: %1 Não foi possível atualizar os metadados do arquivo virtual: %1 - + Could not update file metadata: %1 - + Não foi possível atualizar os metadados do arquivo: %1 - + Could not set file record to local DB: %1 Não foi possível definir o registro do arquivo para o BD local: %1 - + Unresolved conflict. Conflito não solucionado. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Apenas %1 está disponível, é preciso pelo menos %2 para começar - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Não é possível abrir ou criar o banco de dados de sincronização local. Certifique-se de ter acesso de gravação na pasta de sincronização. - + Using virtual files with suffix, but suffix is not set Usando arquivos virtuais com sufixo, mas o sufixo não está definido - + Unable to read the blacklist from the local database Não é possível ler a lista negra do banco de dados local - + Unable to read from the sync journal. Não é possível ler a partir do journal de sincronização. - + Cannot open the sync journal Não é possível abrir o arquivo de sincronização @@ -4442,12 +4750,12 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr A sincronização será retomada em breve. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. O espaço em disco é pequeno: Os downloads que reduziriam o espaço livre abaixo de %1 foram ignorados. - + There is insufficient space available on the server for some uploads. Não há espaço disponível no servidor para alguns envios. @@ -4516,59 +4824,59 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::Systray - + Download Baixar - + Add account Adicionar conta - + Open main dialog Abrir a caixa de diálogo principal - - + + Pause sync Pausar sincronização - - + + Resume sync Continuar a sincronização - + Settings Configurações - + Help Ajuda - + Exit %1 Sair do %1 - + Pause sync for all Pausar a sincronização para todos - + Resume sync for all Continuar a sincronização para todos - + %1: %2 %1: %2 @@ -4576,24 +4884,24 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Cliente Desktop</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versão %1. Para mais informações clique <a href='%2'>aqui</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Usando o plugin de arquivos virtuais: %1</small></p> - + <p>This release was supplied by %1</p> <p>Esta versão foi fornecida por %1</p> @@ -4601,22 +4909,22 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Falha ao buscar provedores. - + Failed to fetch search providers for '%1'. Error: %2 Falha ao buscar provedores de pesquisa para '%1'. Erro: %2 - + Search has failed for '%2'. A pesquisa por '%2' falhou. - + Search has failed for '%1'. Error: %2 A pesquisa por '%1' falhou. Erro: %2 @@ -4624,30 +4932,36 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::User - + Retry all uploads Retentar todos os envios + + + + Resolve conflict + Resolver conflito + OCC::UserModel - + Confirm Account Removal Confirme a Exclusão da Conta - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Quer realmente excluir a conexão para a conta <i>%1</i>?</p><p><b>Obs.:</b> Isso <b>não</b> excluirá nenhum arquivo.</p> - + Remove connection Excluir conexão - + Cancel Cancelar @@ -4785,8 +5099,8 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Erro ao atualizar os metadados devido a erro na data/hora modificada @@ -4794,8 +5108,8 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Erro ao atualizar os metadados devido a erro na data/hora modificada @@ -4893,123 +5207,123 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr OCC::ownCloudGui - + Unsupported Server Version Versão do Servidor Não Suportada - + 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. O servidor na conta %1 executa uma versão não suportada %2. Usar este cliente com versões de servidor não suportadas não foi testado e é potencialmente perigoso. Prossiga por sua conta e risco. - + Disconnected Desconectado - + Disconnected from some accounts Desconectado de algumas contas - + Disconnected from %1 Desconectado de %1 - + Disconnected from accounts: Desconectado de contas: - + Account %1: %2 Conta %1: %2 - + Please sign in Favor conectar - + Signed out Desconectado - + Account synchronization is disabled A sincronização de conta está desativada - - + + Synchronization is paused A sincronização está pausada - + Folder %1: %2 Pasta %1: %2 - + Unresolved conflicts Conflitos não resolvidos - + Up to date Até a data - + Error during synchronization Erro durante a sincronização - + There are no sync folders configured. Não há pastas de sincronização configuradas. - + No sync folders configured Nenhuma pasta de sincronização configurada - + Checking for changes in remote "%1" Verificando mudanças no controle remoto "%1" - + Checking for changes in local "%1" Verificando mudanças no local "%1" - + Syncing %1 of %2 (%3 left) Sincronizando %1 de %2 (faltam %3) - + Syncing %1 of %2 Sincronizando %1 de %2 - + Syncing %1 (%2 left) Sincronizando %1 (%2 faltando) - + Syncing %1 Sincronizando %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5161,27 +5475,27 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Nova pasta - + You renamed %1 Você renomeou %1 - + You deleted %1 Você excluiu %1 - + You created %1 Você criou %1 - + You changed %1 Você modificou %1 - + Synced %1 %1 sincronizado @@ -5247,32 +5561,108 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Marcar como Lido + + ShareDelegate + + + Create a new share link + Criar um novo link de compartilhamento + + + + Copy share link location + Copiar localização do link de compartilhamento + + + + Share options + Opções de compartilhamento + + + + ShareDetailsPage + + + An error occurred setting the share password. + Ocorreu um erro ao definir a senha de compartilhamento. + + + + Edit share + Editar compartilhamento + + + + Dismiss + Dispensar + + + + Share label + Compartilhar etiqueta + + + + Allow editing + Permitir edição + + + + Password protect + Proteger com senha + + + + Set expiration date + Definir data de validade + + + + Note to recipient + Nota para o destinatário + + + + Unshare + Descompartilhar + + + + Add another link + Adicionar outro link + + + + Copy share link + Copiar link de compartilhamento + + ShareView - + Password required for new share - + Senha necessária para novo compartilhamento - + Share password - + Compartilhar senha - + Sharing is disabled - + O compartilhamento está desativado - + This item cannot be shared. - + Este item não pode ser compartilhado. - + Sharing is disabled. - + O compartilhamento está desativado. @@ -5280,13 +5670,13 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Search for users or groups… - + Pesquisar usuários ou grupos… SyncJournalDb - + Failed to connect database. Falha ao conectar banco de dados @@ -5344,6 +5734,22 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Carregar mais resultados + + UnifiedSearchResultNothingFound + + + No results for + Nenhum resultado para + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Seção de resultados da pesquisa %1 + + UserLine @@ -5407,67 +5813,67 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr UserStatusSelector - + Online status Status online - + Online Online - + Away Longe - + Do not disturb Não perturbe - + Mute all notifications Silenciar todas as notificações - + Invisible Invisível - + Appear offline Aparecer off-line - + Status message Mensagem de status - + What is your status? Qual é o seu status? - + Clear status message after Limpar mensagem de status após - + Cancel Cancelar - + Clear status message Limpar mensagem de status - + Set status message Definir mensagem de status @@ -5551,24 +5957,24 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Window - + Nextcloud desktop main dialog Diálogo principal do Nextcloud Desktop - + Current account Conta atual - - + + Resume sync for all Retomar a sincronização para todos - - + + Pause sync for all Pausar a sincronização para todos @@ -5578,22 +5984,22 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Definir o status do usuário - + Add account Adicionar conta - + Add new account Adicionar nova conta - + Settings Configurações - + Exit Sair @@ -5602,11 +6008,6 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Current user avatar Avatar do usuário atual - - - Current account avatar - Avatar da conta atual - Current user status is online @@ -5618,70 +6019,75 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr Não Perturbe é o status atual do usuário - + + Current account avatar + Avatar da conta atual + + + Current account status is online O status da conta atual é online - + Current account status is do not disturb O status da conta atual é não perturbe - + + %1 - File activity + %1 - Atividade de arquivo + + + Account switcher and settings menu Alternador de conta e menu de configurações - + Open local folder of current account Abrir pasta local da conta - + Connected Conectado - + Disconnected Desconectado - + Open Nextcloud Talk in browser Abrir o Nextcloud Talk no navegador - + More apps Mais aplicativos - + Open %1 in browser Abrir %1 no navegador - + Unified search results list Lista unificada de resultados de pesquisa - - - %1 - File activity - %1 - Atividade de arquivo - main.cpp - + System Tray not available Área de Notificação não disponível - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 requer uma área de notificação em funcionamento. Se você estiver executando o XFCE, siga <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">estas instruções</a>. Caso contrário, instale um aplicativo de área de notificação, como o "trayer" e tente novamente. @@ -5689,7 +6095,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Construído da revisão Git <a href="%1">%2</a> em %3, %4 usando Qt %5, %6</small></p> @@ -5723,72 +6129,77 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr + Server version downloaded, copied changed local file into case conflict conflict file + Versão do servidor baixada, copiada arquivo local alterado para arquivo de conflito de caso + + + Deleted Excluído - + Moved to %1 Movido para %1 - + Ignored Ignorado - + Filesystem access error Erro ao acesso do sistema de arquivos - + Error Erro - + Updated local metadata Metadado local enviado - + Unknown Desconhecido - + downloading baixando - + uploading enviando - + deleting excluindo - + moving movendo - + ignoring ignorando - + error erro - + updating local metadata atualizando metadados locais @@ -6025,7 +6436,7 @@ Este é um novo modo experimental. Se você decidir usá-lo, relate quaisquer pr File drop (upload only) - Soltar arquivo (somente envio) + Depósito de arquivos (somente envios) diff --git a/translations/client_ro.ts b/translations/client_ro.ts index 6a27a1f60..b4f85f7d7 100644 --- a/translations/client_ro.ts +++ b/translations/client_ro.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Deschis %1 local - + In %1 În %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Afișați mai multe acțiuni @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Respingeți + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Lista de activități @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Mutarea în coșul de gunoi nu este posibilă pe această platformă - + Error removing "%1": %2 A apărut o eroare în "%1": %2 - + Could not remove folder "%1" Nu s-a putut muta folderul "%1" @@ -321,7 +331,7 @@ Codul HTTP trimis de server este greșit. Era de așteptat codul 204, dar s-a primit "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Nu s-a putut debloca dosarul criptat %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Fișierul %1 este deja blocat de %2. - + Lock operation on %1 failed with error %2 Operațiunea de blocare pe %1 a eșuat cu eroarea %2 - + Unlock operation on %1 failed with error %2 Operațiunea de deblocare pe %1 a eșuat cu eroarea %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Anulează @@ -400,12 +410,12 @@ Se pare că ai activată opțiunea de Fișiere Virtuale pentru acest dosar. În acest moment nu este posibil să descarci în mod implicit astfel de fișiere. Pentru cea mai bună experiență folosind opțiunea de Fișiere Virtuale și criptare end-to-end asigurăte că ai marcat dosarul cu "Disponibil mereu local". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Nu cripta dosarul - + Do not encrypt folder - + Encrypt folder Criptează dosarul - + No account configured. Niciun cont configurat. - - Display mnemonic - Afișează fraza menmonică + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Afișează fraza menmonică @@ -445,18 +455,23 @@ Activează criptarea - + + End-to-end encryption has been enabled for this account + + + + Warning Atenție - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Nu se poate cripta un dosar cu conținut, vă rugăm să ștergeți fișierele. @@ -469,121 +484,121 @@ Așteaptă pentru sincronizare, apoi criptează dosarul. - + Encryption failed Criptarea a eșuat - + Could not encrypt folder because the folder does not exist anymore Nu se poate cripta acest dosar deoarece nu există - - + + Open folder Deschide director - + Encrypt Encrypt - - + + Edit Ignored Files Editează fișierele ignorate - - + + Create new folder Creați director nou - - + + Availability Disponibilitate - + Choose what to sync Alege ce să sync - + Force sync now Forțează sync acum - + Restart sync Repornește sync - + Resume sync Reia sync - + Pause sync Pauză sync - + Remove folder sync connection Elimină conexiunea de sincronizare pentru acest dosar - + Disable virtual file support … Dezactivează suportul pentru fișiere virtuale ... - + Enable virtual file support %1 … Activează suportul pentru fișiere virtuale %1 ... - + (experimental) (experimental) - + Folder creation failed Crearea directorului a eșuat - + <p>Could not create local folder <i>%1</i>.</p> <p>Nu s-a putut creea un dosar local <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Confirmă eliminarea conexiunii de sincronizare - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Dorești să oprești sincronizarea dosarului <i>%1</i>?</p><p><b>Notă:</b> Această funcție <b>nu</b>va șterge nici-un fișier.</p> - + Remove Folder Sync Connection Elimină conexiunea de sincronizare - + Disable virtual file support? Dezactivează suportul pentru fișiere virtuale? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Singurul avantaj al dezactivării acestei funcții este că funcția de sincroni Această acțiune va opri toate sincronizările în derulare din acest moment. - + Disable support Dezactivează suportul @@ -606,144 +621,176 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronizare în desfășurare - + The syncing operation is running.<br/>Do you want to terminate it? Operațiunea de sincronizare este în derulare. <br/>Dorești să o oprești ? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) din %2 în folosire. Unele fișiere, inclusiv dosarele partajate prin rețea, ar putea avea limite diferite. - + %1 of %2 in use %1 din %2 utilizat - + Currently there is no storage usage information available. În acest moment nu există informații legate de folosirea spațiului de stocare. - + %1 in use %1 folosiți - + %1 as %2 %1 ca %2 - + The server version %1 is unsupported! Proceed at your own risk. Versiunea serverului %1 este veche și nu mai este menținut!ă Continuă pe propriul tău risc. - + Connected to %1. Conectat la %1. - + Server %1 is temporarily unavailable. Serverul %1 este temporar indisponibil. - + Server %1 is currently in maintenance mode. Serverul %1 este momentan in mentenanță, - + Signed out from %1. Deautentificat de la %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Se obține autorizarea de la browser. <a href='%1'>Click aici</a> pentru a redeschide browser-ul. - + Connecting to %1 … Se conectează la %1 ... - + No connection to %1 at %2. Nu există nici-o conexiune către %1 la %2. - + Server configuration error: %1 at %2. Eroare de configurare a serverulu: %1 la %2. - + No %1 connection configured. Nu există nici-o conexiune configurată la %1. - + There are folders that were not synchronized because they are too big: Există dosare ce nu au fost sincronizate deoarece au o dimenziune prea mare: - + There are folders that were not synchronized because they are external storages: Există dosare ce nu sunt sincronizate deoarece se află pe stocarea externă: - + There are folders that were not synchronized because they are too big or external storages: Există dosare ce nu au fost sinscronizate deoarece acestea sunt prea mari sau se află pe stocarea externă: - + Confirm Account Removal Confirmați ștergerea contului - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Doriți să ștergeți conexiunea la acest cont <i>%1</i>?</p><p><b>Notă:</b>Această acțiune <b>nu</b>va șterge nici-un fișier.</p> - + Remove connection Șterge conexiunea - - + This account supports end-to-end encryption Contul permite criptare end-to-end. - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. OCC::ActivityListModel - + For more activities please open the Activity app. Pentru mai multe activități vă rugăm deschideți aplicația de activități. @@ -808,12 +855,12 @@ Această acțiune va opri toate sincronizările în derulare din acest moment.Activități de căutare... - + Fetching activities … Activități de căutare ... - + Files from the ignore list as well as symbolic links are not synced. Fișierele din lista de ignorare precum și legăturile simbolice nu sunt sincronizate. @@ -864,32 +911,59 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Dacă continuați aceste setări <b>vor fi șterse</b>. - + Continuing will mean <b>ignoring these settings</b>. Dacă continuați aceste setări <b>vor fi ignorate</b>. - + 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>. Unele setări au fost configurate în versiuni mai noi ale acetui client folosind niște opțiuni ce nu sunt disponibile în această versiune. <br><br> %1<br><br>Fișierul de configurare a fost deja copiat la <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Ieșire - + Continue Continuare - + Error accessing the configuration file A apărut o eroare în accesarea fișierului de ocnfigurare @@ -899,12 +973,12 @@ Această acțiune va opri toate sincronizările în derulare din acest moment.A apărut o eroare în accesarea fișierului de configurare la %1. Vă rugăm să vă asigurați că fișierul poate fi accesat de către acest utilizator. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Ieșire %1 @@ -950,56 +1024,216 @@ Această acțiune va opri toate sincronizările în derulare din acest moment.Fișierul %1 are o oră de modificare invalidă. Nu îl încărcați pe server. - + File Removed (start upload) %1 Fișier eliminat (începe încărcarea) %1 - + File %1 has invalid modification time. Do not upload to the server. Fișierul %1 are o oră de modificare invalidă. Nu îl încărcați pe server. - + Local file changed during syncing. It will be resumed. Fișierul local s-a modificat în timpul sincronizării. Acesta va fi reluat. - - + + Local file changed during sync. Fișierul local s-a modificat în timpul sincronizării. - + Network error: %1 Eroare de rețea: %1 - + Error updating metadata: %1 Eroare de actualizare a metadatelor: %1 - + The file %1 is currently in use Fișierul %1 este în curs de utilizare - + The local file was removed during sync. Fișierul local a fost eliminat în timpul sincronizării. - + Restoration failed: %1 Restaurarea a eșuat: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database A apărut o eroare în timpul scrierii de metadata în baza de date @@ -1017,12 +1251,12 @@ Această acțiune va opri toate sincronizările în derulare din acest moment.Vă rugăm să introduceți fraza de criptare end to end: <br><br>Utilizator:%2<br>Cont:%3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Introduceți fraza E2E @@ -1198,8 +1432,8 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Eroare de server: PROPFIND reply is not XML formatted! @@ -1207,27 +1441,27 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 A apărut o eroare în timpul deschiderii dosarului %1 - + Directory not accessible on client, permission denied Dosarul nu este accesibil pe acest client, accesul este refuzat - + Directory not found: %1 Dosarul nu a fost găsit: %1 - + Filename encoding is not valid Encodarea numelui fisierului nu este validă - + Error while reading directory %1 A apărut o eroare in timpul citirii dosarului %1 @@ -1235,83 +1469,83 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Această acțiune va opri toate sincronizările în derulare din acest moment. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Nu s-a putut genera metadata pentru criptare, se deblochează dosarul @@ -1449,144 +1683,144 @@ Aceasta poate fi o problemă cu librariile OpenSSL. OCC::Folder - + Local folder %1 does not exist. Dosarul local %1 nu există. - + %1 should be a folder but is not. %1 ar trebui să fie un dosar dar nu este. - + %1 is not readable. %1 nu poate fi citit. - + %1 and %n other file(s) have been removed. %1 și %n alte fișier(e) a fost șters. %1 și %n alte fișier(e) au fost șterse. %1 și %n alte fișiere au fost șterse. - + %1 has been removed. %1 names a file. %1 a fost șters. - + %1 and %n other file(s) have been added. %1 și un alt fișier a fost adăugat. %1 și %n alte fișiere au fost adăugate. %1 și %n de alte fișiere au fost adăugate. - + %1 has been added. %1 names a file. %1 a fost adăugat. - + %1 and %n other file(s) have been updated. %1 și %n alt fișier a fost actualizat. %1 și %n alte fișiere au fost actualizate. %1 și %n de alte fișiere au fost actualizate. - + %1 has been updated. %1 names a file. %1 a fost încărcat. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 a fost redenumit în %2 și un alt fișier a fost redenumit.%1 a fost redenumit în %2 și %n alte fișiere au fost redenumite.%1 a fost redenumit în %2 și %n de alte fișiere au fost redenumite. - + %1 has been renamed to %2. %1 and %2 name files. %1 a fost redenumit în %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 a fost mostat în %2 și %n ale fișiee a fost mutat.%1 a fost mostat în %2 și %n alte fișiere au fost mutate.%1 a fost mostat în %2 și %n de alte fișiere au fost mutate. - + %1 has been moved to %2. %1 a fost mutat în %2. - + %1 has and %n other file(s) have sync conflicts. %1 are și %n alt fișier are conflicte de sincronizare.%1 are și %n alte fișiere au conflicte de sincronizare.%1 are și %n de alte fișiere au conflicte de sincronizare. - + %1 has a sync conflict. Please check the conflict file! %1 are un conflict. Vă rugăm să verificați fișierul cu conflicte! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 și %n alt fișier nu au putut fi sincronizat datorită unor erori. Vă rugăm verificați fisierele log pentru mai multe detalii.%1 și %n alte fișiere nu au putut fi sincronizate datorită unor erori. Vă rugăm verificați fisierele log pentru mai multe detalii.%1 și %n de alte fișiere nu au putut fi sincronizate datorită unor erori. Vă rugăm verificați fisierele log pentru mai multe detalii. - + %1 could not be synced due to an error. See the log for details. %1 nu a putut fi sincronizat datorită unei erori. Vă rugăm să verificați fișierele log pentru mai multe detalii. - + %1 and %n other file(s) are currently locked. %1 și %n alt fișier este în acest moment blocat.%1 și %n alte fișiere sunt în acest moment blocate.%1 și %n de alte fișiere sunt în acest moment blocate. - + %1 is currently locked. %1 este în acest moment blocat. - + Sync Activity Activitate de sincronizare - + Could not read system exclude file Nu sa putut citi fișierul de excludere - + A new folder larger than %1 MB has been added: %2. Un nou fisier mai mare de %1 MB a fost adăugat: %2. - + A folder from an external storage has been added. Un dosar dintr-o locație externă de stocare a fost adăugat. - + Please go in the settings to select it if you wish to download it. Vă rugăm să selectați în setări dacă doriți să descărcați acest fișier. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Dosarul %1 a fost creeat dar a fost exclus, în trecut de la sincronizare. Conținutul nu va fii sincronizat. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Fisierul %1 a fost creeat dar a fost exclus, în trecut de la sincronizare. Acest nu va fii sincronizat. - + 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). @@ -1599,7 +1833,7 @@ Acest lucru înseamnă că aplicația de sincronizare ar putea să nu încarce %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1610,24 +1844,24 @@ Dacă decideți să restaurați fișierele, acestea vor fi resincronizate cu ser Dacă decideți să ștergeți fișierele, acestea vor fi indisponibile pentru dumneavoastră, cu excepția cazului în care sunteți proprietarul. - + 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. Toate fișierele din dosarul de sincronizare locală "%1" au fost șterse. Aceste ștergeri vor fi sincronizate cu serverul dvs., făcând aceste fișiere indisponibile dacă nu sunt restaurate.Sunteți sigur că doriți să sincronizați aceste acțiuni cu serverul?Dacă a fost un accident și decideți să păstrați fișierele, acestea vor fi resincronizate de pe server. - + Remove All Files? Ștergeți toate fișierele ? - + Remove all files Șterge toate fișierele - + Keep files Păstrează fișierele @@ -1663,22 +1897,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Nu s-a putut reseta starea dosarului - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Un jurnal de sicronizare vechi '%1' a fost găsit, dar acesta nu a putut fi șters. Vă rugăm să vă asigurați că acest jurnal nu este folosit de o aplicație. - + (backup) copie de siguranță (backup) - + (backup %1) copia de siguranță %1 (backup) @@ -1688,27 +1922,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Stare nedefinită - + Undefined state. - + Waiting to start syncing. Se așteaptă pentru a începe sincronizarea. - + Preparing for sync. Se pregătește sincronizarea. - + Sync is running. Sincronizare în derulare - + Sync finished with unresolved conflicts. Sincronizarea a reușit cu conflicte nenrezolvate. @@ -1728,62 +1962,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Anulați utilizatorul. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sincronizarea este oprită. - + %1 (Sync is paused) %1 (Sincronizarea este oprită) - + No valid folder selected! Nu este selectat un dosar valid! - + The selected path does not exist! Calea selectaă nu există! - + The selected path is not a folder! Calea selectaă nu este un dosar! - + You have no permission to write to the selected folder! Nu ai permisiunea de a scrie în dosarul selectat! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Dosarul local %1 conține deja un dosar folosit pentru sincronizare. Vă rugăm să alegeți un dosar diferit! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Dosarul local %1 conține deja un dosar folosit pentru sincronizare. Vă rugăm să alegeți un dosar diferit! - + There is already a sync from the server to this local folder. Please pick another local folder! Deja există un dosar de sincronizare de la acest sever către acest server. Vă rugăm să selectați un dosar local diferit! @@ -1796,7 +2030,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Adaugă o conexiune de sincronizare pentru un dosar - + File fişier @@ -1804,152 +2038,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Trebuie să fii conectat pentru a adăuga un dosar - + Click this button to add a folder to synchronize. Click pe acest buton pentru a adăuga un folder pentru a fii sincronizat. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. A apărut o eroare în momentul descărcării listei de dosare de pe server. - + Fetching folder list from server … Se descarcă lista de dosare de pe server ... - + There are unresolved conflicts. Click for details. Există conflicte nerezolvate. Click pentru mai multe detalii. - + Virtual file support is enabled. Suportul pentru fișiere virtuale este pornit. - + Signed out Deautentificat - + Synchronizing VirtualFiles with local folder Se sincronizează fișiere virtuale cu dosarul local - + Synchronizing with local folder Se sincronizează cu dosarul local - + Checking for changes in remote "%1" Se verifică schimbările pe dosarul '%1' - + Checking for changes in local "%1" Se verifică schimbările în dosarul local '%1' - + Reconciling changes Se reconciliază schimbările - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Se sincronizează %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) descarc cu %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) încarc cu %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 of %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 dreapta, %1 sau %2, fișier %3 sau %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 din %2, dișier %3 sau %4 - + file %1 of %2 fișier %1 sau %2 - + Waiting … În așteptare ... - + Waiting for %n other folder(s) … Se așteaptă pentru %n alt dosar ...Se așteaptă pentru %n alte dosare ...Se așteaptă pentru %n de alte dosare ... - + Preparing to sync … Se pregăteste sincronizarea ... @@ -2180,13 +2418,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable stabil - + beta beta @@ -2238,59 +2476,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel Anulează - + Zip Archives Arhive Zip - + Debug Archive Created - + Debug archive is created at %1 @@ -2298,22 +2536,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: - + Sharing error Eroare la partajare - + Could not retrieve or create the public link share. Error: %1 @@ -2547,6 +2785,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Închide + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2879,60 +3122,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -3004,7 +3247,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3036,144 +3280,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> - + Invalid URL URL invalid - + Failed to connect to %1 at %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> - + Creating local sync folder %1 … - + OK - + failed. eșuat! - + Could not create local folder %1 - + No remote folder specified! - + Error: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. - + The remote folder %1 already exists. Connecting it for syncing. - - + + The folder creation resulted in HTTP error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. - + Successfully connected to %1! - + Connection to %1 could not be established. Please check again. - + Folder rename failed - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> @@ -3196,12 +3440,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3212,12 +3456,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3246,162 +3490,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3409,22 +3658,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3437,19 +3686,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery - + Could not delete file record %1 from local DB @@ -3460,32 +3709,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - + The download would reduce free local disk space below the limit - + Free space on disk is less than %1 - + File was deleted from server - + The file could not be downloaded completely. - + The downloaded file is empty, but the server said it should have been %1. @@ -3495,18 +3744,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3527,7 +3781,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 @@ -3538,16 +3792,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3555,7 +3814,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash @@ -3568,46 +3827,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3628,7 +3892,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3641,12 +3905,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3654,42 +3918,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database @@ -3879,7 +4143,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3897,23 +4161,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Setări - + %1 Settings This name refers to the application name e.g Nextcloud - + General General - + Network Rețea - + Account Cont @@ -3921,17 +4185,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4007,7 +4276,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4016,132 +4285,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you Am partajat ceva cu tine - - + + Share options - - + + Activity - + Copy private link to clipboard - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link Copiză link public - + Copy internal link Copiază linkul intern - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser Deschide în Browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Șterge @@ -4357,63 +4663,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database - + Unable to read from the sync journal. - + Cannot open the sync journal @@ -4423,12 +4729,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. - + There is insufficient space available on the server for some uploads. @@ -4497,59 +4803,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Adaugă cont - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings Setări - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4557,24 +4863,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4582,22 +4888,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4605,30 +4911,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4766,8 +5078,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4775,8 +5087,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4874,123 +5186,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version - + 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. - + Disconnected Deconenctat - + Disconnected from some accounts Deconectat de la unele conturi - + Disconnected from %1 - + Disconnected from accounts: Deconectat de la conturile: - + Account %1: %2 Cont %1: %2 - + Please sign in - + Signed out - + Account synchronization is disabled - - + + Synchronization is paused - + Folder %1: %2 Director %1: %2 - + Unresolved conflicts Conflicte nerezolvate - + Up to date - + Error during synchronization - + There are no sync folders configured. - + No sync folders configured - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 - + Syncing %1 (%2 left) - + Syncing %1 - + %1 (%2, %3) @@ -5142,27 +5454,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5228,30 +5540,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5267,7 +5655,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5325,6 +5713,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5388,67 +5792,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5532,24 +5936,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Cont actual - - + + Resume sync for all - - + + Pause sync for all @@ -5559,22 +5963,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Adaugă cont - + Add new account - + Settings Setări - + Exit @@ -5583,11 +5987,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5599,70 +5998,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Conectat - + Disconnected Deconenctat - + Open Nextcloud Talk in browser - + More apps Mai multe aplicatii - + Open %1 in browser Deschide %1 în Browser - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5670,7 +6074,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5704,72 +6108,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Șters - + Moved to %1 Mutat în %1 - + Ignored Ignorat - + Filesystem access error - + Error Eroare - + Updated local metadata - + Unknown Necunoscut - + downloading se descarcă - + uploading se încarcă - + deleting se șterge - + moving se mută - + ignoring se ignoră - + error eroare - + updating local metadata actualizare metadata locală diff --git a/translations/client_ru.ts b/translations/client_ru.ts index a6c070cdd..76b64c030 100644 --- a/translations/client_ru.ts +++ b/translations/client_ru.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Открыть «%1» на ПК - + In %1 В %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Показывать больше действий @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Отказать + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Список действий @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Меню отчистки статуса сообщения @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity События - + Sharing Общий доступ @@ -226,12 +236,12 @@ Перемещение в корзину не поддерживается на этой платформе - + Error removing "%1": %2 Ошибка удаления «%1»: %2 - + Could not remove folder "%1" Не удалось удалить папку «%1» @@ -321,7 +331,7 @@ Сервер вернул неверный HTTP код. Ожидается 204, но был получен "%1%2". - + "%1 Failed to unlock encrypted folder %2". %1 не удалось разблокировать зашифрованную папку «%2». @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Файл «%1» уже заблокирован пользователем %2. - + Lock operation on %1 failed with error %2 Не удалось заблокировать файл «%1»: %2 - + Unlock operation on %1 failed with error %2 Не удалось снять блокирование файла «%1»: %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Отмена @@ -400,12 +410,12 @@ Для этой папки используется механизм виртуальных файлов. В настоящее время не придерживается «прозрачное» получение с сервера виртуальных файлов, зашифрованных с использованием оконечного шифрования. Для работы с такими файлами используйте пункт "Хранить на устройстве». - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Не шифровать папку - + Do not encrypt folder Не шифровать папку - + Encrypt folder Зашифровать папку - + No account configured. Учётная запись не настроена. - - Display mnemonic - Показать мнемофразу + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Показать мнемофразу @@ -445,18 +455,23 @@ Включить шифрование - + + End-to-end encryption has been enabled for this account + + + + Warning Предупреждение - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Невозможно зашифровать непустую папку. Удалите файлы, дождитесь окончания синхронизации и включите шифрование. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. Эта учетная запись поддерживает сквозное шифрование - + Encryption failed Ошибка шифрования - + Could not encrypt folder because the folder does not exist anymore Не удалось зашифровать папку, она более не существует - - + + Open folder Открыть папку… - + Encrypt Зашифровать - - + + Edit Ignored Files Список исключений синхронизации… - - + + Create new folder Создать папку - - + + Availability Доступность - + Choose what to sync Выбрать объекты для синхронизации - + Force sync now Принудительно запустить синхронизацию - + Restart sync Перезапустить синхронизацию - + Resume sync Возобновить синхронизацию - + Pause sync Приостановить синхронизацию - + Remove folder sync connection Отключить синхронизацию папки - + Disable virtual file support … Отключить поддержку виртуальных файлов… - + Enable virtual file support %1 … Включить поддержку виртуальных файлов %1… - + (experimental) (экспериментальное) - + Folder creation failed Ошибка создания папки - + <p>Could not create local folder <i>%1</i>.</p> <p>Не удалось создать локальную папку: <i>«%1»</i>.</p> - + Confirm Folder Sync Connection Removal Подтверждение отключения синхронизации папки - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Действительно остановить синхронизацию папки <i>%1</i>?</p><p><b>Примечание:</b> Это действие <b>НЕ</b> приведёт к удалению файлов.</p> - + Remove Folder Sync Connection Отключить синхронизацию папки - + Disable virtual file support? Отключить поддержку виртуальных файлов? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -595,7 +610,7 @@ This action will abort any currently running synchronization. Отключение приведёт к прекращению выполняющейся синхронизации. - + Disable support Отключить поддержку @@ -605,144 +620,176 @@ This action will abort any currently running synchronization. Мнемофраза оконечного шифрования - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Для защиты личного идентификатора оконечного шифрования используется мнемофраза, состоящая из двенадцати слов. Мнемофразу следует записать и сохранить запись в надёжном месте, она потребуется для подключения к учётной записи ваших дополнительных устройств. - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Синхронизация запущена - + The syncing operation is running.<br/>Do you want to terminate it? Выполняется синхронизация.<br/>Действительно прервать операцию? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Используется %1 (%3%) из %2. Некоторые папки, включая сетевые или общие, могут иметь свои собственные ограничения. - + %1 of %2 in use Используется %1 из %2 - + Currently there is no storage usage information available. В данный момент информация о заполненности хранилища недоступна. - + %1 in use Используется %1 - + %1 as %2 %1: %2 - + The server version %1 is unsupported! Proceed at your own risk. Сервер версии %1 не поддерживается. Продолжайте на свой страх и риск. - + Connected to %1. Соединен с %1. - + Server %1 is temporarily unavailable. Сервер %1 временно недоступен. - + Server %1 is currently in maintenance mode. Сервер %1 в настоящее время находится в режиме технического обслуживания. - + Signed out from %1. Успешно вышли из %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Получение авторизации из браузера. <a href='%1'>Нажмите здесь</a>, чтобы повторно открыть браузер. - + Connecting to %1 … Подключение к %1… - + No connection to %1 at %2. Нет соединения с %1 в %2. - + Server configuration error: %1 at %2. Ошибка конфигурации сервера: %1: %2. - + No %1 connection configured. Нет настроенного подключения %1. - + There are folders that were not synchronized because they are too big: Есть папки, которые не синхронизированы, так как их размер превышает установленное ограничение: - + There are folders that were not synchronized because they are external storages: Есть папки, которые не были синхронизированы, так как они являются внешними хранилищами: - + There are folders that were not synchronized because they are too big or external storages: Есть папки, которые не были синхронизированы, так как их размер превышает установленное ограничение или они являются внешними хранилищами: - + Confirm Account Removal Подтверждение удаления учетной записи - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Действительно удалить подключение к учётной записи <i>%1</i>?</p><p><b>Примечание:</b> Это действие <b>НЕ</b> приведёт к удалению файлов.</p> - + Remove connection Удалить подключение - - + This account supports end-to-end encryption Эта учетная запись поддерживает сквозное шифрование - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -797,7 +844,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. Вся история доступна в приложении «События». @@ -807,12 +854,12 @@ This action will abort any currently running synchronization. Получение событий… - + Fetching activities … Получение событий… - + Files from the ignore list as well as symbolic links are not synced. Из синхронизации исключены символьные ссылки и файлы, попадающие под правила из списка игнорируемых файлов. @@ -863,32 +910,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. При продолжении, эти <b>параметры будут удалены</b>. - + Continuing will mean <b>ignoring these settings</b>. При продолжении, эти <b>параметры будут проигнорированы</b>. - + 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>. Используемая версия приложения не поддерживает некоторые параметры, настроенные в более новой версии. <br><br>%1<br><br> Резервная копия файла конфигурации сохранена в <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Выйти - + Continue Продолжить - + Error accessing the configuration file Ошибка при доступе к файлу конфигурации @@ -898,12 +972,12 @@ This action will abort any currently running synchronization. Ошибка при обращении к файлу конфигурации «%1», убедитесь, что файл доступен. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Ошибка при обращении к файлу конфигурации «%1», убедитесь, что файл доступен для системной учётной записи. - + Quit %1 Выйти из %1 @@ -949,56 +1023,216 @@ This action will abort any currently running synchronization. Файл %1 имеет недопустимое время изменения. Не загружайте его на сервер. - + File Removed (start upload) %1 Файл удалён (начало загрузки) %1 - + File %1 has invalid modification time. Do not upload to the server. Файл %1 имеет недопустимое время модификации. Не загружайте его на сервер. - + Local file changed during syncing. It will be resumed. Локальный файл изменился во время синхронизации. Он будет обновлён. - - + + Local file changed during sync. Локальный файл изменился во время синхронизации. - + Network error: %1 Сетевая ошибка: %1 - + Error updating metadata: %1 Ошибка обновления метаданных: %1 - + The file %1 is currently in use В настоящее время используется файл %1 - + The local file was removed during sync. Локальный файл был удален во время синхронизации. - + Restoration failed: %1 Восстановление не удалось: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Ошибка записи метаданных в базу данных @@ -1016,12 +1250,12 @@ This action will abort any currently running synchronization. Введите свою парольную фразу сквозного шифрования: <br><br> Пользователь: %2<br>Учётная запись: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Введите парольную фразу сквозного шифрования @@ -1197,8 +1431,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Ошибка сервера: ответ PROPFIND не в формате XML. @@ -1206,27 +1440,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Не удалось открыть каталог «%1» - + Directory not accessible on client, permission denied Каталог не доступен для клиента, доступ запрещён - + Directory not found: %1 Каталог «%1» не найден - + Filename encoding is not valid Некорректная кодировка имени файла - + Error while reading directory %1 Не удалось прочитать содержимое каталога «%1» @@ -1234,83 +1468,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. Получен недействительный токен. - - - - - - + + + + + + Please try again. Попробуйте ещё раз. - + Invalid file path was provided. Указан недействительный путь. - + Could not find an account for local editing. Не удалось найти учётную запись для локального редактирования. - - + + Could not validate the request to open a file from server. Не удалось проверить запрос на открытие файла на сервере. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Не удалось найти файл для локального редактирования. Убедитесь, что путь к этому файлу действителен, а также что файл синхронизирован и сохранён локально. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Не удалось найти файл для локального редактирования. Убедитесь, что файл не исключён из выборочной синхронизации. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1318,7 +1552,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Не удалось создать метаданные для расшифровывания папки. @@ -1448,145 +1682,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Локальная папка «%1» не существует. - + %1 should be a folder but is not. «%1» должен быть папкой, но ей не является. - + %1 is not readable. «%1» не может быть прочитан. - + %1 and %n other file(s) have been removed. Удалены «%1» и ещё %n файл.Удалены «%1» и ещё %n файла.Удалены «%1» и ещё %n файлов.Удалены «%1» и ещё %n файлов. - + %1 has been removed. %1 names a file. «%1» удалён. - + %1 and %n other file(s) have been added. %1 и ещё %n файл добавлены.%1 и ещё %n файла добавлены.%1 и ещё %n файлов добавлены.%1 и ещё %n файла добавлены. - + %1 has been added. %1 names a file. «%1» добавлен. - + %1 and %n other file(s) have been updated. Обновлены «%1» и ещё один файл.Обновлены «%1» и ещё %n файла.Обновлены «%1» и ещё %n файлов.Обновлены «%1» и ещё %n файла. - + %1 has been updated. %1 names a file. «%1» обновлён. - + %1 has been renamed to %2 and %n other file(s) have been renamed. «%1» переименован в «%2», ещё переименован один файл.«%1» переименован в «%2», ещё переименованы %n файла.«%1» переименован в «%2», ещё переименованы %n файлов.«%1» переименован в «%2», ещё переименованы %n файлов. - + %1 has been renamed to %2. %1 and %2 name files. «%1» переименован в «%2». - + %1 has been moved to %2 and %n other file(s) have been moved. %1 был перемещён в %2, и ещё %n другой файл был перемещён.%1 был перемещён в %2, и ещё %n других файла были перемещены.%1 был перемещён в %2, и ещё %n других файла были перемещены.%1 был перемещён в %2, и ещё %n других файла были перемещены. - + %1 has been moved to %2. «%1» перемещён в «%2». - + %1 has and %n other file(s) have sync conflicts. У %1 и ещё у %n другого файла есть конфликты синхронизации.У %1 и ещё у %n других файлов есть конфликты синхронизации.У %1 и ещё у %n других файлов есть конфликты синхронизации.У %1 и ещё у %n других файлов есть конфликты синхронизации. - + %1 has a sync conflict. Please check the conflict file! У %1 есть конфликт синхронизации. Пожалуйста, проверьте конфликтный файл! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 и ещё %n другой файл не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.%1 и ещё %n других файла не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.%1 и ещё %n других файлов не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале.%1 и ещё %n других файлов не удалось синхронизировать из-за ошибок. Подробности смотрите в журнале. - + %1 could not be synced due to an error. See the log for details. %1 не может быть синхронизирован из-за ошибки. Подробности смотрите в журнале. - + %1 and %n other file(s) are currently locked. %1 и ещё %n файл заблокированы.%1 и ещё %n файла заблокированы.%1 и ещё %n файлов заблокированы.%1 и ещё %n файла заблокированы. - + %1 is currently locked. файл «%1» заблокирован. - + Sync Activity Журнал синхронизации - + Could not read system exclude file Не удалось прочитать файл исключений сихнронизации - + A new folder larger than %1 MB has been added: %2. Добавлена новая папка «%2», размер которой превышает %1 МБ. - + A folder from an external storage has been added. Была добавлена папка из внешнего хранилища. - + Please go in the settings to select it if you wish to download it. Чтобы скачать новую папку, перейдите в параметры приложения и отметьте её для синхронизации. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Создана папка «%1» создана, но ранее она была исключена из синхронизации. Данные внутри этой папки не будут синхронизированы. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Создан файл «%1», но ранее он был исключён из синхронизации. Этот файл не будет синхронизирован. - + 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). @@ -1598,7 +1832,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1609,7 +1843,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a При выборе «Удалить файлы», файлы станут недоступны, кроме случая, когда вы являетесь их владельцем. - + 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. @@ -1618,17 +1852,17 @@ If this was an accident and you decide to keep your files, they will be re-synce Если это произошло случайно, и вы решите сохранить файлы, они будут повторно скачаны с сервера. - + Remove All Files? Удалить все файлы? - + Remove all files Удалить все файлы - + Keep files Сохранить файлы @@ -1664,22 +1898,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Невозможно сбросить состояние папки - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Найден старый журнал синхронизации «%1», но он не может быть удалён. Убедитесь, что файл журнала не открыт в другом приложении. - + (backup) (резервная копия) - + (backup %1) (резервная копия %1) @@ -1689,27 +1923,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Неопределенное состояние. - + Undefined state. Неопределенное состояние. - + Waiting to start syncing. Ожидание запуска синхронизации. - + Preparing for sync. Подготовка к синхронизации. - + Sync is running. Идет синхронизация. - + Sync finished with unresolved conflicts. Синхронизация завершена с неразрешенными конфликтами. @@ -1729,62 +1963,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Отмена пользователем. - + Last sync was successful. Последняя синхронизация прошла успешно. - + Setup error. Ошибка установки. - + Sync request was cancelled. Запрос синхронизации был отменён. - + Sync is paused. Синхронизация приостановлена. - + %1 (Sync is paused) %1 (синхронизация приостановлена) - + No valid folder selected! Не выбрана допустимая папка. - + The selected path does not exist! Выбранный путь не существует - + The selected path is not a folder! Выбранный путь не является папкой. - + You have no permission to write to the selected folder! Отсутствуют права записи в выбранную папку. - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Локальная папка «%1» уже содержит вложенную папку, которая синхронизируется с сервером. Выберите другую папку. - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Локальная папка «%1» является вложенной в папку, которая уже синхронизируется с сервером. Выберите другую папку. - + There is already a sync from the server to this local folder. Please pick another local folder! Синхронизация этой локальной папки с сервером уже настроена. Выберите другую локальную папку. @@ -1797,7 +2031,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Добавить папку для синхронизации… - + File Файл @@ -1805,152 +2039,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Для добавления синхронизации папки необходимо соединиться с сервером - + Click this button to add a folder to synchronize. Добавление синхронизируемой папки - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Ошибка загрузки списка папок с сервера. - + Fetching folder list from server … Получение с сервера списка папок… - + There are unresolved conflicts. Click for details. Имеются неразрешенные конфликты, нажмите для просмотра подробных сведений. - + Virtual file support is enabled. Поддержка виртуальных файлов включена. - + Signed out Выполнен выход из учётной записи - + Synchronizing VirtualFiles with local folder Синхронизация виртуальных файлов с локальной папкой - + Synchronizing with local folder Синхронизация с локальной папкой - + Checking for changes in remote "%1" Проверка изменений на сервере «%1» - + Checking for changes in local "%1" Проверка изменений в локальной папке «%1» - + Reconciling changes Согласование изменений - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Синхронизация «%1» - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) получение с сервера %1/с - + ↓ %1/s ↓ %1/с - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) передача на сервер %1/с - + ↑ %1/s ↑ %1/с - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 из %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" До завершения несколько секунд, %1 из %2, файл %3 из %4 - + %5 left, %1 of %2, file %3 of %4 Синхронизировано файлов %3 из %4 (%1 из %2), до завершения %5 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 из %2, %3 из %4 файлов(а) - + file %1 of %2 %1 из %2 файлов(а) - + Waiting … Ожидание… - + Waiting for %n other folder(s) … Ожидание %n папки…Ожидание %n папок…Ожидание %n папок…Ожидание %n папок… - + Preparing to sync … Подготовка к синхронизации… @@ -2181,13 +2419,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable стабильный - + beta бета @@ -2239,32 +2477,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Создать архив с отладочными данными - + Server notifications that require attention. Требующие внимания уведомления, полученные с сервера. - + Show call notification dialogs. Показывать диалог уведомления о вызове. - + You cannot disable autostart because system-wide autostart is enabled. Автоматический запуск не может быть отключен, т.к. он настроен на уровне системы. - + Change update channel? Сменить канал обновлений? - + 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. 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. @@ -2273,27 +2511,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Обратите внимание, что смена канала возможна переход только при увеличения внутренней версии приложения: переход со стабильного на бета-канал происходит моментально, а переход с бета-канала на стабильный потребует времени, пока стабильная версия станет новее установленной бета-версии. - + Change update channel Сменить канал обновлений - + Cancel Отменить - + Zip Archives Zip архивы - + Debug Archive Created Создан архив с отладочными данными - + Debug archive is created at %1 Архив с отладочными данными создан: «%1» @@ -2301,22 +2539,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Требуется задать пароль для общего ресурса - + Please enter a password for your link share: Задайте пароль для доступа по ссылке: - + Sharing error Ошибка общего доступа - + Could not retrieve or create the public link share. Error: %1 @@ -2553,6 +2791,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Закрыть + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2888,60 +3131,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 Использовать &виртуальные файлы вместо загрузки %1 - + (experimental) (экспериментальная функция) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. В ОС Windows механизм виртуальных файлов не поддерживается для корневой уровня файловой системы. Для продолжения выберите папку на диске, а не сам диск. - + %1 folder "%2" is synced to local folder "%3" %1 каталог «%2» синхронизирован с локальной папкой «%3» - + Sync the folder "%1" Синхронизировать папку «%1» - + Warning: The local folder is not empty. Pick a resolution! Предупреждение: локальная папка не пуста. Выберите действие! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 свободного места - + Virtual files are not available for the selected folder Использование виртуальные файлов недоступно для выбранной папки. - + Local Sync Folder Локальный каталог синхронизации - - + + (%1) (%1) - + There isn't enough free space in the local folder! Недостаточно свободного места в локальной папке. @@ -3013,7 +3256,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Невозможно получить время модификации для файла при конфликте %1 @@ -3045,144 +3289,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Успешное подключение к %1: %2 версия %3 (%4)</font><br/><br/> - + Invalid URL Неверная ссылка - + Failed to connect to %1 at %2:<br/>%3 Не удалось подключиться к %1 в %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Превышено время ожидания соединения к %1 на %2. - + Trying to connect to %1 at %2 … Попытка подключения к серверу %1 по адресу %2... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Запрос авторизации с сервера перенаправлен на «%1». Ссылка неверна, сервер неправильно настроен. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Доступ запрещён сервером. Чтобы доказать, что у Вас есть права доступа, <a href="%1">нажмите здесь</a> для входа через Ваш браузер. - + There was an invalid response to an authenticated WebDAV request Получен неверный ответ на авторизованный запрос WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Локальный каталог синхронизации %1 уже существует, используем его для синхронизации.<br/><br/> - + Creating local sync folder %1 … Создание локальной папки синхронизации %1... - + OK ОК - + failed. не удалось. - + Could not create local folder %1 Не удалось создать локальный каталог синхронизации %1 - + No remote folder specified! Не указан удалённый каталог! - + Error: %1 Ошибка: %1 - + creating folder on Nextcloud: %1 создание папки на сервере Nextcloud: %1 - + Remote folder %1 created successfully. Папка «%1» на сервере успешно создана. - + The remote folder %1 already exists. Connecting it for syncing. Папка «%1» уже существует на сервере. Выполняется подключение для синхронизации. - - + + The folder creation resulted in HTTP error code %1 Создание каталога завершилось с HTTP-ошибкой %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Не удалось создать удаленный каталог, так как представленные параметры доступа неверны!<br/>Пожалуйста, вернитесь назад и проверьте учетные данные.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Не удалось создать удаленный каталог, возможно, указанные учетные данные неверны.</font><br/>Вернитесь назад и проверьте учетные данные.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Удаленный каталог %1 не создан из-за ошибки <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Установлено соединение синхронизации %1 к удалённому каталогу %2. - + Successfully connected to %1! Соединение с %1 успешно установлено. - + Connection to %1 could not be established. Please check again. Не удалось соединиться с %1. Попробуйте снова. - + Folder rename failed Ошибка переименования папки - + Cannot 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. Невозможно удалить каталог и создать его резервную копию, каталог или файл в ней открыт в другом приложении. Закройте каталог или файл и нажмите «Повторить попытку», либо прервите работу мастера настройки. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Локальная папка синхронизации «%1» успешно создана.</b></font> @@ -3205,12 +3449,12 @@ Note that using any logging command line options will override this setting.Отмена - + Enable experimental feature? Использовать экспериментальную функцию? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3227,12 +3471,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Так как эта функция является экспериментальной, сообщайте разработчикам об ошибках в её работе. - + Enable experimental placeholder mode Использовать экспериментальную функцию подстановки - + Stay safe Не рисковать @@ -3261,162 +3505,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Синхронизация символических ссылок не поддерживается. - + File is listed on the ignore list. Файл присутствует в списке исключений из сихнронизации. - + File names ending with a period are not supported on this file system. Используемая файловая система не поддерживает имена файлов, оканчивающиеся на точку. - + File names containing the character "%1" are not supported on this file system. Используемая файловая система не поддерживает имена файлов, содержащие символ «%1». - + File name contains at least one invalid character Имя файла содержит по крайней мере один некорректный символ - + The file name is a reserved name on this file system. Имя файла является зарезервированным внутренним именем в используемой файловой системе. - + Filename contains trailing spaces. Имя файла содержит пробелы на конце. - + Filename contains leading spaces. Имя файла содержит пробелы в начале. - + Filename contains leading and trailing spaces. Имя файла содержит пробелы в начале или на конце. - + Filename is too long. Имя файла слишком длинное. - + File/Folder is ignored because it's hidden. Файл или папка исключены из синхронизации, так как являются скрытыми. - + Stat failed. Ошибка вызова функции stat. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Конфликт: загружена версия файла с сервера, а локальная копия переименована и не передана на сервер. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Имя файла не может быть закодировано для используемой файловой системы. - + The filename is blacklisted on the server. Имя файла внесено в чёрный список на сервере. - + File has extension reserved for virtual files. Расширение файла является зарезервированным для виртуальных файлов. - + size размер - + permission разрешение - + file id id файла - + Server reported no %1 Сервер сообщил об отсутствии %1 - + Cannot sync due to invalid modification time Синхронизация невозможна по причине некорректного времени изменения файла - + Error while deleting file record %1 from the database Не удалось удалить из базы данных запись %1 - + Conflict when uploading a folder. It's going to get cleared! Передача папки на сервер привела к конфликту версии. Папка, вызвавшая конфликт версии, будет удалена. - + Conflict when uploading a file. It's going to get removed! Передача файла на сервер привела к конфликту версии. Файл, вызвавший конфликт версии, будет удалён. - + Ignored because of the "choose what to sync" blacklist Игнорируется из-за совпадения с записью в списке исключений из синхронизации - + Not allowed because you don't have permission to add subfolders to that folder Недостаточно прав для создания вложенных папок - + Not allowed because you don't have permission to add files in that folder Недостаточно прав для создания файлов в этой папке - + Not allowed to upload this file because it is read-only on the server, restoring Передача этого файла на сервер не разрешена, т.к. он доступен только для чтения, выполняется восстановление - + Moved to invalid target, restoring Перемещено в некорректное расположение, выполняется восстановление - + Not allowed to remove, restoring Удаление недопустимо, выполняется восстановление - + Error while reading the database Ошибка чтения базы данных - + Server replied with an error while reading directory "%1" : %2 Ошибка сервера при попытке прочитать каталог «%1»: %2 @@ -3424,22 +3673,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB не удалось удалить файл %1 из локальной базы данных - + Error updating metadata due to invalid modification time Ошибка обновления метаданных из-за недопустимого времени модификации - + Error updating metadata: %1 Ошибка обновления метаданных: %1 - + File is currently in use Файл используется @@ -3452,19 +3701,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss не удалось получить файл %1 из локальной базы данных - + File %1 cannot be downloaded because encryption information is missing. Файл %1 не может быть загружен из-за отсутствия информации о применяемом шифровании. - - + + File has changed since discovery После обнаружения файл был изменен - + Could not delete file record %1 from local DB Не удалось удалить запись о файле %1 из локальной базы данных @@ -3475,32 +3724,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss Файл %1 не может быть загружен из-за локального конфликта имён. - + File %1 can not be downloaded because of a local file name clash! Файл «%1» не может быть загружен из-за локального конфликта имён. - + The download would reduce free local disk space below the limit Загрузка файлов с сервера уменьшит доступное пространство на локальном диске ниже допустимого предела - + Free space on disk is less than %1 Свободного места на диске меньше чем %1 - + File was deleted from server Файл удалён с сервера - + The file could not be downloaded completely. Невозможно полностью загрузить файл. - + The downloaded file is empty, but the server said it should have been %1. Скачанный файл пуст, хотя сервер сообщил, что его размер должен составлять %1 @@ -3510,18 +3759,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Файл «%1» не может быть сохранён по причине локального конфликта имён. - - + + File %1 has invalid modified time reported by server. Do not save it. Файл %1 имеет неверное время изменения, сообщенное сервером. Не сохраняйте его. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Ошибка обновления метаданных: %1 - + The file %1 is currently in use Файл «%1» используется @@ -3542,7 +3796,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 не удалось удалить файл «%1», ошибка: %2 @@ -3553,16 +3807,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Не удалось создать папку «%1» - + Error updating metadata: %1 Ошибка обновления метаданных: %1 - + The file %1 is currently in use Файл «%1» используется @@ -3570,7 +3829,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Не удалось удалить «%1» из-за локального конфликта имён @@ -3583,46 +3842,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Файл %1 не может быть переименован в %2 из-за локального конфликта имён - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB не удалось получить файл %1 из локальной базы данных - + Error setting pin state Не удалось задать состояние pin - - + + Error updating metadata: %1 Ошибка обновления метаданных: %1 - + The file %1 is currently in use Файл «%1» используется - - + + Could not delete file record %1 from local DB Не удалось удалить запись о файле %1 из локальной базы данных - + Failed to propagate directory rename in hierarchy - + Failed to rename file Не удалось переименовать файл @@ -3643,7 +3907,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Получен неверный код HTTP-ответа сервера: ожидался код 204, но был получен «%1 %2». @@ -3656,12 +3920,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Сервер ответил неправильным кодом HTTP . Ожидался 201, но получен «%1 %2». - + Error writing metadata to the database: %1 Ошибка записи метаданных в базу данных: %1 - + The file %1 is currently in use Файл «%1» используется @@ -3669,42 +3933,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Не удалось переименовать «%1» в «%2», сообщение об ошибке: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Сервер ответил неправильным кодом HTTP. Ожидался 201, но получен «%1 %2». - + could not get file %1 from local DB не удалось получить файл %1 из локальной базы данных - + Could not delete file record %1 from local DB Не удалось удалить запись о файле %1 из локальной базы данных - + Error updating metadata: %1 Ошибка обновления метаданных: %1 - + The file %1 is currently in use Файл «%1» используется - + Error setting pin state Не удалось задать состояние pin - + Error writing metadata to the database Ошибка записи метаданных в базу данных @@ -3894,7 +4158,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Ответить @@ -3912,23 +4176,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Параметры - + %1 Settings This name refers to the application name e.g Nextcloud Параметры %1 - + General Основные - + Network Сеть - + Account Учётная запись @@ -3936,17 +4200,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link Общий доступ по ссылке - + Link share Поделиться ссылкой - + + Internal link + + + + Enter a note for the recipient Введите примечание для получателя @@ -4022,7 +4291,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4031,132 +4300,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Контекстное меню предоставления общего доступа - + Select new location … Выбрать новое расположение ... - + I shared something with you Я поделился с тобой - - + + Share options Общий доступ… - - + + Activity Активность - + Copy private link to clipboard Скопировать закрытую ссылку в буфер обмена - + Send private link by email … Отправить закрытую ссылку по электронной почте... + + + Expire in %1 minutes + remaining time before lock expire + Блокировка будет снята через %1 минутуБлокировка будет снята через %1 минутыБлокировка будет снята через %1 минутБлокировка будет снята через %1 минуты + - + Leave this share - + Resharing this file is not allowed Повторная публикация этого файла не разрешена - + Resharing this folder is not allowed Повторная публикация этой папки не разрешена - - + + Copy public link Скопировать общедоступную ссылку - + Copy internal link Скопировать внутреннюю ссылку - + + Encrypt + + + + Lock file Заблокировать файл - + Unlock file Снять блокировку файла - + Locked by %1 Заблокировано пользователем %1 - - Expire in %1 minutes - remaining time before lock expire - Блокировка будет снята через %1 минутуБлокировка будет снята через %1 минутыБлокировка будет снята через %1 минутБлокировка будет снята через %1 минуты - - - + Expires in %1 minutes remaining time before lock expires Блокировка будет снята через %1 минутуБлокировка будет снята через %1 минутыБлокировка будет снята через %1 минутБлокировка будет снята через %1 минуты - + Edit Редактировать - + Open in browser Открыть в браузере - + Resolve conflict … Разрешение конфликта … - + Move and rename … Переместить и переименовать … - + Move, rename and upload … Переместить, переименовать и загрузить … - + Delete local changes Удалить локальные изменения - + Move and upload … Переместить и загрузить … - + Delete Удалить @@ -4374,63 +4680,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (пропущено из-за предыдущей ошибки, повторная попытка через %2) - + Could not update file: %1 Не удалось обновить файл: %1 - + Could not update virtual file metadata: %1 Не удалось обновить метаданные виртуального файла: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 Не удалось сохранить запись о файле %1 в локальную базу данных - + Unresolved conflict. Неразрешённый конфликт. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Только %1 доступно, нужно как минимум %2 чтобы начать - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Не могу открыть или создать локальную базу данных синхронизации. Удостоверьтесь, что у вас есть доступ на запись в каталог синхронизации. - + Using virtual files with suffix, but suffix is not set Для виртуальных файлов настроено использование специального суффикса, но суффикс не указан - + Unable to read the blacklist from the local database Не удалось прочитать файл чёрного списка из локальной базы данных. - + Unable to read from the sync journal. Не удалось прочитать из журнала синхронизации. - + Cannot open the sync journal Не удаётся открыть журнал синхронизации @@ -4440,12 +4746,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Синхронизация возобновится в ближайшее время. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Мало места на диске: Скачивания, которые сократят свободное место ниже %1, будут пропущены. - + There is insufficient space available on the server for some uploads. На сервере недостаточно места для некоторых закачек. @@ -4514,59 +4820,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Скачать - + Add account Добавить аккаунт - + Open main dialog Открыть основное окно - - + + Pause sync Приостановить синхронизацию - - + + Resume sync Возобновить синхронизацию - + Settings Параметры - + Help Справка - + Exit %1 Закрыть %1 - + Pause sync for all Приостановить синхронизацию всех учётных записей - + Resume sync for all Возобновить синхронизацию всех учётных записей - + %1: %2 %1: %2 @@ -4574,24 +4880,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 клиент для ПК</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Версия %1. Для получения дополнительной информации нажмите <a href='%2'>сюда</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Используемый модуль поддержки виртуальных файлов: %1</small></p> - + <p>This release was supplied by %1</p> <p>Этот выпуск подготовлен %1</p> @@ -4599,22 +4905,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Не удалось получить поставщиков. - + Failed to fetch search providers for '%1'. Error: %2 Не удалось получить список поставщиков поиска %1: Ошибка: %2 - + Search has failed for '%2'. Ошибка поиска %2. - + Search has failed for '%1'. Error: %2 Ошибка поиска %1: Ошибка %2 @@ -4622,30 +4928,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Повторить передачу файлов на сервер + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Подтверждение удаления учётной записи - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Действительно удалить подключение к учётной записи <i>%1</i>?</p><p><b>Примечание:</b> Это действие <b>не</b> приведёт к удалению файлов.</p> - + Remove connection Удалить подключение - + Cancel Отмена @@ -4783,8 +5095,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Ошибка обновления метаданных из-за недопустимого времени модификации @@ -4792,8 +5104,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Ошибка обновления метаданных из-за недопустимого времени модификации @@ -4891,123 +5203,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Версия сервера не поддерживается - + 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. На сервере учётной записи «%1» используется неподдерживаемая версия %2. Использование этого клиента совместно с неподдерживаемым сервером не тестировалось и может быть небезопасным. Продолжайте на свой страх и риск. - + Disconnected Отключено - + Disconnected from some accounts Отключено от некоторых учётных записей - + Disconnected from %1 Отключен от %1 - + Disconnected from accounts: Отключен от учетных записей: - + Account %1: %2 Учетная запись %1: %2 - + Please sign in Войдите в систему - + Signed out Выполнен выход из учётной записи - + Account synchronization is disabled Синхронизация учётной записи отключена - - + + Synchronization is paused Синхронизация приостановлена - + Folder %1: %2 Каталог %1: %2 - + Unresolved conflicts Неразрешённые конфликты - + Up to date Актуальная версия - + Error during synchronization Ошибка во время синхронизации - + There are no sync folders configured. Синхронизация папок не настроена. - + No sync folders configured Не настроено ни одного каталога для синхронизации - + Checking for changes in remote "%1" Проверка изменений на сервере «%1» - + Checking for changes in local "%1" Проверка изменений в локальной папке «%1» - + Syncing %1 of %2 (%3 left) Синхронизация %1 из %2 (осталось %3) - + Syncing %1 of %2 Синхронизация %1 из %2 - + Syncing %1 (%2 left) Синхронизация %1 (осталось %2) - + Syncing %1 Синхронизация %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5159,27 +5471,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Новая папка - + You renamed %1 Вы переименовали «%1» - + You deleted %1 Вы удалили «%1» - + You created %1 Вы создали «%1» - + You changed %1 Вы изменили «%1» - + Synced %1 Файл «%1» синхронизирован @@ -5245,30 +5557,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Отметить как прочитанное + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share Для публикации ресурса требуется задать пароль - + Share password Пароль для доступа к ресурсу - + Sharing is disabled Публикация отключена - + This item cannot be shared. Этот объект не может быть опубликован - + Sharing is disabled. Публикация отключена. @@ -5284,7 +5672,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Не удалось подключиться к базе данных @@ -5342,6 +5730,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Показать больше результатов + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5405,67 +5809,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Статус работы в сети - + Online В сети - + Away Отошёл - + Do not disturb Не беспокоить - + Mute all notifications Отключить все уведомления - + Invisible Невидимый - + Appear offline Вне сети - + Status message Описание статуса - + What is your status? Опишите свой статус - + Clear status message after Убрать описание статуса через - + Cancel Отмена - + Clear status message Убрать описание статуса - + Set status message Описать статус @@ -5549,24 +5953,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Основное окно Nextcloud - + Current account Текущая учётная запись - - + + Resume sync for all Возобновить синхронизацию всех учётных записей - - + + Pause sync for all Приостановить синхронизацию всех учётных записей @@ -5576,22 +5980,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Задать статус - + Add account Добавить аккаунт - + Add new account Добавить учётную запись - + Settings Параметры - + Exit Выход @@ -5600,11 +6004,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Текущее изображение профиля - - - Current account avatar - Текущее изображение учётной записи - Current user status is online @@ -5616,70 +6015,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Текущий статус пользователя - не беспокоить - + + Current account avatar + Текущее изображение учётной записи + + + Current account status is online Текущий статус пользователя: в сети - + Current account status is do not disturb Текущий статус пользователя: не беспокоить - + + %1 - File activity + %1 - Файловая активность + + + Account switcher and settings menu Переключение уч. записей и настройки - + Open local folder of current account Открыть локальную папку текущей учетной записи - + Connected Подключено - + Disconnected Отключено - + Open Nextcloud Talk in browser Открыть Nextcloud Talk в браузере - + More apps Ещё приложения - + Open %1 in browser Открыть %1 в браузере - + Unified search results list Единый список результатов поиска - - - %1 - File activity - %1 - Файловая активность - main.cpp - + System Tray not available Панель системных значков недоступна - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. Для работы %1 требуется системный лоток значков. При использовании XFCE, следуйте <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">этим инструкциям</a>. В противном случае, установите приложение панели системных значков, например, 'trayer', и попробуйте ещё раз. @@ -5687,7 +6091,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Собрано из исходников Git версии <a href="%1">%2</a> на %3, %4 с использованием библиотек Qt %5, %6</small></p> @@ -5721,72 +6125,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Удалено - + Moved to %1 Перемещено в %1 - + Ignored Проигнорирован - + Filesystem access error Ошибка доступа к файловой системе - + Error Ошибка - + Updated local metadata Обновлены локальные метаданные - + Unknown Неизвестно - + downloading Получение с сервера - + uploading загрузка - + deleting удаление - + moving перемещение - + ignoring игнорирование - + error ошибка - + updating local metadata обновление локальных метаданных diff --git a/translations/client_sc.ts b/translations/client_sc.ts index b0a2473b4..e1eb83054 100644 --- a/translations/client_sc.ts +++ b/translations/client_sc.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Aberi %1 in locale - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Sa tràmuda de su cadinu non s'est contivigiada in custa prataforma - + Error removing "%1": %2 B'at àpidu un'errore boghende "%1": %2 - + Could not remove folder "%1" No at fatu a nche bogare sa cartella "%1" @@ -321,7 +331,7 @@ Su serbidore at torradu su còdighe HTTP irballiadu. Fiat isetende 204, ma at retzidu "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 No at fatu a isblocare sa cartella tzifrada %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Annulla @@ -400,12 +410,12 @@ Parit chi tengas sa funtzione Archìvios Virtuales ativada in custa cartella. Pro immoe, no faghet a iscarrigare in manera implìtzita archìvios virtuales cun tzifradura end-to-end. Pro otènnere sa mègius esperièntzia cun Archìvios Virtuales e sa tzifradura end-to-end, assegura•ti chi sa cartella tzifrada siat marcada cun "Pone semper a disponimentu in manera locale". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ No tzifres sa cartella - + Do not encrypt folder - + Encrypt folder Tzifra sa cartella - + No account configured. Perunu contu cunfiguradu. - - Display mnemonic - Visualiza mnemònicu + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Visualiza mnemònicu @@ -445,18 +455,23 @@ Ativa tzifradura - + + End-to-end encryption has been enabled for this account + + + + Warning Avisu - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Non podes tzifrare una cartella cun cuntenutos, boga·nche is archìvios. @@ -469,121 +484,121 @@ Iseta sa sincronizatzione noa, tando tzifra·dda. - + Encryption failed No at fatu a fàghere sa tzifradura - + Could not encrypt folder because the folder does not exist anymore No at fatu a tzifrare sa cartella, ca no esistit prus - - + + Open folder Aberi cartella - + Encrypt Tzifra - - + + Edit Ignored Files Modìfica is archìvios ignorados - - + + Create new folder Crea una cartella noa - - + + Availability Disponibilidade - + Choose what to sync Sèbera ite sincronizare - + Force sync now Fortza sa sincronizatzione immoe - + Restart sync Torra a cumintzare sa sincronizatzione - + Resume sync Riprìstina sincronizatzione - + Pause sync Firma sa sincronizatzione - + Remove folder sync connection Boga sa connessione pro sincronizare is cartellas - + Disable virtual file support … Disativa assistèntzia de is archìvios virtuales ... - + Enable virtual file support %1 … Ativa assistèntzia de is archìvios virtuales %1 … - + (experimental) (isperimentale) - + Folder creation failed Creatzione cartella faddida - + <p>Could not create local folder <i>%1</i>.</p> <p>No at fatu a creare una cartella locale <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Cunfirma bogadura connessione de sincronizatzione cartellas - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>A beru boles firmare sa sincronizatzione de is cartellas <i>%1</i>?</p><p><b>Mira:</b> custa operatzione <b>no</b> at a cantzellare perunu archìviu.</p> - + Remove Folder Sync Connection Boga connessione de sincronizatzione cartellas - + Disable virtual file support? Boles disativare s'assistèntzia de is archìvios virtuales? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ S'ùnicu profetu de disativare su suportu de is archìvios virtuales est ch Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. - + Disable support Disativa suportu @@ -606,144 +621,176 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Sincronizatzione in esecutzione - + The syncing operation is running.<br/>Do you want to terminate it? Sa sincronizatzione est in esecutzione.<br/> cheres a dda terminare? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) de %2 impreadu. Calicuna cartella, incluende cuddas montadas in sa rete o cuddas cumpartzidas, diant àere barrancos diferentes. - + %1 of %2 in use %1 de %2 impreados - + Currently there is no storage usage information available. Immoe non ddoe at informatziones a disponimentu subra de s'impreu de s'ispàtziu de archiviatzione. - + %1 in use %1 impreados - + %1 as %2 %1 comente %2 - + The server version %1 is unsupported! Proceed at your own risk. Sa versione %1 de su serbidore non est suportada! Sighi a arriscu tuo. - + Connected to %1. Connètidu a %1. - + Server %1 is temporarily unavailable. Su serbidore %1 pro immoe no est a disponimentu. - + Server %1 is currently in maintenance mode. Su serbidore %1 pro immoe en in modalidade de mantenidura. - + Signed out from %1. Disconnètidu dae %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Otenimentu de su permissu dae su navigadore. <a href='%1'>Incarca inoghe</a> pro torrare a abèrrere su navigadore. - + Connecting to %1 … Connetende·si a %1 … - + No connection to %1 at %2. Peruna connessione a %1 in %2. - + Server configuration error: %1 at %2. Ddoe at àpidu un'errore in su serbidore: %1 in %2. - + No %1 connection configured. Perunu connessione %1 configurada. - + There are folders that were not synchronized because they are too big: Ddoe at cartellas chi non sunt istadas sincronizadas ca sunt tropu mannas: - + There are folders that were not synchronized because they are external storages: Ddoe at cartellas chi non sunt istadas sincronizadas ca in foras ddoe at memòrias de archiviatzione: - + There are folders that were not synchronized because they are too big or external storages: Ddoe at cartellas chi non sunt istadas sincronizadas ca sunt tropu mannas o memòrias de archiviatziones de foras: - + Confirm Account Removal Cunfirma bogadura contu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>A beru nche boles bogare sa connessione a su contu <i>%1</i>?</p><p><b>Nota:</b> Custu <b>no</b> at a cantzellare perunu archìviu.</p> - + Remove connection Boga connessione - - + This account supports end-to-end encryption Custu contu non disponet de sa tzifradura end-to-end - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. OCC::ActivityListModel - + For more activities please open the Activity app. Pro àteras atividades, pro praghere, aberi s'aplicatzione Activity. @@ -808,12 +855,12 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. Is archìvios de s'elencu de non tènnere in contu gasi comente is ligòngios non sunt sincronizados. @@ -864,32 +911,59 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. OCC::Application - + Continuing will mean <b>deleting these settings</b>. A sighire bolet nàrrere a <b>nche cantzellare custas impostatziones</b>. - + Continuing will mean <b>ignoring these settings</b>. A sighire bolet nàrrere a <b>a non tènnere in contu custas impostatziones</b>. - + 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>. Calicuna impostatzione est istada cunfigurada in is versiones prus noas de custu cliente e impreat funtzionalidades chi non sunt a disponimentu in custa versione.<br><br>%1<br><br>S'archìviu de cunfiguratzione atuale est istadu giai postu in una còpia de seguridade in <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Essi·nche - + Continue Sighi - + Error accessing the configuration file Ddoe at àpidu un'errore intrende a s'archìviu de cunfiguratzione @@ -899,12 +973,12 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione.Ddoe at àpidu un'errore intrende a s'archìviu de cunfiguratzione su %1. Segura·ti chi a s'archìviu si potzat intrare dae s'utèntzia tua. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Essi·nche %1 @@ -950,56 +1024,216 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database DDoe at àpidu un'errore iscriende metadatos in sa base de datos @@ -1017,12 +1251,12 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione.Pro praghere, iscrie sa fràsia segreta de tzifradura end-to-end:<br><br>Utente: %2<br>Contu: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Pone sa fràsia segreta de E2E @@ -1198,8 +1432,8 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Errore de su serbidore: sa risposta PROPFIND no est in formadu XML! @@ -1207,27 +1441,27 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Ddoe at àpidu un'errore aberende sa cartella %1 - + Directory not accessible on client, permission denied Non faghet a intrare a sa cartella in su cliente, permissu negadu - + Directory not found: %1 Cartella no agatada: %1 - + Filename encoding is not valid Sa codìfica de su nùmene de s'archìviu no est vàlida - + Error while reading directory %1 Ddoe at àpidu un'errore leghende sa cartella %1 @@ -1235,83 +1469,83 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Custa atzione at a firmare cale si siat sincronizatzione immoe in esecutzione. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. No at fatu a generare is metadatos pro sa tzifradura. Isblocu de sa cartella @@ -1449,145 +1683,145 @@ Custu podet èssere un'errore de is librerias tuas OpenSSL. OCC::Folder - + Local folder %1 does not exist. Sa cartella locale %1 non b'est. - + %1 should be a folder but is not. %1 depiat èssere una cartella ma no est. - + %1 is not readable. %1 non faghet a ddu lèghere. - + %1 and %n other file(s) have been removed. %1 e %n àteros archìvios nche sunt bogados.%1 e %n àteros archìvios nche sunt bogados. - + %1 has been removed. %1 names a file. %1 nch'est istadu bogadu. - + %1 and %n other file(s) have been added. %1 e %n àteros archìvios nche sunt istados agiuntos.%1 e %n àteros archìvios nche sunt istados agiuntos. - + %1 has been added. %1 names a file. %1 nch'est istadu agiuntu. - + %1 and %n other file(s) have been updated. %1 e %n àteros archìvios sunt istados agiornados.%1 e %n àteros archìvios sunt istados agiornados. - + %1 has been updated. %1 names a file. %1 est istadu agiornadu. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 est istadu torradu a numenare comente %2 e %n àteros archìvios sunt istados torrados a numenare.%1 è stato rinominato in %2 e %n altri file sono stati rinominati. - + %1 has been renamed to %2. %1 and %2 name files. %1 est istadu torradu a numenare comente %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 est istadu tramudadu a %2 e %n àteros archìvios sunt istados tramudados.%1 est istadu tramudadu a %2 e %n àteros archìvios sunt istados tramudados. - + %1 has been moved to %2. %1 nch'est istadu tramudadu a %2. - + %1 has and %n other file(s) have sync conflicts. %1 e %n àteros archìvios ant cunflitos de sincronizatzione.%1 e %n àteros archìvios ant cunflitos de sincronizatzione. - + %1 has a sync conflict. Please check the conflict file! %1 at unu cunflitu de sincronizatzione. Controlla s'archìviu in cunflitu! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. 1% e %n àteros archìvios non sunt istados sincronizados pro errores. Controlla su log pro is detàllios.1% e %n àteros archìvios non sunt istados sincronizados pro errores. Controlla su log pro is detàllios. - + %1 could not be synced due to an error. See the log for details. %1 no at fatu a ddu sincronizare pro errores. Controlla su log pro is detàllios. - + %1 and %n other file(s) are currently locked. %1 e %n àteros archìvios sunt blocados immoe.%1 and %n other file(s) are currently locked. - + %1 is currently locked. %1 immoe est blocadu. - + Sync Activity Atividade de sincronizatzione - + Could not read system exclude file No at fatu a lèghere s'archìviu de esclusione de su sistema - + A new folder larger than %1 MB has been added: %2. Una cartella noa prus manna de %1 MB est istada agiunta: %2. - + A folder from an external storage has been added. Una cartella noa est istada agiunta dae una memòria de dae un'archiviatzione de foras. - + Please go in the settings to select it if you wish to download it. Pro praghere, bae a is impostatziones pro dda seletzionare si dda boles iscarrigare. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Sa cartella %1 est istada creada, ma in antis est istada lassada in foras de sa sincronizatzione, Is datos in intro no ant a èssere sincronizados. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. S'archìviu %1 est istadu creadu, ma in antis est istadu lassadu in foras de sa sincronizatzione. No at a èssere sincronizadu. - + 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). @@ -1600,7 +1834,7 @@ Custu bolet nàrrere chi sa sincronizatzione de su cliente diat pòdere non carr %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ Si detzides de ripristinare is archìvios, custos ant a èssere sincronizados to Si detzides de cantzellare is archìvios, non ant a èssere prus a disponimentu, francu chi sias tue su mere. - + 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. @@ -1621,17 +1855,17 @@ Ses seguru chi boles sincronizare custas atziones cun su serbidore? Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custos ddos at a torrare a sincronizare su serbidore. - + Remove All Files? Boles bogare totu is archìvios? - + Remove all files Boga totu is archìvios? - + Keep files Mantene is archìvios @@ -1667,22 +1901,22 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo OCC::FolderMan - + Could not reset folder state No at fatu a ripristinare s'istadu de sa cartella - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Agatadu unu registru betzu de archiviatzione "%1" ma non faghet a ddu bogare. Assegura•ti chi peruna aplicatzione siat impreende•ddu. - + (backup) (còpia de seguresa) - + (backup %1) (còpia de seguresa %1) @@ -1692,27 +1926,27 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo Istadu non definidu. - + Undefined state. - + Waiting to start syncing. Isetende chi cumintzet sa sincronizatzione. - + Preparing for sync. Aprontende sa sincronizatzione. - + Sync is running. Sa sincronizatzione est aviada. - + Sync finished with unresolved conflicts. Sincronizatzione agabbada cun cunflitos non isortos. @@ -1732,62 +1966,62 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo Firmadu dae s'utente. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Sa sincronizatzione est in pàusa. - + %1 (Sync is paused) %1 (Sincronizatzione in pàusa) - + No valid folder selected! Peruna cartella bàlida seletzionada! - + The selected path does not exist! Su caminu seletzionadu non b'est! - + The selected path is not a folder! Su caminu seletzionadu non b'est!! - + You have no permission to write to the selected folder! Non tenes su permissu pro iscrìere in sa cartella seletzionada! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Sa cartella locale %1 cuntenet giai una cartella impreada in una connessione de sincronizatzione de is cartellas. Seletziona·nde un'àtera! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Sa cartella locala %1 cuntenet giai una cartella impreada in una connessione de sincronizatzione de is cartellas. Seletziona·nde un'àtera! - + There is already a sync from the server to this local folder. Please pick another local folder! Esistet giai una sincronizatzione dae su serbidore a custa cartella locale. Seletziona·nde un'àtera locale! @@ -1800,7 +2034,7 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo Agiunghe connessiones de sincronizatzione cartellas - + File Archìviu @@ -1808,152 +2042,156 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo OCC::FolderStatusModel - + You need to be connected to add a folder Depes èssere connètidu pro agiùnghere una cartella - + Click this button to add a folder to synchronize. Incarca custu butone pro agiùnghere una sa cartella de sincronizare. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Ddoe àt àpidu un'errore carrighende sa lista de is cartellas dae su serbidore. - + Fetching folder list from server … Recòberu de s'elencu de cartellas dae su serbidore ... - + There are unresolved conflicts. Click for details. Ddoe at cunflitos ancora a isòrvere. Incarca pro is detàllios. - + Virtual file support is enabled. Sa ghia de is archìvios virtuales est ativadu. - + Signed out Essi·nche - + Synchronizing VirtualFiles with local folder Sincronizatzione de is archìvios virtuales cun sa cartella locale - + Synchronizing with local folder Sincronizatzione cun cartellas locales - + Checking for changes in remote "%1" Controllu de is modìficas in "%1" remotu - + Checking for changes in local "%1" Controllu de is modìficas in locale "%1" - + Reconciling changes Cuntzìliu torra de is modìficas - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Sincronizatzione %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) iscarrigamentu %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) carrigamentu %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 de %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 %5 abarradu, %1 de %2, archìviu %3 de %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 de %2, archìviu %3 de %4 - + file %1 of %2 archìviu %1 de %2 - + Waiting … Abeta … - + Waiting for %n other folder(s) … Isetende %n àteras cartella(s) …Abetende %n àteras cartella(s) … - + Preparing to sync … Aprontende sa sincronizatzione … @@ -2184,13 +2422,13 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo - + stable stàbile - + beta beta @@ -2242,32 +2480,32 @@ Si custu fiat un'errore e detzides de mantènnere is archìvios tuos, custo - + Create Debug Archive Crea archìviu de debug - + Server notifications that require attention. Serbidore de notìficas chi tocat a ddis dare contu. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. Non faghet a disativare s'aviamentu automàticu ca est ativu s'aviamentu automàticu a livellu de sistema. - + Change update channel? Boles cambiare su canale de agiornamentu? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Annota chi custu seletzionat isceti dae cale grùstiu prelevare is agiornamentos e chi non ddoe apant downgrade: duncas, a su sòlitu non faghet a torrare deretu dae su canale beta a su canale istàbile e custu cheret nàrrere a isetare una versione istàbile chi siat prus reghente de sa versione beta chi ddoe est immoe. - + Change update channel Càmbia su canale de agiornamentu - + Cancel Annulla - + Zip Archives Archìvios zip - + Debug Archive Created Archìviu debug creadu - + Debug archive is created at %1 S'archìviu de debug nch'est creadu in %1 @@ -2304,22 +2542,22 @@ Annota chi custu seletzionat isceti dae cale grùstiu prelevare is agiornamentos OCC::GetOrCreatePublicLinkShare - + Password for share required Recherta sa crae pro cumpartzire - + Please enter a password for your link share: Inserta una crae pro su ligòngiu pro cumpartzire: - + Sharing error Errore cumpartzinde - + Could not retrieve or create the public link share. Error: %1 @@ -2557,6 +2795,11 @@ Is elementos in ue est permitidu ant a èssere cantzellados si impedint de catza Close Serra + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2892,60 +3135,60 @@ Càstia chi s'impreu de cale si siat optzione de sa riga de cumandu de regi - + Use &virtual files instead of downloading content immediately %1 Imprea is archìvios &virtuales imbetzes de iscarrigare deretu su cuntenutu %1 - + (experimental) (isperimentale) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Is archìvios virtuales no sunt suportados pro is sorgentes de partzidura de Windows comente cartellas locales. Sèbera una sutacartella bàlida a suta de sa lìtera de su discu. - + %1 folder "%2" is synced to local folder "%3" Sa cartella %1 de "%2" est sincronizada cun sa cartella locale "%3" - + Sync the folder "%1" Sincroniza sa cartella "%1" - + Warning: The local folder is not empty. Pick a resolution! Avisu: sa cartella locale no est bòida. Sèbera unu remèdiu! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB Logu lìberu %1 - + Virtual files are not available for the selected folder Is archìvios virtuales non sunt a disponimentu pro sa cartella seletzionada - + Local Sync Folder Sincronizatzione cartella locale - - + + (%1) (%1) - + There isn't enough free space in the local folder! Non bastat su logu lìberu in sa cartella locale! @@ -3017,7 +3260,8 @@ Càstia chi s'impreu de cale si siat optzione de sa riga de cumandu de regi OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3049,144 +3293,144 @@ Càstia chi s'impreu de cale si siat optzione de sa riga de cumandu de regi OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Connètidu in manera curreta a %1: %2 versione %3 (%4)</font><br/><br/> - + Invalid URL URL non bàlidu - + Failed to connect to %1 at %2:<br/>%3 No at fatu a a si connètere a %1 in %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Tempus iscàdidu proende a si connètere a %1 in %2. - + Trying to connect to %1 at %2 … Intentu de connessione a %1 in %2... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Sa dimanda autenticada a su serbidore s'est torrada a deretare a '%1'. Su URL est isballiadu, su serbidore no est cunfiguradu in manera curreta. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Atzessu negadu dae su serbidore. Pro èssere seguros de àere is permissos giustos, <a href="%1">incarca inoghe</a> pro intrare a su sevìtziu cun su navigadore tuo. - + There was an invalid response to an authenticated WebDAV request Retzida una risposta non bàlida a una dimanda WebDAV autenticada - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Sa cartella de sincronizatzione locale %1 b'est giai, impostada pro sa sincronizatzione.<br/><br/> - + Creating local sync folder %1 … Creatzione dae sa cartella locale de sincronizatzione %1... - + OK AB - + failed. faddidu. - + Could not create local folder %1 No at fatu a creare sa cartella %1 - + No remote folder specified! Peruna cartella remota ispetzificada! - + Error: %1 Errore: %1 - + creating folder on Nextcloud: %1 creende una cartella in Nextcloud: %1 - + Remote folder %1 created successfully. Sa creatzione de sa cartella remota %1 est andada bene . - + The remote folder %1 already exists. Connecting it for syncing. Sa cartella remota %1 b'est giai. Connetende·dda pro dda sincronizare. - - + + The folder creation resulted in HTTP error code %1 Sa creatzione de sa cartella at torradu un'errore HTTP còdighe %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Sa creatzione de sa cartella remota est faddida ca mancari is credentziales sunt isballiadas.<br/>Torra in segus e controlla is credentziales.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Sa creatzione de sa cartella remota no est andada bene ca mancari is credentziales sunt isballiadas.</font><br/>Torra in segus e controlla is credentziales tuas.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Creatzione de sa cartella remota %1 faddida cun errore <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Istabilida una connessione de sincronizatzione dae %1 a sa cartella remota %2. - + Successfully connected to %1! Connessione a %1 renèssida! - + Connection to %1 could not be established. Please check again. Sa connessione a %1 non faghet a dda istabilire. Proa torra. - + Folder rename failed No at fatu a torrare a numenare sa cartella - + Cannot 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. No at fatu a catzare o copiare sa cartella ca sa cartella o s'archìviu in intro est abertu in un àteru programma. Serra sa cartella o s'archìviu e incarca Proa torra o annulla s'impostatzione. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Cartella locale %1 creada in manera curreta!</b></font> @@ -3209,12 +3453,12 @@ Càstia chi s'impreu de cale si siat optzione de sa riga de cumandu de regi - + Enable experimental feature? Boles ativare sa funtzionalidade isperimentale? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Passende a custa modalidade s'at a interrumpire cale si siat sincronizatzio Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnala is problemas chi ant a essire a campu. - + Enable experimental placeholder mode Ativa sa modalidade isperimentale marcalogu - + Stay safe Abarra in su seguru @@ -3264,162 +3508,167 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Is ligòngios simbòlicos non sunt suportados in sa sincronizatzione. - + File is listed on the ignore list. Archìviu postu in s'elencu de is ignorados. - + File names ending with a period are not supported on this file system. Is nùmenes chi agabbant cun unu puntu non sunt suportados in custu archìviu de sistema. - + File names containing the character "%1" are not supported on this file system. Is archìvios cun in intro su caràtere "%1" non sunt suportados in custu archìviu de su sistema. - + File name contains at least one invalid character Su nùmene de su'archìviu tenet a su mancu unu caràtere non bàlidu - + The file name is a reserved name on this file system. Su nùmene de s'archìviu est unu nùmene riservadu a custu archìviu de sistema. - + Filename contains trailing spaces. Su nùmene de s'archìviu cuntenet tretos a sa fine. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Su nùmene de s'archìviu est tropu longu. - + File/Folder is ignored because it's hidden. S'archìviu/cartella ignoradu ca cuadu. - + Stat failed. Stat faddida. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Cunflitu: versione de su serbidore iscarrigada, còpia locale torrada a numenare e non carrigada. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Su nùmene de s'archìviu non podet èssere codificada in s'archìviu tuo de sistema. - + The filename is blacklisted on the server. Su nùmene de s'archìviu est in sa lista niedda de su serbidore. - + File has extension reserved for virtual files. S'archìviu at un'estensione riservada a is archìvios virtuales. - + size mannària - + permission - + file id id de s'archìviu - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! Iscòrriu carrighende una cartella. Custa s'at a cantzellare! - + Conflict when uploading a file. It's going to get removed! Iscòrriu carrighende un'archìviu. Custu s'at a cantzellare! - + Ignored because of the "choose what to sync" blacklist Ignoradu ca in sa lista niedda de is cosas de no sincronizare - + Not allowed because you don't have permission to add subfolders to that folder Non podes ca non tenes su permissu pro agiùnghere sutacartellas a custas cartellas - + Not allowed because you don't have permission to add files in that folder Non podes ca non tenes su permissu pro agiùnghere archìvios a custa cartella - + Not allowed to upload this file because it is read-only on the server, restoring Non podes carrigare custu archìviu ca in su serbidore podes isceti lèghere, riprìstinu - + Moved to invalid target, restoring Tramudadu a un'indiritzu non bàlidu, riprìstinu - + Not allowed to remove, restoring Non ddu podes bogare, riprìstinu - + Error while reading the database Errore leghende sa base de datos - + Server replied with an error while reading directory "%1" : %2 Su serbidore nd'at torradu un'errore leghende sa cartella "%1" : %2 @@ -3427,22 +3676,22 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 Errore agiornende is metadatos: %1 - + File is currently in use S'archìviu est giai impreadu @@ -3455,19 +3704,19 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal - + File %1 cannot be downloaded because encryption information is missing. S'archìviu %1 non faghet a dd'iscarrigare ca non b'at informatziones de tzifradura. - - + + File has changed since discovery Archìviu cambiadu in pessu rilevadu - + Could not delete file record %1 from local DB @@ -3478,32 +3727,32 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal S'archìviu %1 nn faghet a dd'iscarrigare pro unu cunflitu cun su nùmene de s'archìviu locale! - + File %1 can not be downloaded because of a local file name clash! S'archìviu %1 non podet èssere iscarrigadu pro unu cunflitu cun un'archìviu locale! - + The download would reduce free local disk space below the limit S'iscarrigamentu at a torrare a suta de su lìmite su logu lìberu in su discu locale - + Free space on disk is less than %1 Su logu lìberu in su discu est prus pagu de %1 - + File was deleted from server S'archìviu est cantzelladu dae su serbidore - + The file could not be downloaded completely. No at fatu a iscarrigare s'archìviu de su totu - + The downloaded file is empty, but the server said it should have been %1. S'archìviu iscarrigadu est bòidu, ma su serbidore at indicadu una mannària de %1. @@ -3513,18 +3762,23 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal S'archìviu %1 non podet èssere sarvadu pro unu cunflitu in unu'archìviu locale! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Errore agiornende is metadatos: %1 - + The file %1 is currently in use S'archìviu %1 est giai impreadu @@ -3545,7 +3799,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 no at fatu a cantzellare s'archìviu %1, errore: %2 @@ -3556,16 +3810,21 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 No at fatu a creare sa cartella %1 - + Error updating metadata: %1 Errore agiornende is metadatos: %1 - + The file %1 is currently in use S'archìviu %1 est giai impreadu @@ -3573,7 +3832,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash No at fatu a nche bogare %1 ca ddoe est unu cunflitu in su nùmene de s'archìviu locale @@ -3586,46 +3845,51 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash S'archìviu %1 non faghet a ddu torrare a numenare %2 pro unu cunflitu cun su nùmene de s'archìviu locale - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Errore impostende s'istadu de su pin - - + + Error updating metadata: %1 Errore agiornende is metadatos: %1 - + The file %1 is currently in use S'archìviu %1 est giai impreadu - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file No at fatu a torrare a numenare s'archìviu @@ -3646,7 +3910,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Còdighe HTTP isballiadu torradu dae su serbidore. Atesu 204, ma retzidu "%1 %2". @@ -3659,12 +3923,12 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal Còdighe HTTP isballiadu torradu dae su serbidore. Atesu 201, ma retzidu "%1 %2". - + Error writing metadata to the database: %1 Errore iscriende is metadatos in sa base de datos: %1 - + The file %1 is currently in use S'archìviu %1 est giai impreadu @@ -3672,42 +3936,42 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 No at fatu a torrare a numenare %1 in %2, errore: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Còdighe HTTP isballiadu torradu dae su serbidore. Atesu 201, ma retzidu "%1 %2". - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Errore agiornende is metadatos: %1 - + The file %1 is currently in use S'archìviu %1 est giai impreadu - + Error setting pin state Errore impostende s'istadu de su pin - + Error writing metadata to the database Errore iscriende metadatos in sa base de datos @@ -3897,7 +4161,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::ServerNotificationHandler - + Reply @@ -3915,23 +4179,23 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal Impostatziones - + %1 Settings This name refers to the application name e.g Nextcloud impostatziones de %1 - + General Generale - + Network Rete - + Account Contu @@ -3939,17 +4203,22 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4025,7 +4294,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,169 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Cumpartzidura de su menu cuntestuale - + Select new location … Seletziona positzione noa ... - + I shared something with you Apo cumpartzidu una cosa cun tegus - - + + Share options Sèberos de cumpartzidura - - + + Activity - + Copy private link to clipboard Còpia ligòngios privados in punta de billete - + Send private link by email … Imbia unu ligòngiu privadu tràmite posta eletrònica ... + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Non faghet a torrare a cumpartzire - + Resharing this folder is not allowed Non faghet a torrare a cumpartzire custa cartella - - + + Copy public link Còpia ligòngiu pùblicu - + Copy internal link Còpia ligòngiu internu - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Modìfica - + Open in browser Aberi in su navigadore - + Resolve conflict … Isorve cunflitu ... - + Move and rename … Tràmuda e torra a numenare ... - + Move, rename and upload … Tràmuda, torra a numenare e carriga ... - + Delete local changes Cantzella càmbios locales - + Move and upload … Tràmuda e carriga ... - + Delete Cantzella @@ -4377,63 +4683,63 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (brincadu pro un'errore pretzedente, proende torra in %2) - + Could not update file: %1 No at fatu a carrigare custu archìviu: %1 - + Could not update virtual file metadata: %1 No at fatu a nche carrigare is metadatos de is archìvios virtuales: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Cunflitu non isortu. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Sunt disponìbiles isceti %1, serbint isceti %2 pro cumintzare - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Impossìbile a abèrrere o a creare sa base de datos locale de sincronizatzione. Segura·ti de àere atzessu de iscritura in sa cartella de sincronizatzione. - + Using virtual files with suffix, but suffix is not set Impreu de is archìvios virtuales, ma su sufissu non est impostadu - + Unable to read the blacklist from the local database Non at fatu a lèghere sa lista niedda de sa base de datos locale - + Unable to read from the sync journal. No at fatu a lèghere dae su registru de sincronizatzione. - + Cannot open the sync journal Non faghet a abèrrerer su registru de sincronizatzione @@ -4443,12 +4749,12 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Su logu in su discu est pagu: is iscarrigamentos chi diant pòdere minimare su logu lìberu suta de %1 s'ant a lassare. - + There is insufficient space available on the server for some uploads. Non b'at logu in su serbidore pro unos cantos carrigamentos. @@ -4517,59 +4823,59 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::Systray - + Download - + Add account Agiunghe contu - + Open main dialog Aberi sa bentana printzipale - - + + Pause sync Pone in pasu sa sincronizatzione - - + + Resume sync Torra a cumintzare sa sincronizatzione - + Settings Impostatziones - + Help - + Exit %1 Essi·nche dae %1 - + Pause sync for all Pone in pasu sa sincronizatzione de totu - + Resume sync for all Torra a cumintzare sa sincronizatzione de totu - + %1: %2 %1: %2 @@ -4577,24 +4883,24 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Cliente de iscrivania</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Versione %1. Pro àteras informatziones incarca <a href='%2'>inoghe</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Impreende s'estensione de archìvios virtuales: %1</small></p> - + <p>This release was supplied by %1</p> <p>Custa versione est dispensada dae %1</p> @@ -4602,22 +4908,22 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4625,30 +4931,36 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::User - + Retry all uploads Torra a proare totu is carrigamentos + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Cunfirma bogada de su contu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>A beru nche cheres bogare sa connessione a su contu <i>%1</i>?</p><p><b>Mira:</b> custu <b>no at a</b> cantzellare perunu archìviu.</p> - + Remove connection Boga connessione - + Cancel Annulla @@ -4786,8 +5098,8 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4795,8 +5107,8 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4894,123 +5206,123 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal OCC::ownCloudGui - + Unsupported Server Version Versione de su serbidore non suportada - + 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. Su serbidore de su contu %1 esecutat una versione non suportada %2. S'impreu de custu cliente cun versiones non suportadas non est istadu verificadu e podet èssere perigulosu. Sighi a arriscu tuo. - + Disconnected Disconnètidu - + Disconnected from some accounts Disconnètidu dae unu contu - + Disconnected from %1 Disconnètidu dae %1 - + Disconnected from accounts: Disconnètidu dae is contos: - + Account %1: %2 Contu %1: %2 - + Please sign in Intra - + Signed out Essi - + Account synchronization is disabled Sa sincronizatzione de su contu est disativada - - + + Synchronization is paused Sincronizatzione in pasu - + Folder %1: %2 Cartella %1: %2 - + Unresolved conflicts Cunflitos non isortos - + Up to date Agiornadu - + Error during synchronization Errore in sa sincronizatzione - + There are no sync folders configured. Non b'at cartellas cunfiguradas - + No sync folders configured Peruna cartella cunfigurada pro sa sincronizatzione - + Checking for changes in remote "%1" Controllu de is modìficas in "%1" remotu - + Checking for changes in local "%1" Controllu de is modìficas in locale "%1" - + Syncing %1 of %2 (%3 left) Sincronizende %1 de %2 (%3 nd'abbarrant) - + Syncing %1 of %2 Sincronizende %1 de %2 - + Syncing %1 (%2 left) Sincronizende %1 (%2 nd'abbarrant) - + Syncing %1 Sincronizende %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5474,27 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal Cartella noa - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5248,30 +5560,106 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5287,7 +5675,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal SyncJournalDb - + Failed to connect database. No at fatu a si connètere sa base de datos. @@ -5345,6 +5733,22 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5408,67 +5812,67 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal UserStatusSelector - + Online status Istadu in lìnia - + Online In lìnia - + Away Ausente - + Do not disturb No istorbes - + Mute all notifications - + Invisible Invisìbile - + Appear offline - + Status message Messàgiu de istadu - + What is your status? Cale est s'istadu tuo? - + Clear status message after Lìmpia su messàgiu de istadu a pustis - + Cancel - + Clear status message Lìmpia su messàgiu de istadu - + Set status message Imposta messàgiu de istadu @@ -5552,24 +5956,24 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal Window - + Nextcloud desktop main dialog Bentana printzipale de Nextcloud de iscrivania - + Current account Contu atuale - - + + Resume sync for all Riprìstina sincronizatzione pro totu - - + + Pause sync for all Pone in pasu sincronizatzione pro totu @@ -5579,22 +5983,22 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal Imposta istadu de s'utente - + Add account Agiunghe contu - + Add new account Agiunghe unu contu - + Settings Impostatziones - + Exit Essi @@ -5603,11 +6007,6 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal Current user avatar Avatar atuale de s'utente - - - Current account avatar - - Current user status is online @@ -5619,70 +6018,75 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal S'istadu atuale de s'utente est chi non si cheret istorbadu - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu Ischertadore de contu e impostatziones de su menu - + Open local folder of current account Aberi sa cartella locale in su contu atuale - + Connected Connètidu - + Disconnected Disconnètidu - + Open Nextcloud Talk in browser Aberi Nextcloud Talk in su navigadore - + More apps Àteras aplicatziones - + Open %1 in browser Aberi %1 in su navigadore - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Sa safata de sistema no est a disponimentu - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 rechedet una safata de sistema. Si ses impreende XFCE, sighi <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">custa istrutziones</a>. Sinunca, installa un'aplicatzione safata de sistema comente a 'trayer' e torra a proare. @@ -5690,7 +6094,7 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Cumpiladu dae sa versione Git <a href="%1">%2</a> on %3, %4 impreende Qt %5, %6</small></p> @@ -5724,72 +6128,77 @@ Custa est una modalidade noa, isperimentale. Si detzides de dda impreare, sinnal + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Cantzelladu - + Moved to %1 Tramudadu a %1 - + Ignored Ignoradu - + Filesystem access error Errore de intrada a su sistema de is archìvios - + Error Errore - + Updated local metadata Metadatos locales agiornados - + Unknown Disconnotu - + downloading iscarrighende - + uploading carrighende - + deleting cantzellende - + moving tramudende - + ignoring ignorende - + error errore - + updating local metadata carrighende metadatos locales diff --git a/translations/client_sk.ts b/translations/client_sk.ts index 51dbe1ae2..df09c1715 100644 --- a/translations/client_sk.ts +++ b/translations/client_sk.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Otvoriť %1 lokálne - + In %1 V %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Zobraziť ďalšie akcie @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Odmietnuť + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Zoznam aktivít @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Vymazať menu správ o stave @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity Aktivita - + Sharing Zdieľanie @@ -226,12 +236,12 @@ Presúvanie do koša nie je v tejto platforme k dispozícii - + Error removing "%1": %2 Chyba pri odstraňovaní "%1": %2 - + Could not remove folder "%1" Nepodarilo sa odstrániť priečinok "%1" @@ -321,7 +331,7 @@ Server vrátil neplatný HTTP kód. Očakávaný bol 204, ale vrátený bol "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Zlyhalo odomknutie zašifrovaného adresára %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Súbor %1 je už uzamknutý od %2. - + Lock operation on %1 failed with error %2 Operácia uzamknutia na %1 zlyhala s chybou %2 - + Unlock operation on %1 failed with error %2 Operácia odomknutia na %1 zlyhala s chybou %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Zrušiť @@ -400,12 +410,12 @@ Vyzerá, že podpora Virtuálnych Súborov je na tomto priečinku zapnutá. V súčasnosti nie je možné stiahnuť virtuálne súbory ktoré sú šifrované End-to-End. Pre získanie najlepšieho výsledku s Virtuálnymi súbormi a End-to-End šifrovaním, ubezpečte sa že šifrovaný priečinok je označený ako "Vždy dostupné lokálne". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Nezašifrovať adresár - + Do not encrypt folder Nešifrovať priečinok - + Encrypt folder Zašifrovať adresár - + No account configured. Nie je nastavený žiadny učet. - - Display mnemonic - Zobraziť mnemotechnické + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Zobraziť mnemotechnické @@ -445,18 +455,23 @@ Zapnúť šifrovanie - + + End-to-end encryption has been enabled for this account + + + + Warning Varovanie - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Nemôžete zašifrovať priečinok s obsahom, odstráňte súbory. @@ -469,121 +484,121 @@ Počkajte na novú synchronizáciu a potom ho zašifrujte. Tento účet podporuje šifrovanie End-to-End - + Encryption failed Šifrovanie zlyhalo - + Could not encrypt folder because the folder does not exist anymore Nemôžem zašifrovať priečinok, pretože daný priečinok už neexituje - - + + Open folder Otvoriť priečinok - + Encrypt Zašifrovať - - + + Edit Ignored Files Upraviť ignorované súbory - - + + Create new folder Vytvoriť nový adresár - - + + Availability Dostupnosť - + Choose what to sync Vyberte, čo sa má synchronizovať - + Force sync now Vynútiť synchronizáciu teraz - + Restart sync Reštartovať synchronizáciu - + Resume sync Pokračovať v synchronizácii - + Pause sync Pozastaviť synchronizáciu - + Remove folder sync connection Odstrániť prepojenie synchronizácie priečinka - + Disable virtual file support … Vypnúť podporu virtuálnych súborov ... - + Enable virtual file support %1 … Zapnúť podproru virtuálnych súborov %1 … - + (experimental) (experimentálne) - + Folder creation failed Vytvorenie priečinka zlyhalo - + <p>Could not create local folder <i>%1</i>.</p> <p>Nie je možné vytvoriť lokálny priečinok <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Potvrdiť odstránenie prepojenia synchronizácie priečinka - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Naozaj si prajete zastaviť synchronizácu priečinka <i>%1</i>?</p><p><b>Poznámka:</b> Toto <b>nevymaže</b> žiadne súbory.</p> - + Remove Folder Sync Connection Odstrániť prepojenie synchronizácie priečinka - + Disable virtual file support? Vypnúť podporu virtuálnych súborov? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Jediná výhoda vypnutia podpory virtuálnych súborov je možnosť opätovného Táto akcia zruší všetky prebiehajúce synchronizácie. - + Disable support Zakázať podporu @@ -606,144 +621,176 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Prebieha synchronizácia - + The syncing operation is running.<br/>Do you want to terminate it? Proces synchronizácie práve prebieha.<br/>Chcete ho ukončiť? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) z %2 je využitých. Niektoré priečinky, vrátane sieťových a zdieľaných, môžu mať iné limity. - + %1 of %2 in use %1 z %2 je využitých - + Currently there is no storage usage information available. Momentálne nie sú k dispozícii žiadne informácie o využití ukladacieho priestoru. - + %1 in use %1 sa používa - + %1 as %2 %1 ako %2 - + The server version %1 is unsupported! Proceed at your own risk. Verzia serveru %1 nie je podporovaná! Pokračujte na vlastné riziko. - + Connected to %1. Pripojené k %1 - + Server %1 is temporarily unavailable. Server %1 je dočasne nedostupný. - + Server %1 is currently in maintenance mode. Server %1 je momentálne v režime údržby. - + Signed out from %1. Odhlásené z %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Získavam autorizáciu z prehliadača. <a href='%1'>Kliknite sem</a> na opätovné otvorenie prehliadača. - + Connecting to %1 … Pripája sa k %1 … - + No connection to %1 at %2. Žiadne pripojenie k %1 na %2. - + Server configuration error: %1 at %2. Chyba konfigurácie serveru: %1 na %2. - + No %1 connection configured. Žiadne nakonfigurované %1 spojenie - + There are folders that were not synchronized because they are too big: Tieto priečinky neboli synchronizované pretože sú príliš veľké: - + There are folders that were not synchronized because they are external storages: Niektoré priečinky neboli synchronizované, pretože sú na externom úložisku - + There are folders that were not synchronized because they are too big or external storages: Niektoré priečinky neboli synchronizované, pretože sú príliš veľké alebo sú na externom úložisku - + Confirm Account Removal Potvrďte ostránenie účtu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Naozaj chcete odstrániť pripojenie k účtu <i>%1</i>?</p><p><b>Poznámka:</b> Tým sa <b>nevymažú</b> žiadne súbory.</p> - + Remove connection Odstrániť prepojenie - - + This account supports end-to-end encryption Tento účet podporuje šifrovanie end-to-end - + Set up encryption Nastaviť šifrovanie - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. OCC::ActivityListModel - + For more activities please open the Activity app. Pre viac aktivít otvorte aplikáciu Aktivity. @@ -808,12 +855,12 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. Získavam aktivity... - + Fetching activities … Nahrávam aktivity ... - + Files from the ignore list as well as symbolic links are not synced. Súbory zo zoznamu ignorovaných ako aj symbolické linky sa nesynchronizujú. @@ -864,32 +911,59 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Pokračovanie bude znamenať <b>zmazanie týchto nastavení </b>. - + Continuing will mean <b>ignoring these settings</b>. Pokračovanie bude znamenať <b>ignorovanie týchto nastavení </b>. - + 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>. Niektoré nastavenia boli nakonfigurované v novších verziách tohto klienta a používajú funkcie, ktoré v tejto verzii nie sú k dispozícii.<br><br>% 1<br><br>Aktuálny konfiguračný súbor bol už zálohovaný do <i>% 2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Ukončiť - + Continue Pokračovať - + Error accessing the configuration file Chyba pri prístupe ku konfiguračnému súboru @@ -899,12 +973,12 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. Pri prístupe ku konfiguračnému súboru na %1 sa vyskytla chyba. Uistite sa, že váš používateľ má prístup k súboru. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Pri prístupe ku konfiguračnému súboru na %1 sa vyskytla chyba. Uistite sa, že váš používateľ má prístup k súboru. - + Quit %1 Ukončiť %1 @@ -950,56 +1024,216 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. Súbor %1 má neplatný čas poslednej zmeny. Nenahrávajte ho na server. - + File Removed (start upload) %1 Súbor odobratý (spustiť nahrávanie) %1 - + File %1 has invalid modification time. Do not upload to the server. Súbor %1 má neplatný čas poslednej zmeny. Nenahrávajte ho na server. - + Local file changed during syncing. It will be resumed. Lokálny súbor bol zmenený počas synchronizácie. Nahrávanie bude obnovené. - - + + Local file changed during sync. Lokálny súbor bol zmenený počas synchronizácie. - + Network error: %1 Chyba siete: %1 - + Error updating metadata: %1 Chyba pri aktualizácii metadát: %1 - + The file %1 is currently in use Súbor %1 sa v súčasnosti používa - + The local file was removed during sync. Lokálny súbor bol odstránený počas synchronizácie. - + Restoration failed: %1 Obnovenie zlyhalo: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Chyba pri zápise metadát do databázy @@ -1017,12 +1251,12 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. Zadajte svoju prístupovú frázu pre šifrovanie medzi koncovými bodmi: <br><br>Používateľ: %2<br>Účet: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Zadajte E2E prístupovú frázu @@ -1198,8 +1432,8 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Chyba servera: odpoveď PROPFIND nie je vo formáte XML. @@ -1207,27 +1441,27 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Chyba pri otváraní adresára %1 - + Directory not accessible on client, permission denied Priečinok nie je prístupný pre klienta, prístup odmietnutý - + Directory not found: %1 Adresár nebol nájdený: %1 - + Filename encoding is not valid Kódovanie znakov názvu súboru je neplatné - + Error while reading directory %1 Chyba pri načítavaní adresára %1 @@ -1235,83 +1469,83 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. OCC::EditLocallyJob - + Invalid token received. Bol prijatý neplatný token. - - - - - - + + + + + + Please try again. Prosím, skúste to znova. - + Invalid file path was provided. Bola zadaná neplatná cesta k súboru. - + Could not find an account for local editing. Nepodarilo sa nájsť účet pre miestne úpravy. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ Táto akcia zruší všetky prebiehajúce synchronizácie. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Nepodarilo sa vygenerovať metadata na šifrovanie. Priečinok bude odomknutý. @@ -1449,145 +1683,145 @@ Môže to byť problém s knižnicami OpenSSL. OCC::Folder - + Local folder %1 does not exist. Lokálny priečinok %1 neexistuje. - + %1 should be a folder but is not. %1 by mal byť priečinok, avšak nie je. - + %1 is not readable. %1 nie je čitateľný. - + %1 and %n other file(s) have been removed. %1 a %n iný súbor bol odstránený.%1 a %n iné súbory boli odstránené.%1 a %n iných súborov bolo odstránených.%1 a %n iných súborov bolo odstránených. - + %1 has been removed. %1 names a file. %1 bol zmazaný. - + %1 and %n other file(s) have been added. %1 a %n iných súbor(ov) bolo pridaných.%1 a %n iných súbor(ov) bolo pridaných.%1 a %n iných súbor(ov) bolo pridaných.%1 a %n iných súbor(ov) bolo pridaných. - + %1 has been added. %1 names a file. %1 bol pridaný. - + %1 and %n other file(s) have been updated. %1 a %n iný súbor bol nahratý.%1 a %n iné súbory boli nahraté.%1 a %n iných súborov bolo nahratých.%1 a %n iných súborov bolo nahratých. - + %1 has been updated. %1 names a file. %1 bol aktualizovaný. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 bol premenovaný na %2 a %n iný súbor bol premenovaný.%1 bol premenovaný na %2 a %n iné súbory boli premenované.%1 bol premenovaný na %2 a %n iných súborov bolo premenovaných.%1 bol premenovaný na %2 a %n iných súborov bolo premenovaných. - + %1 has been renamed to %2. %1 and %2 name files. %1 bol premenovaný na %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 bol presunuý do %2 a %n iných súbor bol presunutý.%1 bol presunuý do %2 a %n iné súbory boli presunuté.%1 bol presunuý do %2 a %n iných súborov bolo presunutých.%1 bol presunuý do %2 a %n iných súborov bolo presunutých. - + %1 has been moved to %2. %1 bol presunutý do %2. - + %1 has and %n other file(s) have sync conflicts. %1 má a %n iný súbor má synchronizačný konflikt.%1 má a %n iné súbory majú synchronizačný konflikt.%1 má a %n iných súborov má synchronizačný konflikt.%1 má a %n iných súborov má synchronizačný konflikt. - + %1 has a sync conflict. Please check the conflict file! %1 má synchronizačný konflikt. Prosím skontrolujte konfliktný súbor! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 a %n iný súbor nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.%1 a %n iné súbory nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.%1 a %n iných súborov nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.%1 a %n iných súborov nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti. - + %1 could not be synced due to an error. See the log for details. %1 nemôže byť synchronizovaný kvôli chybe. Pozrite sa do logu pre podrobnosti. - + %1 and %n other file(s) are currently locked. %1 a %n ďalších súborov je práve blokovaných.%1 a %n ďalších súborov je práve blokovaných.%1 a %n ďalších súborov je práve blokovaných.%1 a %n ďalších súborov je práve blokovaných. - + %1 is currently locked. %1 je momentálne zamknutý - + Sync Activity Aktivita synchronizácie - + Could not read system exclude file Nemožno čítať systémový exclude file - + A new folder larger than %1 MB has been added: %2. Bol pridaný nový priečinok väčší ako %1 MB: %2. - + A folder from an external storage has been added. Bol pridaný priečinok z externého úložiska. - + Please go in the settings to select it if you wish to download it. Ak si to prajete prevziať, tak prejdite do nastavení a vyberte to. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Priečinok %1 bol vytvorený, ale bol už skôr vylúčený zo synchronizácie. Nebude preto synchronizovaný. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Súbor %1 bol vytvorený, ale bol už skôr vylúčený zo synchronizácie. Nebude preto synchronizovaný. - + 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). @@ -1600,7 +1834,7 @@ To znamená, že klient synchronizácie nemusí okamžite odovzdať lokálne zme % 1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ Ak sa rozhodnete lokálne súbory ponechať, budú znovu synchronizované so ser Ak sa rozhodnete súbory vymazať tak následne už nebudú dostupné, ak nie ste vlastník. - + 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. @@ -1620,17 +1854,17 @@ Ste si istí, že chcete tieto akcie synchronizovať so serverom? Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizované zo servera. - + Remove All Files? Odstrániť všetky súbory? - + Remove all files Odstrániť všetky súbory - + Keep files Ponechať súbory @@ -1666,22 +1900,22 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo OCC::FolderMan - + Could not reset folder state Nemožno resetovať stav priečinka - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Bol nájdený starý žurnál synchronizácie "%1", avšak nemôže byť odstránený. Prosím uistite sa, že žiadna aplikácia ho práve nevyužíva. - + (backup) (záloha) - + (backup %1) (záloha %1) @@ -1691,27 +1925,27 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo Nedefinovaný stav. - + Undefined state. Nedefinovaný stav. - + Waiting to start syncing. Čaká sa na začiatok synchronizácie - + Preparing for sync. Príprava na synchronizáciu. - + Sync is running. Synchronizácia prebieha. - + Sync finished with unresolved conflicts. Synchronizácia skončila s nevyriešenými konfliktami. @@ -1731,62 +1965,62 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo Zrušené používateľom. - + Last sync was successful. Posledná synchronizácia bola úspešná. - + Setup error. Chyba pri inštalácii. - + Sync request was cancelled. Žiadosť o synchronizáciu bola zrušená. - + Sync is paused. Synchronizácia je pozastavená. - + %1 (Sync is paused) %1 (Synchronizácia je pozastavená) - + No valid folder selected! Nebol zvolený platný priečinok. - + The selected path does not exist! Zvolená cesta neexistuje! - + The selected path is not a folder! Zvolená cesta nie je priečinok. - + You have no permission to write to the selected folder! Nemáte oprávnenia pre zápis do daného priečinka! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Lokálny priečinok %1  už obsahuje podpriečinok použitý pre synchronizáciu. Vyberte prosím iný priečinok. - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Lokálny priečinok %1 už obsahuje podpriečinok použitý pre synchronizáciu. Vyberte prosím iný priečinok. - + There is already a sync from the server to this local folder. Please pick another local folder! Do tohto lokálneho priečinka sa už synchronizuje. Vyberte prosím iný priečinok. @@ -1799,7 +2033,7 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo Pridať prepojenie synchronizačného priečinka - + File Súbor @@ -1807,152 +2041,156 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo OCC::FolderStatusModel - + You need to be connected to add a folder Na pridanie priečinku je nutné byť pripojený - + Click this button to add a folder to synchronize. Kliknutím na toto tlačidlo pridáte priečinok na synchronizáciu. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Pri načítavní zoznamu priečinkov zo servera nastala chyba. - + Fetching folder list from server … Načítava sa zoznam priečinkov zo servera… - + There are unresolved conflicts. Click for details. Existujú nevyriešené konflikty. Podrobnosti zobrazíte kliknutím. - + Virtual file support is enabled. Podpora virtuálnych súborov povolená. - + Signed out Odhlásený - + Synchronizing VirtualFiles with local folder Synchronizujem virtuálne súbory s lokálnym priečinkom - + Synchronizing with local folder Synchronizujem lokálny priečinok - + Checking for changes in remote "%1" Kontrolujú sa zmeny vo vzdialenom "%1" - + Checking for changes in local "%1" Kontrolujú sa zmeny v lokálnom "%1" - + Reconciling changes Zosúladenie zmien - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synchronizuje sa %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) stiahnuť %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) nahrať %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 of %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Zostáva niekoľko sekúnd, %1 z %2, súbor %3 z %4 - + %5 left, %1 of %2, file %3 of %4 %5 zostáva, %1 z %2, súbor %3 z %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 z %2, súbor %3 z %4 - + file %1 of %2 súbor %1 z %2 - + Waiting … Čaká sa… - + Waiting for %n other folder(s) … Čaká sa na %n priečinok...Čaká sa na %n priečinky...Čaká sa na %n priečinkov...Čaká sa na %n priečinkov... - + Preparing to sync … Pripravuje sa synchronizácia... @@ -2183,13 +2421,13 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo - + stable stabilné - + beta beta @@ -2241,32 +2479,32 @@ Ak to bol omyl a rozhodnete sa tieto súbory ponechať, budú opäť synchronizo - + Create Debug Archive Vytvoriť debug archív - + Server notifications that require attention. Zobrazovať hlásenie, ktoré vyžadujú pozornosť. - + Show call notification dialogs. Zobraziť dialógové okná upozornení na hovory. - + You cannot disable autostart because system-wide autostart is enabled. Nemôžete vypnúť autoštart pretože autoštart je zapnutý na systémov úrovni. - + Change update channel? Zmeniť aktualizáciu kanálu? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Upozorňujeme, že sa tým vyberie iba to, odkiaľ sa aktualizácie budú sťahovať, a že nedôjde k nijakému downgrade. Takže návrat z beta kanála do stabilného kanála sa zvyčajne nedá vykonať okamžite a znamená čakať na stabilnú verziu, ktorá je novšia ako aktuálne nainštalovaná beta verzia. - + Change update channel Zmeniť aktualizáciu kanálu - + Cancel Zrušiť - + Zip Archives Zip archívy - + Debug Archive Created Archív ladiacich informácii vytvorený - + Debug archive is created at %1 Archív ladiacich informácií vytvorený %1 @@ -2303,22 +2541,22 @@ Upozorňujeme, že sa tým vyberie iba to, odkiaľ sa aktualizácie budú sťaho OCC::GetOrCreatePublicLinkShare - + Password for share required Pre sprístupnenie je potrebné heslo - + Please enter a password for your link share: Zadajte heslo pre sprístupnenie pomocou odkazu: - + Sharing error Chyba sprístupnenia - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Položky, pri ktorých je povolené odstraňovanie sa vymažú, ak bránia odstr Close Zatvoriť + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Upozorňujeme, že použitie akýchkoľvek príkazov pre logovanie z príkazové - + Use &virtual files instead of downloading content immediately %1 Použiť virtuálne súbory namiesto okamžitého sťahovania obsahu %1 - + (experimental) (experimentálne) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Virtuálne súbory nie sú podporované na koreňovej partícii Windows ako lokálny priečinok. Prosím vyberte validný priečinok pod písmenom disku. - + %1 folder "%2" is synced to local folder "%3" %1 priečinok "%2" je zosynchronizovaný do lokálneho priečinka "%3" - + Sync the folder "%1" Sychronizovať priečinok "%1" - + Warning: The local folder is not empty. Pick a resolution! Varovanie: Lokálny priečinok nie je prázdny. Vyberte riešenie! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 voľného miesta - + Virtual files are not available for the selected folder Virtuálne súbory sú nedostupné pre vybraný priečinok - + Local Sync Folder Lokálny synchronizačný priečinok - - + + (%1) (%1) - + There isn't enough free space in the local folder! V lokálnom priečinku nie je dostatok voľného miesta! @@ -3016,7 +3259,8 @@ Upozorňujeme, že použitie akýchkoľvek príkazov pre logovanie z príkazové OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Nie je možné získať čas poslednej zmeny pre súbor v konflikte %1 @@ -3048,144 +3292,144 @@ Upozorňujeme, že použitie akýchkoľvek príkazov pre logovanie z príkazové OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Úspešne pripojené k %1: %2 verzie %3 (%4)</font><br/><br/> - + Invalid URL Neplatná URL - + Failed to connect to %1 at %2:<br/>%3 Zlyhalo spojenie s %1 o %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Časový limit vypršal pri pokuse o pripojenie k %1 na %2. - + Trying to connect to %1 at %2 … Pokus o pripojenie k %1 na %2... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Overená požiadavka na server bola presmerovaná na "%1". URL je zlá, server nie je správne nakonfigurovaný. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Prístup zamietnutý serverom. Po overení správnych prístupových práv, <a href="%1">kliknite sem</a> a otvorte službu v svojom prezerači. - + There was an invalid response to an authenticated WebDAV request Neplatná odpoveď na overenú WebDAV požiadavku - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Lokálny synchronizačný priečinok %1 už existuje, prebieha jeho nastavovanie pre synchronizáciu.<br/><br/> - + Creating local sync folder %1 … Vytváranie lokálneho priečinka pre synchronizáciu %1... - + OK OK - + failed. neúspešné. - + Could not create local folder %1 Nemožno vytvoriť lokálny priečinok %1 - + No remote folder specified! Vzdialený priečinok nie je nastavený! - + Error: %1 Chyba: %1 - + creating folder on Nextcloud: %1 Vytvára sa priečinok v Nextcloud: %1 - + Remote folder %1 created successfully. Vzdialený priečinok %1 bol úspešne vytvorený. - + The remote folder %1 already exists. Connecting it for syncing. Vzdialený priečinok %1 už existuje. Prebieha jeho pripájanie pre synchronizáciu. - - + + The folder creation resulted in HTTP error code %1 Vytváranie priečinka skončilo s HTTP chybovým kódom %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Proces vytvárania vzdialeného priečinka zlyhal, lebo použité prihlasovacie údaje nie sú správne!<br/>Prosím skontrolujte si vaše údaje a skúste to znovu.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Vytvorenie vzdialeného priečinka pravdepodobne zlyhalo kvôli nesprávnym prihlasovacím údajom.</font><br/>Prosím choďte späť a skontrolujte ich.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Vytvorenie vzdialeného priečinka %1 zlyhalo s chybou <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Synchronizačné spojenie z %1 do vzdialeného priečinka %2 bolo práve nastavené. - + Successfully connected to %1! Úspešne pripojené s %1! - + Connection to %1 could not be established. Please check again. Pripojenie k %1 nemohlo byť iniciované. Prosím skontrolujte to znovu. - + Folder rename failed Premenovanie priečinka zlyhalo - + Cannot 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. 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 alebo súbor a skúste to znovu alebo zrušte akciu. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Lokálny synchronizačný priečinok %1 bol úspešne vytvorený!</b></font> @@ -3208,12 +3452,12 @@ Upozorňujeme, že použitie akýchkoľvek príkazov pre logovanie z príkazové Zrušiť - + Enable experimental feature? Povoliť experimentálnu funkciu? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Prepnutím do tohto režimu sa preruší akákoľvek aktuálne prebiehajúca syn Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste všetky problémy, ktoré sa objavia. - + Enable experimental placeholder mode Povoliť experimentálny mód zástupcu. - + Stay safe Zostať v bezpečí @@ -3264,162 +3508,167 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Symbolické odkazy nie sú podporované pri synchronizácii. - + File is listed on the ignore list. Súbor je zapísaný na zozname ignorovaných. - + File names ending with a period are not supported on this file system. Názvy súborov končiacich bodkou nie sú na tomto súborovom systéme podporované. - + File names containing the character "%1" are not supported on this file system. Názvy súborov obsahujúce znak "%1" nie sú na tomto súborovom systéme podporované. - + File name contains at least one invalid character Názov súboru obsahuje nepovolený znak - + The file name is a reserved name on this file system. Názov súboru je na tomto súborovom systéme rezervovaným názvom. - + Filename contains trailing spaces. Názov súboru obsahuje medzery na konci. - + Filename contains leading spaces. Názov súboru obsahuje medzery na začiatku. - + Filename contains leading and trailing spaces. Názov súboru obsahuje medzery na začiatku a na konci. - + Filename is too long. Meno súboru je veľmi dlhé. - + File/Folder is ignored because it's hidden. Súbor/priečinok je ignorovaný, pretože je skrytý - + Stat failed. Nepodarilo sa získať informácie o súbore. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Prevzatá verzia zo servera, lokálna kópia premenovaná a neodovzdaná. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Názov súboru nemôže byť na tomto súborovom systéme enkódovaný. - + The filename is blacklisted on the server. Súbor je na tomto serveri na čiernej listine. - + File has extension reserved for virtual files. Prípona súboru je rezervovaná pre virtuálne súbory. - + size veľkosť - + permission oprávnenie - + file id id súboru - + Server reported no %1 Server nevrátil žiadne %1 - + Cannot sync due to invalid modification time Chyba pri synchronizácii z dôvodu neplatného času poslednej zmeny - + Error while deleting file record %1 from the database Chyba pri mazaní záznamu o súbore %1 z databázy - + Conflict when uploading a folder. It's going to get cleared! Konflikt pri nahrávaní priečinka. Bude odstránený! - + Conflict when uploading a file. It's going to get removed! Konflikt pri nahrávaní súboru. Bude odstránený! - + Ignored because of the "choose what to sync" blacklist Ignorované podľa nastavenia "vybrať čo synchronizovať" - + Not allowed because you don't have permission to add subfolders to that folder Nie je dovolené, lebo nemáte oprávnenie pridávať podpriečinky do tohto priečinka - + Not allowed because you don't have permission to add files in that folder Nie je možné, pretože nemáte oprávnenie pridávať súbory do tohto priečinka - + Not allowed to upload this file because it is read-only on the server, restoring Nie je dovolené tento súbor nahrať, pretože je na serveri iba na čítanie, obnovujem - + Moved to invalid target, restoring Presunuté do neplatného cieľa, obnovujem - + Not allowed to remove, restoring Nie je dovolené odstrániť, obnovujem - + Error while reading the database Chyba pri čítaní z databáze - + Server replied with an error while reading directory "%1" : %2 Server odpovedal chybne počas načítania priečinka "%1" : %2 @@ -3427,22 +3676,22 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::PropagateDirectory - + could not delete file %1 from local DB nie je možné vymazať súbor %1 z lokálnej DB - + Error updating metadata due to invalid modification time Chyba pri aktualizácii metadát z dôvodu neplatného času poslednej zmeny - + Error updating metadata: %1 Chyba pri aktualizácii metadát: %1 - + File is currently in use Súbor sa v súčasnosti používa @@ -3455,19 +3704,19 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v nie je možné získať súbor %1 z lokálnej DB - + File %1 cannot be downloaded because encryption information is missing. Súbor %1 nie je možné prevziať, pretože chýbajú informácie o šifrovaní. - - + + File has changed since discovery Súbor sa medzitým zmenil - + Could not delete file record %1 from local DB Nie je možné vymazať záznam o súbore %1 z lokálnej DB @@ -3478,32 +3727,32 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje! - + File %1 can not be downloaded because of a local file name clash! Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje! - + The download would reduce free local disk space below the limit Sťahovanie by znížilo miesto na lokálnom disku pod nastavený limit - + Free space on disk is less than %1 Voľné miesto na disku je menej ako %1 - + File was deleted from server Súbor bol vymazaný zo servera - + The file could not be downloaded completely. Súbor sa nedá stiahnuť úplne. - + The downloaded file is empty, but the server said it should have been %1. Prebratý súbor je prázdny napriek tomu, že server oznámil, že mal mať %1. @@ -3513,18 +3762,23 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Súbor %1 nie je možné uložiť, pretože jeho názov koliduje s názvom lokálneho súboru! - - + + File %1 has invalid modified time reported by server. Do not save it. Súbor %1 má neplatný čas poslednej zmeny nahlásený serverom. Neukladajte si to. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Chyba pri aktualizácii metadát: %1 - + The file %1 is currently in use Súbor %1 sa v súčasnosti používa @@ -3545,7 +3799,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 nie je možné vymazať súbor %1, chyba: %2 @@ -3556,16 +3810,21 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Nemôžem vytvoriť priečinok %1 - + Error updating metadata: %1 Chyba pri aktualizácii metadát: %1 - + The file %1 is currently in use Súbor %1 sa v súčasnosti používa @@ -3573,7 +3832,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Nemožno odstrániť %1 z dôvodu kolízie názvu súboru s lokálnym súborom @@ -3586,46 +3845,51 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Súbor %1 nemôže byť premenovaný na %2 z dôvodu, že tento názov je už použitý - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB nie je možné získať súbor %1 z lokálnej DB - + Error setting pin state Chyba pri nastavovaní stavu pin-u - - + + Error updating metadata: %1 Chyba pri aktualizácii metadát: %1 - + The file %1 is currently in use Súbor %1 sa v súčasnosti používa - - + + Could not delete file record %1 from local DB Nie je možné vymazať záznam o súbore %1 z lokálnej DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Nepodarilo sa premenovať súbor @@ -3646,7 +3910,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Server vrátil neplatný HTTP kód. Očakávaný bol 204, ale vrátený bol "%1 %2". @@ -3659,12 +3923,12 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Server vrátil neplatný HTTP kód. Očakávaný bol 201, ale vrátený bol "%1 %2". - + Error writing metadata to the database: %1 Chyba pri zápise metadát do databázy: %1 - + The file %1 is currently in use Súbor %1 sa v súčasnosti používa @@ -3672,42 +3936,42 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 nie je možné premenovať %1 na %2, chyba: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Server vrátil neplatný HTTP kód. Očakávaný bol 201, ale vrátený bol "%1 %2". - + could not get file %1 from local DB nie je možné získať súbor %1 z lokálnej DB - + Could not delete file record %1 from local DB Nie je možné vymazať záznam o súbore %1 z lokálnej DB - + Error updating metadata: %1 Chyba pri aktualizácii metadát: %1 - + The file %1 is currently in use Súbor %1 sa v súčasnosti používa - + Error setting pin state Chyba pri nastavovaní stavu pin-u - + Error writing metadata to the database Chyba pri zápise metadát do databázy @@ -3897,7 +4161,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::ServerNotificationHandler - + Reply Odpovedať @@ -3915,23 +4179,23 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Nastavenia - + %1 Settings This name refers to the application name e.g Nextcloud %1 Nastavenia - + General Všeobecné - + Network Sieť - + Account Účet @@ -3939,17 +4203,22 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::ShareModel - + Share link Zdieľať odkaz - + Link share Zdieľaný odkaz - + + Internal link + + + + Enter a note for the recipient Zadajte poznámku pre príjemcu @@ -4025,7 +4294,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,169 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Sprístupnenie kontextovej ponuky - + Select new location … Zadajte novú polohu ... - + I shared something with you Niečo som vám sprístupnil - - + + Share options Možnosti zdieľania - - + + Activity Aktivity - + Copy private link to clipboard Kopírovať privátny odkaz do schránky - + Send private link by email … Odoslať privátny odkaz e-mailom… + + + Expire in %1 minutes + remaining time before lock expire + Platnosť skončí o %1 minútuPlatnosť skončí o %1 minútyPlatnosť skončí o %1 minútPlatnosť skončí o %1 minút + - + Leave this share - + Resharing this file is not allowed Opätovné sprístupňovanie tohto súboru je zakázané - + Resharing this folder is not allowed Opätovné zdieľanie tohto adresára je zakázané - - + + Copy public link Kopírovať verejný odkaz - + Copy internal link Kopírovať interný odkaz - + + Encrypt + + + + Lock file Zamknúť súbor - + Unlock file Odomknúť súbor - + Locked by %1 Zamknuté od %1 - - Expire in %1 minutes - remaining time before lock expire - Platnosť skončí o %1 minútuPlatnosť skončí o %1 minútyPlatnosť skončí o %1 minútPlatnosť skončí o %1 minút - - - + Expires in %1 minutes remaining time before lock expires Vyprší za %1 minútuVyprší za %1 minútyVyprší za %1 minúťVyprší za %1 minúť - + Edit Upraviť - + Open in browser Otvoriť v prehliadači - + Resolve conflict … Vyriešiť konflikt ... - + Move and rename … Presunúť a premenovať ... - + Move, rename and upload … Presunúť. remenovať a nahrať ... - + Delete local changes Zrušiť lokálne zmeny - + Move and upload … Presunúť a nahrať ... - + Delete Zmazať @@ -4377,63 +4683,63 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (vynechané kvôli predchádzajúcej chybe, ďalší pokus o %2) - + Could not update file: %1 Nemôžem aktualizovať súbor: %1 - + Could not update virtual file metadata: %1 Nemôžem aktualizovať metadáta virtuálneho súboru: %1 - + Could not update file metadata: %1 Nemôžem aktualizovať metadáta súboru: %1 - + Could not set file record to local DB: %1 Nie je možné vytvoriť záznam o súbore v lokálnej DB: %1 - + Unresolved conflict. Nevyriešený konflikt. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Je dostupných len %1, pre spustenie je potrebných aspoň %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Nie je možné otvoriť alebo vytvoriť miestnu synchronizačnú databázu. Skontrolujte či máte právo na zápis do synchronizačného priečinku. - + Using virtual files with suffix, but suffix is not set Používate virtuálne súbory s príponou, ale prípona nie je nastavená - + Unable to read the blacklist from the local database Nepodarilo sa načítať čiernu listinu z miestnej databázy - + Unable to read from the sync journal. Nemožno čítať zo synchronizačného žurnálu - + Cannot open the sync journal Nemožno otvoriť sync žurnál @@ -4443,12 +4749,12 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Synchronizácia bude čoskoro pokračovať. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Na disku dochádza voľné miesto. Sťahovanie, ktoré by zmenšilo voľné miesto pod %1 bude vynechané. - + There is insufficient space available on the server for some uploads. Na serveri nie je pre niektoré z nahrávaných súborov dostatok voľného miesta. @@ -4517,59 +4823,59 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::Systray - + Download Sťahovanie - + Add account Pridať účet - + Open main dialog Otvoriť hlavné dialógové okno - - + + Pause sync Pozastaviť synchronizáciu - - + + Resume sync Pokračovať v synchronizácii - + Settings Nastavenia - + Help Pomoc - + Exit %1 Ukončiť %1 - + Pause sync for all Pozastaviť synchronizáciu pre všetky účty - + Resume sync for all Pokračovať v synchronizácii pre všetky účty - + %1: %2 %1: %2 @@ -4577,24 +4883,24 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Klient %1 pre počítač</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Verzia %1. Viac informácií získate <a href='%2'>kliknutím sem</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Používa zásuvný modul virtuálnych súborov: %1</small></p> - + <p>This release was supplied by %1</p> <p>Toto vydanie bolo poskytnuté %1</p> @@ -4602,22 +4908,22 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Nepodarilo sa načítať poskytovateľov. - + Failed to fetch search providers for '%1'. Error: %2 Nepodarilo sa načítať poskytovateľov vyhľadávania pre „%1“. Chyba: %2 - + Search has failed for '%2'. Vyhľadávanie '%2' zlyhalo. - + Search has failed for '%1'. Error: %2 Vyhľadávanie '%1' zlyhalo. Chyba: %2 @@ -4625,30 +4931,36 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::User - + Retry all uploads Zopakovať všetky nahrávania + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Potvrďte ostránenie účtu - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Naozaj chcete odstrániť pripojenie k účtu <i>%1</i>?</p><p><b>Poznámka:</b> Týmto sa <b>neodstránia</b> žiadne súbory.</p> - + Remove connection Vymazať prepojenie - + Cancel Zrušiť @@ -4786,8 +5098,8 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Chyba pri aktualizácii metadát z dôvodu neplatného času poslednej zmeny @@ -4795,8 +5107,8 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Chyba pri aktualizácii metadát z dôvodu neplatného času poslednej zmeny @@ -4894,123 +5206,123 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v OCC::ownCloudGui - + Unsupported Server Version Nepodporovaná verzia servera - + 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. Server na účte %1  používa starú a nepodporovanú verziu %2. Používanie tohto klienta s nepodporovanými verziami servera nie je testované a môže byť nebezpečné. Pokračujte len na vlastné riziko. - + Disconnected Odpojený - + Disconnected from some accounts Odpojené od niektorých účtov - + Disconnected from %1 Odpojený od %1 - + Disconnected from accounts: Odpojené od účtov: - + Account %1: %2 Účet %1: %2 - + Please sign in Prihláste sa prosím - + Signed out Odhlásený - + Account synchronization is disabled Synchronizácia účtu je vypnutá - - + + Synchronization is paused Synchronizácia je pozastavená - + Folder %1: %2 Priečinok %1: %2 - + Unresolved conflicts Nevyriešené konflikty - + Up to date Aktuálne - + Error during synchronization Chyba počas synchronizácie - + There are no sync folders configured. Nie sú nastavené žiadne priečinky na synchronizáciu. - + No sync folders configured Nie sú nastavené žiadne synchronizačné priečinky - + Checking for changes in remote "%1" Kontrolujú sa zmeny vo vzdialenom "%1" - + Checking for changes in local "%1" Kontrolujú sa zmeny v lokálnom "%1" - + Syncing %1 of %2 (%3 left) Synchronizuje sa %1 z %2 (zostáva %3) - + Syncing %1 of %2 Synchronizuje sa %1 z %2 - + Syncing %1 (%2 left) Synchronizuje sa %1 (zostáva %2) - + Syncing %1 Synchronizuje sa %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5474,27 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Nový priečinok - + You renamed %1 Premenovali ste %1 - + You deleted %1 Zmazali ste %1 - + You created %1 Vytvorili ste %1 - + You changed %1 Zmenili ste %1 - + Synced %1 Zosynchronizované %1 @@ -5248,30 +5560,106 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Označiť ako prečítané + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share Pre nové zdieľanie sa vyžaduje heslo - + Share password Zdieľať heslo - + Sharing is disabled Zdieľanie je zakázané - + This item cannot be shared. Túto položku nie je možné zdieľať. - + Sharing is disabled. Zdieľanie je zakázané. @@ -5287,7 +5675,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v SyncJournalDb - + Failed to connect database. Nepodarilo sa pripojiť k databáze. @@ -5345,6 +5733,22 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Načítať viac výsledkov + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5408,67 +5812,67 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v UserStatusSelector - + Online status Stav pripojenia - + Online Pripojené - + Away Preč - + Do not disturb Nerušiť - + Mute all notifications Stíšiť všetky upozornenia - + Invisible Neviditeľný - + Appear offline V odpojenom režime - + Status message Správa o stave - + What is your status? Aký je váš stav? - + Clear status message after Vyčistiť správu o stave po - + Cancel Zrušiť - + Clear status message Vyčistiť správu o stave - + Set status message Nastaviť správu o stave @@ -5552,24 +5956,24 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Window - + Nextcloud desktop main dialog Hlavné dialógové okno pracovnej plochy Nextcloud - + Current account Aktuálny účet - - + + Resume sync for all Pokračovať v synchronizácii pre všetky účty - - + + Pause sync for all Pozastaviť synchronizáciu pre všetky účty @@ -5579,22 +5983,22 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Nastaviť status užívateľa - + Add account Pridať účet - + Add new account Pridať nový účet - + Settings Nastavenia - + Exit Ukončiť @@ -5603,11 +6007,6 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Current user avatar Avatar aktuálneho užívateľa - - - Current account avatar - Avatar aktuálneho účtu - Current user status is online @@ -5619,70 +6018,75 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v Stav aktuálneho užívateľa je nerušiť - + + Current account avatar + Avatar aktuálneho účtu + + + Current account status is online Stav aktuálneho účtu je pripojený - + Current account status is do not disturb Stav aktuálneho účtu je nerušiť - + + %1 - File activity + %1 - Aktivita súboru + + + Account switcher and settings menu Prepínač účtov a menu nastavení - + Open local folder of current account Otvoriť lokálny priečinok aktuálneho účtu - + Connected Pripojené - + Disconnected Odpojené - + Open Nextcloud Talk in browser Otvoriť Nextcloud Talk v prehliadači - + More apps Viac aplikácií - + Open %1 in browser Otvoriť %1 v prehliadači - + Unified search results list Jednotný zoznam výsledkov vyhľadávania - - - %1 - File activity - %1 - Aktivita súboru - main.cpp - + System Tray not available Systémová lišta "tray" neprístupná - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 vyžaduje funkčnú systémovú lištu "tray". Pokiaľ používate prostredie XFCE, prosím pokračujte <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">podľa týchto inštrukcií</a>. Inak si prosím nainštalujte aplikáciu systémovej lišty "tray" ako napr. 'trayer' a skúste to znova. @@ -5690,7 +6094,7 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Zostavené z Git revízie <a href="%1">%2</a> na %3, %4 s použitím Qt %5, %6</small></p> @@ -5724,72 +6128,77 @@ Toto je nový experimentálny režim. Ak sa ho rozhodnete použiť, nahláste v + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Zmazané - + Moved to %1 Presunuté do %1 - + Ignored Ignorované - + Filesystem access error Chyba prístupu k súborovému systému - + Error Chyba - + Updated local metadata Aktualizované lokálne metadáta - + Unknown Neznámy - + downloading sťahujem - + uploading nahrávam - + deleting vymazávanie - + moving presúvanie - + ignoring ignorujem - + error chyba - + updating local metadata aktualizujú sa lokálne metadáta diff --git a/translations/client_sl.ts b/translations/client_sl.ts index 5e4d02e3f..88ab91d52 100644 --- a/translations/client_sl.ts +++ b/translations/client_sl.ts @@ -2,55 +2,60 @@ ActivityItem - + Open %1 locally Odpri datoteko %1 krajevno - + In %1 - + V %1 ActivityItemActions - - + + Show more actions - + Pokaži več dejanj ActivityItemContent - + Dismiss - + Opusti + + + + Open file details + Odpri podrobnosti datoteke Open share dialog - + Odpri pogovorno okno souporabe ActivityList - + Activity list Seznam dejavnosti No activities yet - + Ni še zabeležene dejavnosti BasicComboBox - + Clear status message menu @@ -70,7 +75,7 @@ Decline - + Zavrni @@ -183,20 +188,25 @@ Error - + Napaka FileDetailsPage - + + Dismiss + Opusti + + + Activity - + Dejavnost - + Sharing - + Souporaba @@ -204,7 +214,7 @@ File details of %1 · %2 - + Podrobnosti datoteke %1 · %2 @@ -226,12 +236,12 @@ V tem okolju premikanje predmetov v smeti ni mogoče. - + Error removing "%1": %2 Prišlo je do napake med odstranjevanjem »%1«: %2 - + Could not remove folder "%1" Mape »%1« ni mogoče odstraniti. @@ -321,7 +331,7 @@ S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 204, prejet pa je bil »%1 %2«. - + "%1 Failed to unlock encrypted folder %2". »%1: odklepanje šifrirane mape %2 je spodletelo.« @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Datoteka %1 je že zaklenjena (%2). - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Prekliči @@ -400,12 +410,12 @@ Kaže, da imate na tej mapi omogočeno možnost navideznih datotek. Trenutno ni mogoče neposredno prejeti tovrstnih datotek, če so šifrirane po protokolu E2E. Za najenostavnejše delo z navideznimi datotekami poskrbite, da je šifrirana mapa označena kot »Vedno na voljo krajevno«. - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Ne šifriraj mape - + Do not encrypt folder - + Encrypt folder Šifriraj mapo - + No account configured. Ni nastavljenega računa. - - Display mnemonic - Pokaži mnemoniko + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Pokaži mnemoniko @@ -445,18 +455,23 @@ Omogoči šifriranje - + + End-to-end encryption has been enabled for this account + + + + Warning Opozorilo - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Mape z vsebino ni mogoče šifrirati. Najprej je treba datoteke odstraniti in začeti znova. @@ -469,121 +484,121 @@ S prazno mapo počakajte na konec usklajevanja, potem jo znova šifrirajte. - + Encryption failed Šifriranje je spodletelo - + Could not encrypt folder because the folder does not exist anymore Mape ni mogoče šifrirati, ker ne obstaja več. - - + + Open folder Odpri mapo - + Encrypt Šifriraj - - + + Edit Ignored Files Uredi neusklajevane datoteke - - + + Create new folder Ustvari novo mapo - - + + Availability Razpoložljivost - + Choose what to sync Izbor predmetov za usklajevanje - + Force sync now Vsili takojšnje usklajevanje - + Restart sync Ponovno zaženi usklajevanje - + Resume sync Nadaljuj z usklajevanjem - + Pause sync Premor usklajevanja - + Remove folder sync connection Odstrani povezavo za usklajevanje mape - + Disable virtual file support … Onemogoči podporo za navidezne datoteke ... - + Enable virtual file support %1 … Omogoči podporo za navidezne datoteke %1 ... - + (experimental) (preizkusno) - + Folder creation failed Ustvarjanje mape je spodletelo - + <p>Could not create local folder <i>%1</i>.</p> <p>Ni mogoče ustvariti krajevne mape <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Potrdi odstranjevanje povezave usklajevanja mape - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ali res želite zaustaviti usklajevanje mape <i>%1</i>?</p><p><b>Opomba:</b> s tem datoteke iz odjemalca <b>ne bodo</b> odstranjene.</p> - + Remove Folder Sync Connection Odstrani povezavo za usklajevanje mape - + Disable virtual file support? Ali želite onemogočiti podporo navideznih datotek? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ Edina prednost onemogočanja te podpore je, da bo spet na voljo izbirno usklajev S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. - + Disable support Onemogoči podporo @@ -606,147 +621,179 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Usklajevanje je v teku - + The syncing operation is running.<br/>Do you want to terminate it? Izvaja se usklajevanje.<br/>Ali želite opravilo prekiniti? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) od %2 v uporabi. Nekatere mape, vključno s priklopljenimi mapami in mapami v souporabi, imajo morda različne omejitve. - + %1 of %2 in use %1 od %2 v uporabi - + Currently there is no storage usage information available. Trenutno ni na voljo nobenih podatkov o porabi prostora. - + %1 in use Skupna velikost je %1 - + %1 as %2 %1 z računom %2 - + The server version %1 is unsupported! Proceed at your own risk. Različica strežnika %1 ni podprta! Nadaljujete na lastno odgovornost. - + Connected to %1. Vzpostavljena je povezava s strežnikom %1. - + Server %1 is temporarily unavailable. Strežnik %1 trenutno ni dosegljiv. - + Server %1 is currently in maintenance mode. Strežnik %1 je trenutno v vzdrževalnem načinu. - + Signed out from %1. Uspešno odjavljeno iz %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Poteka pridobitev overitve po brskalniku. <a href='%1'>Kliknite</a> to za ponovno odpiranje brskalnika. - + Connecting to %1 … Poteka vzpostavljanje povezave s strežnikom %1 ... - + No connection to %1 at %2. S strežnikom %1 ni vzpostavljene povezave (%2). - + Server configuration error: %1 at %2. Napaka nastavitve strežnika: %1 na %2 - + No %1 connection configured. Ni nastavljene povezave %1. - + There are folders that were not synchronized because they are too big: Zaznane so mape, ki zaradi omejitve velikosti niso bile usklajene: - + There are folders that were not synchronized because they are external storages: Zaznane so mape, ki so del zunanje shrambe, zato niso bile usklajene: - + There are folders that were not synchronized because they are too big or external storages: Zaznane so mape, ki zaradi omejitve velikosti, ali zato, ker so del zunanje shrambe, niso bile usklajene: - + Confirm Account Removal Potrdi odstranjevanje računa - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ali res želite odstraniti povezavo z računom <i>%1</i>?</p><p><b>Opomba:</b> odstranitev povezave <b>ne izbriše</b> nobene datoteke.</p> - + Remove connection Odstrani povezavo - - + This account supports end-to-end encryption Račun podpira celovito šifriranje E2E - + Set up encryption - + Nastavitev šifriranja - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Zahteva za overitev s strežnikom je bila preusmerjena na »%1«. Naslov URL ni veljaven ali pa strežnik ni ustrezno nastavljen. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Strežnik ne dovoli dostopa. Če želite preveriti, ali imate ustrezna dovoljenja, <a href="%1">kliknite</a> za dostop do te storitve z brskalnikom. + + + + There was an invalid response to an authenticated WebDAV request + Zaznan je neveljaven odziv za zahtevo overitve WebDAV + + OCC::AccountState @@ -798,22 +845,22 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. OCC::ActivityListModel - + For more activities please open the Activity app. Za izpis več dejavnosti odprite program Dejavnost Fetching activities… - + Poteka pridobivanje dejavnosti ... - + Fetching activities … - + Poteka pridobivanje dejavnosti ... - + Files from the ignore list as well as symbolic links are not synced. Datoteke, ki so na seznamu neusklajevanja, in simbolne povezave se ne usklajujejo. @@ -864,32 +911,59 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Nadaljevanje pomeni <b>brisanje teh nastavitev</b>. - + Continuing will mean <b>ignoring these settings</b>. Nadaljevanje pomeni, da bodo <b>nastavitve prezrte</b>. - + 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>. Nekatere nastavitve so bile nastavljene v novejši različici programa in vključujejo možnosti, ki v trenutni različici niso na voljo.<br><br>%1<br><br>Za trenutno uporabljeno nastavitveno datoteko je varnostna kopija že shranjena na <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Končaj - + Continue Nadaljuj - + Error accessing the configuration file Napaka dostopa do nastavitvene datoteke @@ -899,12 +973,12 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju.Med dostopom do nastavitvene datoteke na %1 je prišlo do napake. Preverite, ali je dostopna z uporabniškim računom. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Med dostopom do nastavitvene datoteke na %1 je prišlo do napake. Preverite, ali je dostopna z uporabniškim računom. - + Quit %1 Končaj %1 @@ -924,7 +998,7 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. &Username: - + Uporabniško ime: @@ -950,56 +1024,216 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. - + File Removed (start upload) %1 Datoteka je odstranjena (začni pošiljanje) %1. - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. Krajevna datoteka je bila med usklajevanjem spremenjena. Usklajena bo, ko bo shranjena. - - + + Local file changed during sync. Krajevna datoteka je bila med usklajevanjem spremenjena. - + Network error: %1 - + Omrežna napaka: %1 - + Error updating metadata: %1 Prišlo je do napake posodabljanja metapodatkov: %1 - + The file %1 is currently in use Datoteka %1 je trenutno v uporabi. - + The local file was removed during sync. Krajevna datoteka je bila med usklajevanjem odstranjena. - + Restoration failed: %1 + Obnovitev je spodletela: %1 + + + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 OCC::CleanupPollsJob - + Error writing metadata to the database Napaka zapisovanja metapodatkov v podatkovno zbirko @@ -1017,12 +1251,12 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju.Vnesite neposredno geslo:<br><br>uporabnik: %2<br>račun: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Vpis gesla za celovito šifriranje E2E @@ -1198,8 +1432,8 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Napaka strežnika: odziv PROPFIND ni zapisan kot XML! @@ -1207,27 +1441,27 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Prišlo je do napake med odpiranjem mape %1 - + Directory not accessible on client, permission denied Mapa v programu ni dosegljiva, ni ustreznih dovoljenj. - + Directory not found: %1 Mape ni mogoče najti: %1 - + Filename encoding is not valid Kodiranje imena datoteke ni veljavno - + Error while reading directory %1 Prišlo je do napake med branjem mape %1 @@ -1235,83 +1469,83 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. OCC::EditLocallyJob - + Invalid token received. - + Prejet je neveljaven žeton - - - - - - + + + + + + Please try again. - + Poskusite znova. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ S tem dejanjem prav tako prekinete vsa trenutna usklajevanja v izvajanju. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Ni mogoče ustvariti metapodatkov za šifriranje. Mapa bo odklenjena. @@ -1449,145 +1683,145 @@ Morda je napaka v knjužnicah OpenSSL. OCC::Folder - + Local folder %1 does not exist. Krajevna mapa %1 ne obstaja. - + %1 should be a folder but is not. Predmet %1 bi moral biti mapa, pa ni. - + %1 is not readable. Predmeta %1 ni mogoče prebrati. - + %1 and %n other file(s) have been removed. Datoteka %1 in še %n druga datoteka je bila izbrisana.Datoteka %1 in še %n drugi datoteki sta bili izbrisani.Datoteka %1 in še %n druge datoteke so bile izbrisane.Datoteka %1 in še %n drugih datotek je bilo izbrisanih. - + %1 has been removed. %1 names a file. Datoteka %1 je odstranjena. - + %1 and %n other file(s) have been added. Datoteka %1 in še %n druga datoteka je bila posodobljena.Datoteka %1 in še %n drugi datoteki sta bili posodobljeni.Datoteka %1 in še %n druge datoteke so bile posodobljene.Datoteka %1 in še %n drugih datotek je bilo posodobljenih. - + %1 has been added. %1 names a file. Dodana je datoteka %1. - + %1 and %n other file(s) have been updated. Datoteka %1 in še %n druga datoteka je bila posodobljena.Datoteka %1 in še %n drugi datoteki sta bili posodobljeni.Datoteka %1 in še %n druge datoteke so bile posodobljene.Datoteka %1 in še %n drugih datotek je bilo posodobljenih. - + %1 has been updated. %1 names a file. Datoteka %1 je posodobljena. - + %1 has been renamed to %2 and %n other file(s) have been renamed. Datoteka %1 je bila preimenovana v %2, preimenovana je bila še %n druga datoteka.Datoteka %1 je bila preimenovana v %2, preimenovana je bila še %n druga datoteka.Datoteka %1 je bila preimenovana v %2, preimenovane so bile še %n druge datoteke.Datoteka %1 je bila preimenovana v %2, preimenovanih je bilo še %n drugih datotek. - + %1 has been renamed to %2. %1 and %2 name files. Datoteka %1 je preimenovana v %2. - + %1 has been moved to %2 and %n other file(s) have been moved. Datoteka %1 je bila premaknjena v %2, premaknjena je bila še %n druga datoteka.Datoteka %1 je bila premaknjena v %2, premaknjeni sta bili še %n drugi datoteki.Datoteka %1 je bila premaknjena v %2, premaknjene so bile še %n druge datoteke.Datoteka %1 je bila premaknjena v %2, premaknjenih je bilo še %n drugih datotek. - + %1 has been moved to %2. Datoteka %1 je premaknjena v %2. - + %1 has and %n other file(s) have sync conflicts. Pri datoteki %1 in še %n drugi datoteki je zaznan spor usklajevanja.Pri datoteki %1 in še %n drugih datotekah je zaznan spor usklajevanja.Pri datoteki %1 in še %n drugih datotekah je zaznan spor usklajevanja.Pri datoteki %1 in še %n drugih datotekah je zaznan spor usklajevanja. - + %1 has a sync conflict. Please check the conflict file! Pri datoteki %1 je zaznan spor usklajevanja. Preverite datoteko! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. Datoteke %1 in še %n druge datoteke ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.Datoteke %1 in še %n drugih datotek ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.Datoteke %1 in še %n drugih datotek ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki.Datoteke %1 in še %n drugih datotek ni mogoče uskladiti zaradi napak. Podrobnosti so zapisane v dnevniški datoteki. - + %1 could not be synced due to an error. See the log for details. Datoteke %1 zaradi napake ni mogoče uskladiti. Več podrobnosti je zabeleženih v dnevniški datoteki. - + %1 and %n other file(s) are currently locked. Datoteka %1 in še %n druga datoteka je trenutno zaklenjena.Datoteka %1 in še %n drugi datoteki sta trenutno zaklenjeni.Datoteka %1 in še %n druge datoteke so trenutno zaklenjene.Datoteka %1 in še %n drugih datotek je trenutno zaklenjenih. - + %1 is currently locked. Datoteka %1 je trenutno zaklenjena. - + Sync Activity Dejavnost usklajevanja - + Could not read system exclude file Ni mogoče prebrati sistemske izločitvene datoteke - + A new folder larger than %1 MB has been added: %2. Dodana je nova mapa, ki presega %1 MB: %2. - + A folder from an external storage has been added. Dodana je mapa iz zunanje shrambe. - + Please go in the settings to select it if you wish to download it. Med nastavitvami jo je mogoče izbrati in označiti za prejem. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Mapa %1 je bila ustvarjena, a je bila izločena s seznama usklajevanja. Podatki v tej mapi ne bodo usklajeni. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Datoteka %1 je bila ustvarjena, a je bila izločena s seznama usklajevanja. Podatki ne bodo usklajeni. - + 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). @@ -1600,7 +1834,7 @@ To pomeni, da odjemalec usklajevanja ne pošilja krajevnih sprememb takoj in mor %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,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č dosegljive. - + 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. @@ -1620,17 +1854,17 @@ 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. - + Remove All Files? Ali naj bodo odstranjene vse datoteke? - + Remove all files Odstrani vse datoteke - + Keep files Ohrani datoteke @@ -1666,22 +1900,22 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? OCC::FolderMan - + Could not reset folder state Ni mogoče ponastaviti stanja mape - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Obstaja star dnevnik usklajevanja »%1«, ki pa ga ni mogoče odstraniti. Preverite, ali je datoteka morda v uporabi. - + (backup) (varnostna kopija) - + (backup %1) (varnostna kopija %1) @@ -1691,27 +1925,27 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? Nedoločeno stanje. - + Undefined state. - + Waiting to start syncing. Čakanje začetek usklajevanja - + Preparing for sync. Poteka priprava na usklajevanje. - + Sync is running. Usklajevanje je v teku. - + Sync finished with unresolved conflicts. Usklajevanje je končano z zaznanimi nerešenimi spori. @@ -1731,62 +1965,62 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? Uporabniška prekinitev. - + Last sync was successful. - + Zadnje usklajevanje je bilo uspešno končano. - + Setup error. - + Napaka nastavitve. - + Sync request was cancelled. - + Zahteva usklajevanja je bila preklicana. - + Sync is paused. Usklajevanje je začasno v premoru. - + %1 (Sync is paused) %1 (usklajevanje je v premoru) - + No valid folder selected! Ni izbrane veljavne mape! - + The selected path does not exist! Izbrana pot ne obstaja! - + The selected path is not a folder! Izbrana pot ni mapa! - + You have no permission to write to the selected folder! Ni ustreznih dovoljenj za pisanje v izbrano mapo! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Krajevna mapa %1 že vključuje mapo, ki je določena za usklajevanje. Izbrati je treba drugo. - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Krajevna mapa %1 je že v določena za usklajevanje. Izbrati je treba drugo. - + There is already a sync from the server to this local folder. Please pick another local folder! Za to krajevno pot je že ustvarjeno mesto za usklajevanje. Izbrati je treba drugo. @@ -1799,7 +2033,7 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? Dodaj povezavo za usklajevanje mape - + File Datoteka @@ -1807,152 +2041,156 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? OCC::FolderStatusModel - + You need to be connected to add a folder Za dodajanje mape mora biti vzpostavljena povezava - + Click this button to add a folder to synchronize. Kliknite za dodajanje mape za usklajevanje. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Prišlo je do napake med nalaganjem datotek s strežnika. - + Fetching folder list from server … Poteka pridobivanje seznama map s strežnika ... - + There are unresolved conflicts. Click for details. Zaznani so nerazrešeni spori. Kliknite za prikaz podrobnosti. - + Virtual file support is enabled. Podpora za navidezne datoteke je omogočena. - + Signed out Odjavljeno - + Synchronizing VirtualFiles with local folder Poteka usklajevanje navideznih datotek s krajevno mapo - + Synchronizing with local folder Poteka usklajevanje s krajevno mapo. - + Checking for changes in remote "%1" Poteka preverjanje za spremembe na oddaljenem mestu »%1« - + Checking for changes in local "%1" Poteka preverjanje za krajevne spremembe v »%1« - + Reconciling changes Usklajevanje sprememb - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Usklajevanje %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) prejemanje %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) pošiljanje %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 od %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Preostalo še %5, %1 od %2, datoteka %3 od %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 od %2, datoteka %3 od %4 - + file %1 of %2 datoteka %1 od %2 - + Waiting … Čakanje na povezavo ... - + Waiting for %n other folder(s) … Poteka pregledovanje %n mape …Poteka pregledovanje %n map …Poteka pregledovanje %n map …Poteka pregledovanje %n map … - + Preparing to sync … Poteka priprava na usklajevanje ... @@ -2183,13 +2421,13 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? - + stable stabilni - + beta preizkusni @@ -2241,32 +2479,32 @@ Ali ste prepričani, da želite posodobiti spremembe s strežnikom? - + Create Debug Archive Ustvari arhiv razhroščevanja - + Server notifications that require attention. Prejeto je obvestilo strežnika, ki zahteva pozornost. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. Samodejnega zagona ni mogoče izklopiti, ker je ta omogočen sistemsko. - + Change update channel? Ali želite zamenjati kanal za posodobitve? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Zavedati se je treba, da izbor določa le različice programske opreme za nadgradnjo in da povrnitev na starejše različice ni več mogoča. Povrnitev iz preizkusnega kanala Beta na Stabilnega ni mogoča, dokler stabilna različica ni višja oziroma novejša od nameščene preizkusne različice. - + Change update channel Spreminjanje kanala posodobitev - + Cancel Prekliči - + Zip Archives Arhivi ZIP - + Debug Archive Created Arhiv razhroščevanja je ustvarjen - + Debug archive is created at %1 Arhiv razhroščevanja je ustvarjen na %1 @@ -2303,22 +2541,22 @@ Zavedati se je treba, da izbor določa le različice programske opreme za nadgra OCC::GetOrCreatePublicLinkShare - + Password for share required Zahtevano je geslo za souporabo - + Please enter a password for your link share: Vpisati je treba geslo za mesto souporabe prek povezave: - + Sharing error Napaka souporabe - + Could not retrieve or create the public link share. Error: %1 @@ -2505,22 +2743,22 @@ Predmeti v mapah, ki jih je dovoljeno izbrisati, bodo odstranjeni, če prepreču Filename contains leading and trailing spaces. - + Ime datoteke vsebuje začetne in pripete presledne znake. Filename contains leading spaces. - + Ime datoteke vsebuje začetne presledne znake. Filename contains trailing spaces. - + Ime datoteke vsebuje pripete presledne znake. Use invalid name - + Uporabi neveljavno ime @@ -2556,6 +2794,11 @@ Predmeti v mapah, ki jih je dovoljeno izbrisati, bodo odstranjeni, če prepreču Close Zapri + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Uporaba kateregakoli argumenta z ukazom v ukazni vrstici prepiše to nastavitev. - + Use &virtual files instead of downloading content immediately %1 - Uporabite $navidezne datoteke namesto prejemanja celotne vsebine %1 + Uporabi &navidezne datoteke in ne prejemi celotne vsebine %1 - + (experimental) (preizkusno) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Kot krajevne datoteke na ravni korenske mape v okolju Windows navidezne datoteke niso podprte. Izbrati je treba ustrezno podrejeno mapo na črkovnem pogonu. - + %1 folder "%2" is synced to local folder "%3" %1 mapa »%2« je usklajena s krajevno mapo »%3« - + Sync the folder "%1" Uskladi mapo » %1 « - + Warning: The local folder is not empty. Pick a resolution! Opozorilo: krajevna mapa ni prazna. Izberite razpoložljivo možnost za razrešitev problema! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 razpoložljivega prostora - + Virtual files are not available for the selected folder Navidezne datoteke niso na voljo za izbrano mapo - + Local Sync Folder Krajevna mapa usklajevanja - - + + (%1) (%1) - + There isn't enough free space in the local folder! V krajevni mapi ni dovolj prostora! @@ -3016,7 +3259,8 @@ Uporaba kateregakoli argumenta z ukazom v ukazni vrstici prepiše to nastavitev. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3048,144 +3292,144 @@ Uporaba kateregakoli argumenta z ukazom v ukazni vrstici prepiše to nastavitev. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Uspešno je vzpostavljena povezava s strežnikom %1: %2 različica %3 (%4)</font><br/><br/> - + Invalid URL Neveljaven naslov URL - + Failed to connect to %1 at %2:<br/>%3 Povezava s strežnikom %1 pri %2 je spodletela:<br/>%3 - + Timeout while trying to connect to %1 at %2. Povezovanje na %1 pri %2 je časovno poteklo. - + Trying to connect to %1 at %2 … Poteka poskus povezave z %1 na %2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Zahteva za overitev s strežnikom je bila preusmerjena na »%1«. Naslov URL ni veljaven ali pa strežnik ni ustrezno nastavljen. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Strežnik ne dovoli dostopa. Če želite preveriti, ali imate ustrezna dovoljenja, <a href="%1">kliknite</a> za dostop do te storitve z brskalnikom. - + There was an invalid response to an authenticated WebDAV request Zaznan je neveljaven odziv za zahtevo overitve WebDAV - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Krajevna usklajevana mapa %1 že obstaja. Nastavljena bo za usklajevanje.<br/><br/> - + Creating local sync folder %1 … Poteka ustvarjanje mape za krajevno usklajevanje %1 ... - + OK V redu - + failed. je spodletelo. - + Could not create local folder %1 Krajevne mape %1 ni mogoče ustvariti. - + No remote folder specified! Ni navedene oddaljene mape! - + Error: %1 Napaka: %1 - + creating folder on Nextcloud: %1 ustvarjanje mape v oblaku Nextcoud: %1 - + Remote folder %1 created successfully. Oddaljena mapa %1 je uspešno ustvarjena. - + The remote folder %1 already exists. Connecting it for syncing. Oddaljena mapa %1 že obstaja. Vzpostavljena bo povezava za usklajevanje. - - + + The folder creation resulted in HTTP error code %1 Ustvarjanje mape je povzročilo napako HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Ustvarjanje mape na oddaljenem naslovu je spodletelo zaradi napačnih poveril. <br/>Vrnite se in preverite zahtevana gesla.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Ustvarjanje oddaljene mape je spodletelo. Najverjetneje je vzrok v neustreznih poverilih.</font><br/>Vrnite se na predhodno stran in jih preverite.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Ustvarjanje oddaljene mape %1 je spodletelo z napako <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Vzpostavljena je povezava za usklajevanje med %1 in oddaljeno mapo %2. - + Successfully connected to %1! Povezava s strežnikom %1 je uspešno vzpostavljena! - + Connection to %1 could not be established. Please check again. Povezave z %1 ni mogoče vzpostaviti. Preveriti je treba nastavitve. - + Folder rename failed Preimenovanje mape je spodletelo - + Cannot 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. Mape ni mogoče odstraniti niti ni mogoče ustvariti varnostne kopije, ker je mapa, oziroma dokument v njej, odprt v drugem programu. Zaprite mapo oziroma dokument, ali pa prekinite namestitev. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Krajevno usklajena mapa %1 je uspešno ustvarjena!</b></font> @@ -3205,15 +3449,15 @@ Uporaba kateregakoli argumenta z ukazom v ukazni vrstici prepiše to nastavitev. Cancel - + Prekliči - + Enable experimental feature? Ali želite omogočiti preizkusne možnosti? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Preklop v ta način prekine vsa trenutno dejavna usklajevanja. To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o težavah, na katere naletite. - + Enable experimental placeholder mode Omogoči preizkusni način vsebnikov - + Stay safe Ostanite varni @@ -3264,162 +3508,167 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Usklajevanje simbolnih povezav ni podprto. - + File is listed on the ignore list. Datoteka je na seznamu neusklajevanih datotek. - + File names ending with a period are not supported on this file system. Imena datotek, ki vsebujejo končno piko, na tem sistemu niso podprta. - + File names containing the character "%1" are not supported on this file system. Imena datotek, ki vsebujejo znak »%1«, na tem sistemu niso podprta. - + File name contains at least one invalid character Ime datoteke vsebuje vsaj en neveljaven znak. - + The file name is a reserved name on this file system. Ime datoteke je na tem sistemu zadržano za sistemsko datoteko. - + Filename contains trailing spaces. Datoteka vsebuje pripete presledne znake. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. Ime datoteke je predolgo. - + File/Folder is ignored because it's hidden. Datoteka/Mapa ni usklajevana, ker je skrita. - + Stat failed. Določanje stanja je spodletelo. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Spor: prejeta je strežniška različica, krajevna je preimenovana, a ne tudi poslana v oblak. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Zapisa imena datoteke na tem datotečnem sistemu ni mogoče kodirati. - + The filename is blacklisted on the server. Ime datoteke je na črnem seznamu strežnika. - + File has extension reserved for virtual files. Datoteka ima predpono, ki je zadržana za navidezne datoteke. - + size velikost - + permission dovoljenje - + file id ID datoteke - + Server reported no %1 Prejet je odziv strežnika %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! Zaznan je spor pri pošiljanju mape. Mapa bo počiščena! - + Conflict when uploading a file. It's going to get removed! Zaznan je spor pri pošiljanju datoteke. Datoteka bo odstranjena! - + Ignored because of the "choose what to sync" blacklist Predmet ni usklajevan, ker je na »črnem seznamu datotek« za usklajevanje - + Not allowed because you don't have permission to add subfolders to that folder Dejanje ni dovoljeno! Ni ustreznih dovoljenj za dodajanje podmap v to mapo. - + Not allowed because you don't have permission to add files in that folder Dejanje ni dovoljeno, ker ni ustreznih dovoljenj za dodajanje datotek v to mapo - + Not allowed to upload this file because it is read-only on the server, restoring Te datoteke ni dovoljeno poslati, ker ima določena dovoljenja le za branje. Datoteka bo obnovljena na izvorno različico. - + Moved to invalid target, restoring Predmet je premaknjen na neveljaven cilj, vsebina bo obnovljena. - + Not allowed to remove, restoring Odstranjevanje ni dovoljeno, vsebina bo obnovljena. - + Error while reading the database Napaka branja podatkovne zbirke - + Server replied with an error while reading directory "%1" : %2 Odziv strežnika vključuje napako med branjem mape »%1«: %2 @@ -3427,22 +3676,22 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 Prišlo je do napake posodabljanja metapodatkov: %1 - + File is currently in use Datoteka je trenutno v uporabi. @@ -3455,19 +3704,19 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o - + File %1 cannot be downloaded because encryption information is missing. Datoteke %1 ni mogoče prejeti zaradi manjkajočih podatkov šifriranja! - - + + File has changed since discovery Datoteka je bila spremenjena po usklajevanju seznama datotek - + Could not delete file record %1 from local DB @@ -3478,32 +3727,32 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Datoteke %1 ni mogoče prejeti zaradi neskladja z imenom krajevne datoteke! - + File %1 can not be downloaded because of a local file name clash! Datoteke %1 ni mogoče prejeti zaradi neskladja z imenom krajevne datoteke! - + The download would reduce free local disk space below the limit Prejem predmetov bi zmanjšal prostor na krajevnem disku pod določeno omejitev. - + Free space on disk is less than %1 Na disku je prostora manj kot %1 - + File was deleted from server Datoteka je izbrisana s strežnika - + The file could not be downloaded completely. Datoteke ni mogoče prejeti v celoti. - + The downloaded file is empty, but the server said it should have been %1. Prejeta datoteka je prazna, čeprav je na strežniku velikosti %1. @@ -3513,18 +3762,23 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Datoteke %1 ni mogoče shraniti zaradi neskladja z imenom obstoječe datoteke! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Prišlo je do napake posodabljanja metapodatkov: %1 - + The file %1 is currently in use Datoteka %1 je trenutno v uporabi. @@ -3545,7 +3799,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ni mogoče izbrisati datoteke %1, napaka: %2 @@ -3556,16 +3810,21 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Ni mogoče ustvariti mape %1 - + Error updating metadata: %1 Prišlo je do napake posodabljanja metapodatkov: %1 - + The file %1 is currently in use Datoteka %1 je trenutno v uporabi. @@ -3573,7 +3832,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Predmeta »%1« ni mogoče odstraniti zaradi neskladja s krajevnim imenom datoteke. @@ -3586,46 +3845,51 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Datoteke %1 ni mogoče preimenovati v %2 zaradi že obstoječe datoteke s tem imenom. - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state Napaka nastavljanja pripetega staja - - + + Error updating metadata: %1 Prišlo je do napake posodabljanja metapodatkov: %1 - + The file %1 is currently in use Datoteka %1 je trenutno v uporabi. - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file Preimenovanje datoteke je spodletelo @@ -3646,7 +3910,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 204, prejet pa je bil »%1 %2«. @@ -3659,12 +3923,12 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 201, prejet pa je bil »%1 %2«. - + Error writing metadata to the database: %1 Napaka zapisovanja metapodatkov v podatkovno zbirko: %1 - + The file %1 is currently in use Datoteka %1 je trenutno v uporabi. @@ -3672,42 +3936,42 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Ni mogoče preimenovati %1 v %2, napaka: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 201, prejet pa je bil »%1 %2«. - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 Prišlo je do napake posodabljanja metapodatkov: %1 - + The file %1 is currently in use Datoteka %1 je trenutno v uporabi. - + Error setting pin state Napaka nastavljanja pripetega staja - + Error writing metadata to the database Napaka zapisovanja metapodatkov v podatkovno zbirko @@ -3897,9 +4161,9 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::ServerNotificationHandler - + Reply - + Odgovori @@ -3915,23 +4179,23 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Nastavitve - + %1 Settings This name refers to the application name e.g Nextcloud Nastavitve %1 - + General Splošno - + Network Omrežje - + Account Račun @@ -3939,17 +4203,22 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::ShareModel - + Share link - + Link share - + + Internal link + Notranja povezava + + + Enter a note for the recipient @@ -4025,7 +4294,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,169 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Vsebinski meni souporabe - + Select new location … Izbor novega mesta ... - + I shared something with you Nekaj vam dajem v souporabo - - + + Share options Možnosti souporabe - - + + Activity Dejavnosti - + Copy private link to clipboard Kopiraj zasebno povezavo v odložišče - + Send private link by email … Pošlji zasebno povezavo prek elektronske pošte ... + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Nadaljnje omogočanje souporabe ni dovoljeno - + Resharing this folder is not allowed Nadaljnje omogočanje souporabe mape ni dovoljeno - - + + Copy public link Kopiraj javno povezavo - + Copy internal link Kopiraj krajevno povezavo - + + Encrypt + Šifriraj + + + Lock file - + Zakleni datoteko - + Unlock file - + Odkleni datoteko - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Uredi - + Open in browser Odpri v brskalniku - + Resolve conflict … Razreši spor ... - + Move and rename … Premakni in preimenuj ... - + Move, rename and upload … Premakni, preimenuj in pošlji ... - + Delete local changes Izbriši krajevne spremembe - + Move and upload … Premakni in pošlji ... - + Delete Izbriši @@ -4377,63 +4683,63 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (prenos je zadržan zaradi predhodne napake; poskus bo ponovljen čez %2) - + Could not update file: %1 Ni mogoče posodobiti datoteke: %1 - + Could not update virtual file metadata: %1 Ni mogoče posodobiti metapodatkov navidezne datoteke: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Nerazrešen spor - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Na voljo je le %1, za zagon pa je zahtevanih vsaj %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Ni mogoče odpreti ali ustvariti krajevne usklajevalne podatkovne zbirke. Prepričajte se, da imate ustrezna dovoljenja za pisanje v usklajevani mapi. - + Using virtual files with suffix, but suffix is not set V uporabi so navidezne datoteke s pripono, a ta ni nastavljena. - + Unable to read the blacklist from the local database Ni mogoče prebrati črnega seznama iz krajevne mape - + Unable to read from the sync journal. Ni mogoče brati iz dnevnika usklajevanja - + Cannot open the sync journal Ni mogoče odpreti dnevnika usklajevanja @@ -4443,12 +4749,12 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Usklajevanje se bo v kratkem nadaljevalo. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Zmanjkuje prostora na disku: prejem predmetov, ki bi zmanjšali prostor na disku pod %1 bo prekinjen. - + There is insufficient space available on the server for some uploads. Za usklajevanje je na strežniku premalo prostora. @@ -4517,59 +4823,59 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::Systray - + Download - + Prejmi - + Add account Dodaj račun - + Open main dialog Odpri glavno pogovorno okno - - + + Pause sync Ustavi usklajevanja - - + + Resume sync Nadaljuj z usklajevanjem - + Settings Nastavitve - + Help - + Pomoč - + Exit %1 Končaj %1 - + Pause sync for all Ustavi usklajevanje za vse - + Resume sync for all Nadaljuj z usklajevanjem za vse - + %1: %2 %1: %2 @@ -4577,24 +4883,24 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>Namizni program %1</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Nameščena je različica %1. Več podrobnosti je zabeleženih v <a href='%2'>priročniku Nextcloud</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Uporablja vstavek navideznih datotek: %1</small></p> - + <p>This release was supplied by %1</p> <p>Objavo je omogočila skupina %1</p> @@ -4602,22 +4908,22 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Pridobivanje ponudnikov je spodletelo. - + Failed to fetch search providers for '%1'. Error: %2 Spodletelo je pridobivanje ponudnikov iskanja za »%1«. Napaka %2 - + Search has failed for '%2'. Iskanje »%2« je spodletelo. - + Search has failed for '%1'. Error: %2 Iskanje »%1« je spodletelo. Napaka: %2 @@ -4625,30 +4931,36 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::User - + Retry all uploads Ponovi pošiljanje vseh predmetov + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Potrdi odstranjevanje računa - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Ali res želite odstraniti povezavo z računom <i>%1</i>?</p><p><b>Opomba:</b> odstranitev povezave <b>ne izbriše</b> nobene datoteke.</p> - + Remove connection Odstrani povezavo - + Cancel Prekliči @@ -4786,8 +5098,8 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4795,8 +5107,8 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4847,7 +5159,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Log in - + Prijava @@ -4858,7 +5170,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Sign up with provider - + Prijava s podatki ponudnika @@ -4894,123 +5206,123 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o OCC::ownCloudGui - + Unsupported Server Version Nepodprta različica strežnika - + 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. Strežnik računa %1 deluje na nepodprti različici %2. Uporaba programa za nepodprt strežnik ni preizkušena in lahko povzroči napake. Nadaljujete na lastno odgovornost. - + Disconnected Brez povezave - + Disconnected from some accounts Prekinjena je povezava z nekaterimi računi - + Disconnected from %1 Prekinjena povezava z %1 - + Disconnected from accounts: Prekinjena je povezava z računi: - + Account %1: %2 Račun %1: %2 - + Please sign in Pred nadaljevanjem je zahtevana prijava - + Signed out Odjavljeno - + Account synchronization is disabled Usklajevanje računa je onemogočeno - - + + Synchronization is paused Usklajevanje je v premoru - + Folder %1: %2 Mapa %1: %2 - + Unresolved conflicts Nerazrešeni spori - + Up to date Ni posodobitev - + Error during synchronization Napaka med usklajevanjem - + There are no sync folders configured. Ni nastavljenih map za usklajevanje. - + No sync folders configured Ni nastavljenih map za usklajevanje - + Checking for changes in remote "%1" Poteka preverjanje sprememb na oddaljenem mestu »%1«. - + Checking for changes in local "%1" Poteka preverjanje za krajevne spremembe v »%1«. - + Syncing %1 of %2 (%3 left) Poteka usklajevanje %1 od %2 (preostaja %3) - + Syncing %1 of %2 Poteka usklajevanje %1 od %2 - + Syncing %1 (%2 left) Usklajevanje %1 (%2 do konca) - + Syncing %1 Usklajevanje %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5025,7 +5337,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Username - + Uporabniško ime @@ -5040,7 +5352,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Choose different folder - + Izbor ciljne mape @@ -5162,29 +5474,29 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Nova mapa - + You renamed %1 - + Preimenovali ste %1 - + You deleted %1 - + Izbrisali ste %1 - + You created %1 - + Ustvarili ste %1 - + You changed %1 - + Spremenili ste %1 - + Synced %1 - + Usklajeno %1 @@ -5245,33 +5557,109 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Mark as read + Označi kot prebrano + + + + ShareDelegate + + + Create a new share link + Ustvari novo povezavo za souporabo + + + + Copy share link location + + + + + Share options + Možnosti souporabe + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + Opusti + + + + Share label + + + + + Allow editing + Dovoli urejanje + + + + Password protect + Zaščiti z geslom + + + + Set expiration date + Nastavi datum preteka + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5287,7 +5675,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o SyncJournalDb - + Failed to connect database. Vzpostavljanje povezave s podatkovno zbirko je spodletelo. @@ -5345,6 +5733,22 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Naloži več zadetkov + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5408,67 +5812,67 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o UserStatusSelector - + Online status Povezano stanje - + Online Na voljo - + Away Ne spremljam - + Do not disturb Ne pustim se motiti - + Mute all notifications - + Invisible Drugim nevidno - + Appear offline - + Status message Sporočilo stanja - + What is your status? Kako želite nastaviti stanje? - + Clear status message after Počisti sporočilo stanja po - + Cancel - + Clear status message Počisti sporočilo stanja - + Set status message Nastavi sporočilo stanja @@ -5552,24 +5956,24 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Window - + Nextcloud desktop main dialog Glavni vmesnik namizja Nextcloud - + Current account Trenutni račun - - + + Resume sync for all Nadaljuj z usklajevanjem za vse - - + + Pause sync for all Ustavi usklajevanje za vse @@ -5579,22 +5983,22 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Nastavi stanje uporabnika - + Add account Dodaj račun - + Add new account Dodaj račun - + Settings Nastavitve - + Exit Končaj @@ -5603,11 +6007,6 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Current user avatar Trenutna podoba uporabnika - - - Current account avatar - - Current user status is online @@ -5619,70 +6018,75 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o Trenutno uporabnik ne želi motenj - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + %1 – Dejavnost datoteke + + + Account switcher and settings menu Preklopnik računov in meni nastavitev - + Open local folder of current account Odpri krajevno mapo v trenutnem računu - + Connected Povezano - + Disconnected Brez povezave - + Open Nextcloud Talk in browser Odpri Nextcloud Talk v brskalniku - + More apps Več programov - + Open %1 in browser Odpri %1 v brskalniku - + Unified search results list Poenoten seznam zadetkov iskanja - - - %1 - File activity - %1 – Dejavnost datoteke - main.cpp - + System Tray not available Sistemska vrstica ni na voljo - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 zahteva uporabo sistemske obvestilne vrstice. Pri uporabnikih namizja XFCE je treba upoštevati <a href="http://docs.xfce.org/xfce/xfce4-panel/systray"> ta navodila </a>. V nasprotnem primeru namestite program sistemske obvestilne vrstice, kot je »trayer«" in poskusite znova. @@ -5690,7 +6094,7 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Izgradnje iz predelave Git <a href="%1">%2</a> na %3, %4 z uporabo Qt %5, %6</small></p> @@ -5724,72 +6128,77 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Izbrisano - + Moved to %1 Premaknjeno v %1 - + Ignored Neusklajeno - + Filesystem access error Napaka dostopa do datotečnega sistema - + Error Napaka - + Updated local metadata Posodobljeni krajevni metapodatki - + Unknown Neznano - + downloading prejemanje - + uploading pošiljanje - + deleting brisanje - + moving premikanje - + ignoring Prezrto - + error napaka - + updating local metadata posodabljanje krajevnih metapodatkov diff --git a/translations/client_sr.ts b/translations/client_sr.ts index 9504407bb..58e3e7ddf 100644 --- a/translations/client_sr.ts +++ b/translations/client_sr.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally - + In %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Померање у канту није подржано на овој платформи - + Error removing "%1": %2 - + Could not remove folder "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Одустани @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ - + Do not encrypt folder - + Encrypt folder - + No account configured. Није подешен налог. - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ Укључи шифровање - + + End-to-end encryption has been enabled for this account + + + + Warning Упозорење - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Не можете шифровати фасциклу са садржајем, уклоните фајлове пров. @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder Отвори фасциклу - + Encrypt Шифруј - - + + Edit Ignored Files Измени игнорисане фајлове - - + + Create new folder - - + + Availability - + Choose what to sync Изаберите шта синхронизовати - + Force sync now Форсирај синхронизацију сада - + Restart sync Поново покрени синхронизацију - + Resume sync Настави синхронизацију - + Pause sync Паузирај синхронизацију - + Remove folder sync connection Уклони везу на синхронизацију фасцикле - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed Прављење фасцикле није успело - + <p>Could not create local folder <i>%1</i>.</p> <p>Не могу да направим локалну фасциклу <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Потврдите уклањање конекције на синхронизацију фасцикле - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Желите ли заиста да престанете са синхронизацијом фасцикле <i>%1</i>?</p><p><b>Напомена:</b> Ово <b>неће</b> обрисати ниједан фајл.</p> - + Remove Folder Sync Connection Уклони везу на синхронизацију фасцикле - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -592,7 +607,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -602,144 +617,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Синхронизација у току - + The syncing operation is running.<br/>Do you want to terminate it? Синхронизација је у току.<br/>Желите ли да је прекинете? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) од %2 искоришћено. Неке фасцикле, укључујући мрежно монтиране или дељене фасцикле, могу имати друга ограничења. - + %1 of %2 in use %1 од %2 искоришћено - + Currently there is no storage usage information available. Тренутно нема доступних података о заузећу складишта. - + %1 in use %1 искоришћено - + %1 as %2 - + The server version %1 is unsupported! Proceed at your own risk. - + Connected to %1. Повезан са %1. - + Server %1 is temporarily unavailable. Сервер %1 је привремено недоступан. - + Server %1 is currently in maintenance mode. Сервер %1 је тренутно у режиму одржавања. - + Signed out from %1. Одјављен са %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Дохватам ауторизацију из веб читача. <a href='%1'>Кликните овде</a> да поново отворите веб читач. - + Connecting to %1 … Повезујем се на %1 … - + No connection to %1 at %2. Нема конекције на %1 са %2. - + Server configuration error: %1 at %2. - + No %1 connection configured. Нема подешене %1 везе. - + There are folders that were not synchronized because they are too big: Ово су фасцикле које нису синхронизоване јер су превелике: - + There are folders that were not synchronized because they are external storages: Ово су фасцикле које нису синхронизоване зато што су на спољним складиштима: - + There are folders that were not synchronized because they are too big or external storages: Ово су фасцикле које нису синхронизоване зато што су превелике или су на спољним складиштима: - + Confirm Account Removal Потврда уклањања налога - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Да ли стварно желите да уклоните везу ка налогу <i>%1</i>?</p><p><b>Белешка:</b> Овим <b>нећете</b>обрисати ниједан фајл.</p> - + Remove connection Уклони везу - - + This account supports end-to-end encryption Овај налог подржава шифровање са краја на крај - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -794,7 +841,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. За још активности отворите апликацију Активности. @@ -804,12 +851,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -860,32 +907,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit - + Continue - + Error accessing the configuration file Грешка при приступању фајлу са подешавањима @@ -895,12 +969,12 @@ This action will abort any currently running synchronization. Догодила се грешка приликом учитавања фајла са подешавањима са %1. Проверите да ли корисник има приступ овом фајлу. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 Напусти %1 @@ -946,56 +1020,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. - - + + Local file changed during sync. - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Грешка приликом уписивања метаподатака у базу @@ -1013,12 +1247,12 @@ This action will abort any currently running synchronization. Унесите Вашу лозинку за шифровање са краја на крај:<br><br>Корисник: %2<br>Налог: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Унесите E2E лозинку @@ -1192,8 +1426,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1201,27 +1435,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1229,83 +1463,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1313,7 +1547,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Не могу да изгенеришем метаподатке за шифровање. Откључавам фасциклу. @@ -1443,145 +1677,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Локална фасцикла %1 не постоји. - + %1 should be a folder but is not. %1 би требало да је фасцикла али није. - + %1 is not readable. %1 није читљив. - + %1 and %n other file(s) have been removed. %1 и још %n други фајл је уклоњен.%1 и још %n друга фајла су уклоњени.%1 и још %n других фајлова су уклоњени. - + %1 has been removed. %1 names a file. %1 је уклоњен. - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 и још %n други фајл је ажуриран.%1 и још %n друга фајла су ажурирани.%1 и још %n других фајлова су ажурирани. - + %1 has been updated. %1 names a file. %1 је ажуриран. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 је преименован у %2, а још %n фајл је такође преименован.%1 је преименован у %2, а још %n фајла су такође преименована.%1 је преименован у %2, а још %n фајлова је такође преименовано. - + %1 has been renamed to %2. %1 and %2 name files. %1 је преименован у %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 је померен у %2, а још %n фајл је такође померен.%1 је померен у %2, а још %n фајла су такође померена.%1 је померен у %2, а још %n фајлова је такође померено. - + %1 has been moved to %2. %1 је премештен у %2. - + %1 has and %n other file(s) have sync conflicts. %1 и још %n фајл имају конфликте.%1 и још %n друга фајла имају конфликте.%1 и још %n других фајлова имају конфликте. - + %1 has a sync conflict. Please check the conflict file! %1 има конфликт приликом синхронизације. Проверите конфликтни фајл! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 и још %n фајл није синхронизован због грешке. Погледајте записник за детаље.%1 и још %n фајла нису синхронизовани због грешке. Погледајте записник за детаље.%1 и још %n фајлова нису синхронизовани због грешке. Погледајте записник за детаље. - + %1 could not be synced due to an error. See the log for details. %1 није синхронизован због грешке. Погледајте записник за детаље. - + %1 and %n other file(s) are currently locked. %1 и још %n други фајл је тренутно закључан.%1 и још %n друга фајла су тренутно закључана.%1 и још %n других фајлова су тренутно закључани. - + %1 is currently locked. %1 је тренутно закључан. - + Sync Activity Активност синхронизације - + Could not read system exclude file Не могу да прочитам системски списак за игнорисање - + A new folder larger than %1 MB has been added: %2. Додата је нова фасцикла већа од %1 MB: %2. - + A folder from an external storage has been added. Додата је фасцикла са спољног складишта. - + Please go in the settings to select it if you wish to download it. Идите у поставке и означите ако желите да ја преузмете. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Фасцикла %1 је креирана, али је још раније искључена из синхронизације. Подаци унутар ње неће бити синхронизовани. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Фајл %1 је креиран, али је још раније искључен из синхронизације. Неће бити синхронизован. - + 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). @@ -1594,7 +1828,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1602,24 +1836,24 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? Уклонити све фајлове? - + Remove all files Уклони све фајлове - + Keep files Остави фајлове @@ -1655,22 +1889,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Не могу да ресетујем стање фасцикле - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (резерва) - + (backup %1) (резерва %1) @@ -1680,27 +1914,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Неодређено стање. - + Undefined state. - + Waiting to start syncing. Чекам на почетак синхронизације. - + Preparing for sync. Припремам синхронизацију. - + Sync is running. Синхронизација у току. - + Sync finished with unresolved conflicts. @@ -1720,62 +1954,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Корисник прекинуо. - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. Синхронизација је паузирана. - + %1 (Sync is paused) %1 (синхронизација паузирана) - + No valid folder selected! Није изабран ниједна исправна фасцикла! - + The selected path does not exist! - + The selected path is not a folder! Одабрана путања није фасцикла! - + You have no permission to write to the selected folder! Немате дозволе за упис у изабрану фасциклу! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Локална фасцикла %1 већ садржи фасциклу која се користи за синхронизацију. Одаберите неку другу! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Локална фасцикла %1 је већ унутар фасцикле која се користи за синхронизацију. Одаберите неку другу! - + There is already a sync from the server to this local folder. Please pick another local folder! Већ постоји синхронизација са сервера у ову локалну фасциклу. Одаберите другу локалну фасциклу! @@ -1788,7 +2022,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Додај везу синхронизације фасцикле - + File Фајл @@ -1796,152 +2030,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Морате бити повезани да бисте додали фасциклу - + Click this button to add a folder to synchronize. Кликните ово дугме да додате фасциклу за синхронизацију. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Грешка при учитавању листе фасцикли са сервера. - + Fetching folder list from server … Добављам списак фасцикли са сервера… - + There are unresolved conflicts. Click for details. Постоје неразрешени конфликти. Кликните за детаље. - + Virtual file support is enabled. - + Signed out Одјављен - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes Сакупљам измене - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Синхронизујем %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) преузми %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) отпреми %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 од %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 Преостало %5, %1 од %2, фајл %3 од %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 од %2, фајл %3 од %4 - + file %1 of %2 фајл %1 од %2 - + Waiting … Чекам… - + Waiting for %n other folder(s) … Чекам на преосталу %n фасциклу…Чекам на преостале %n фасцикле…Чекам на преосталих %n фасцикли… - + Preparing to sync … Припремам синхронизацију… @@ -2172,13 +2410,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2230,59 +2468,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. Обавештења са сервера која захтевају пажњу. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2290,22 +2528,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Потребна лозинка за дељење - + Please enter a password for your link share: Унесите лозинку за везу дељења: - + Sharing error Грешка приликом дељења - + Could not retrieve or create the public link share. Error: %1 @@ -2543,6 +2781,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Затвори + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2875,60 +3118,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder Синхронизација локалне фасцикле - - + + (%1) (%1) - + There isn't enough free space in the local folder! Нема довољно слободног места у локалној фасцикли! @@ -3000,7 +3243,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3032,144 +3276,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Успешно повезан са %1: %2 верзија %3 (%4)</font><br/><br/> - + Invalid URL Неисправна адреса - + Failed to connect to %1 at %2:<br/>%3 Неуспешно повезивање са %1 на %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Време је истекло у покушају повезивања са %1 на %2. - + Trying to connect to %1 at %2 … Покушавам да се повежем са %1 на %2… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Сервер није дозволио приступ. Да проверите имате ли исправан приступ, <a href="%1">кликните овде</a> да бисте приступили услузи из прегледача. - + There was an invalid response to an authenticated WebDAV request Добијен је неисправан одговор на аутентификовани ВебДАВ захтев - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Локална фасцикла %1 већ постоји. Одређујем је за синхронизацију.<br/><br/> - + Creating local sync folder %1 … Правим локалну фасциклу синхронизације %1… - + OK - + failed. неуспешно - + Could not create local folder %1 Не могу да направим локалну фасциклу %1 - + No remote folder specified! Није наведена удаљена фасцикла! - + Error: %1 Грешка: %1 - + creating folder on Nextcloud: %1 правим фасциклу на Некстклауду: % 1 - + Remote folder %1 created successfully. Удаљена фасцикла %1 је успешно направљена. - + The remote folder %1 already exists. Connecting it for syncing. Удаљена фасцикла %1 већ постоји. Повезујем се ради синхронизовања. - - + + The folder creation resulted in HTTP error code %1 Прављење фасцикле довело је до ХТТП грешке са кодом %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Прављење удаљене фасцикле није успело због погрешних акредитива!<br/>Идите назад и проверите ваше акредитиве.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Прављење удаљене фасцикле није успело због погрешних акредитива.</font><br/>Идите назад и проверите ваше акредитиве.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Прављење удаљене фасцикле %1 није успело због грешке <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. Веза за синхронизацију %1 до удаљеног директоријума %2 је подешена. - + Successfully connected to %1! Успешно повезан са %1! - + Connection to %1 could not be established. Please check again. Не може се успоставити веза са %1. Проверите поново. - + Folder rename failed Преименовање није успело - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Локална фасцикла за синхронизовање %1 је успешно направљена!</b></font> @@ -3192,12 +3436,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3208,12 +3452,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3242,162 +3486,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3405,22 +3654,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3433,19 +3682,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery Фајл је измењен у међувремену - + Could not delete file record %1 from local DB @@ -3456,32 +3705,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! Фајл %1 се не може преузети јер се судара са називом локалног фајла! - + The download would reduce free local disk space below the limit Преузимање ће смањити слободно место на диску испод границе - + Free space on disk is less than %1 Слободан простор на диску је мањи од %1 - + File was deleted from server Фајл је обрисан са сервера - + The file could not be downloaded completely. Фајл није могао бити преузет у потпуности. - + The downloaded file is empty, but the server said it should have been %1. @@ -3491,18 +3740,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Фајл %1 се не може сачувати јер се судара са називом локалног фајла! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3523,7 +3777,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 не могу да обришем фајл %1, грешка: %2 @@ -3534,16 +3788,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3551,7 +3810,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Не могу да уклоним %1 због сударања са називом локалног фајла @@ -3564,46 +3823,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3624,7 +3888,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3637,12 +3901,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Сервер је вратио лош ХТТП код. Очекивано је 201 али је примљено „%1 %2“. - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3650,42 +3914,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Сервер је вратио лош ХТТП код. Очекивано је 201 али је примљено „%1 %2“. - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database Грешка при упису мета података у базу @@ -3875,7 +4139,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply @@ -3893,23 +4157,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Поставке - + %1 Settings This name refers to the application name e.g Nextcloud - + General Опште - + Network Мрежа - + Account Налог @@ -3917,17 +4181,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4003,7 +4272,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4012,132 +4281,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Контекстни мени дељења - + Select new location … - + I shared something with you Поделио сам нешто са Вама - - + + Share options Опције дељења - - + + Activity - + Copy private link to clipboard Копирај приватну везу у оставу - + Send private link by email … Пошаљи приватну везу е-поштом… + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed Поновно дељење није дозвољено - + Resharing this folder is not allowed - - + + Copy public link Копирај јавну везу - + Copy internal link Копирај интерну везу - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit Измени - + Open in browser Отвори у веб читачу - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete Избриши @@ -4355,63 +4661,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (прескочено због раније грешке, покушавам поново за %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. Неразрешени конфликт. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Доступно је само %1, треба бар %2 за започињање - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Не могу да отворим или креирам локалну базу за синхронизацију. Погледајте да ли имате право писања у синхронизационој фасцикли. - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database Не могу да читам листу ставки игнорисаних за синхронизацију из локалне базе - + Unable to read from the sync journal. Не могу да читам синхронизациони журнал. - + Cannot open the sync journal Не могу да отворим журнал синхронизације @@ -4421,12 +4727,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Мало простора на диску: преузимања која би смањила слободно место испод %1 су прескочена. - + There is insufficient space available on the server for some uploads. Нема довољно места на серверу за нека отпремања. @@ -4495,59 +4801,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account Додај налог - + Open main dialog Отвори главни дијалог - - + + Pause sync - - + + Resume sync - + Settings Поставке - + Help - + Exit %1 Излаз %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4555,24 +4861,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 десктоп клијент</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Верзија %1. За више информација кликните <a href='%2'>овде</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> <p>Ово издање је обезбедио %1</p> @@ -4580,22 +4886,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4603,30 +4909,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Понови сва отпремања + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Потврдите уклањања налога - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Да ли стварно желите да уклоните конекцију ка налогу <i>%1</i>?</p><p><b>Белешка:</b> Овим <b>нећете</b>обрисати ниједан фајл.</p> - + Remove connection Уклоните конекцију - + Cancel Поништи @@ -4764,8 +5076,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4773,8 +5085,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4872,123 +5184,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Неподржана верзија сервера - + 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. - + Disconnected Неповезан - + Disconnected from some accounts Изгубљена веза за неке налоге - + Disconnected from %1 Одјављен са %1 - + Disconnected from accounts: Одјављен са налога: - + Account %1: %2 Налог %1: %2 - + Please sign in Пријавите се - + Signed out Одјављен - + Account synchronization is disabled Синхронизација налога је искључена - - + + Synchronization is paused Синхронизација је паузирана - + Folder %1: %2 Фасцикла %1: %2 - + Unresolved conflicts Неразрешени конфликти - + Up to date Ажурно - + Error during synchronization Грешка приликом синхронизације - + There are no sync folders configured. Нема подешених фасцикли за синхронизацију. - + No sync folders configured Нису подешене фасцикле за синхронизацију - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) Синхронизујем %1 од %2 (преостало %3) - + Syncing %1 of %2 Синхронизујем %1 од %2 - + Syncing %1 (%2 left) Синхронизујем %1 (преостало %2) - + Syncing %1 Синхронизујем %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5140,27 +5452,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5226,30 +5538,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5265,7 +5653,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5323,6 +5711,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5386,67 +5790,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5530,24 +5934,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account Тренутни налог - - + + Resume sync for all - - + + Pause sync for all @@ -5557,22 +5961,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account Додај налог - + Add new account - + Settings Поставке - + Exit Изађи @@ -5581,11 +5985,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5597,70 +5996,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected Повезан - + Disconnected Неповезан - + Open Nextcloud Talk in browser - + More apps Још апликација - + Open %1 in browser Отвори %1 у прегледачу - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available Системска касета није доступна - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5668,7 +6072,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Направљено од ГИТ ревизије <a href="%1">%2</a> %3, %4 користећи QT %5, %6</small></p> @@ -5702,72 +6106,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Обрисано - + Moved to %1 Премештено у %1 - + Ignored Игнорисано - + Filesystem access error Грешка приступа фајл-систему - + Error Грешка - + Updated local metadata Ажурирани локални метаподаци - + Unknown Непознато - + downloading преузимам - + uploading отпремам - + deleting бришем - + moving премештам - + ignoring игноришем - + error грешка - + updating local metadata ажурирам локалне метаподатке diff --git a/translations/client_sv.ts b/translations/client_sv.ts index 73018e5a5..f970d7054 100644 --- a/translations/client_sv.ts +++ b/translations/client_sv.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Öppna %1 lokalt - + In %1 Om %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Visa fler åtgärder @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Avfärda + + + Open file details + Öppna filinformation + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Aktivitetslista @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Rensa statusmeddelandemenyn @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Avfärda + + + Activity Aktivitet - + Sharing Delning @@ -226,12 +236,12 @@ Att flytta till papperskorgen är inte implementerat på denna plattform - + Error removing "%1": %2 Kunde inte radera "%1": %2 - + Could not remove folder "%1" Kunde inte ta bort mappen "%1" @@ -321,7 +331,7 @@ Felaktig HTTP-kod i svaret från servern. '204' förväntades, men "%1 %2" mottogs. - + "%1 Failed to unlock encrypted folder %2". "%1 kunde inte låsa upp den krypterade mappen %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Filen %1 är redan låst av %2. - + Lock operation on %1 failed with error %2 Låsning av %1 misslyckades med felet %2 - + Unlock operation on %1 failed with error %2 Upplåsning av %1 misslyckades med felet %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Avbryt @@ -400,12 +410,12 @@ Det verkar som att funktionen "Virtuella filer" är aktiverad för denna mapp. För närvarande är det inte möjligt att uteslutande ladda ner virtuella filer med end-to-end-kryptering. För bästa upplevelse med virtuella filer och end-to-end-kryptering, säkerställ att "Gör alltid tillgänglig lokalt" är aktiverat. - + End-to-end Encryption with Virtual Files Ändpunkt-till-ändpunkt-kryptering med virtuella filer - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Det verkar som att funktionen "Virtuella filer" är aktiverad för denna mapp. För närvarande är det inte möjligt att ladda ner virtuella filer med ändpunkt-till-ändpunkt-kryptering. För virtuella filer och ändpunkt-till-ändpunkt-kryptering, verifiera att "Gör alltid tillgänglig lokalt" är aktiverat på den krypterade mappen. @@ -415,29 +425,29 @@ Kryptera inte mapp - + Do not encrypt folder Kryptera inte mapp - + Encrypt folder Kryptera mapp - + No account configured. Inget konto är konfigurerat. - - Display mnemonic - Visa mnemonic + + Disable encryption + Inaktivera kryptering - End-to-end encryption has been enabled for this account - Ändpunkt-till-ändpunkt-kryptering har aktiverats för detta konto + Display mnemonic + Visa mnemonic @@ -445,19 +455,24 @@ Aktivera kryptering - + + End-to-end encryption has been enabled for this account + Ändpunkt-till-ändpunkt-kryptering har aktiverats för detta konto + + + Warning Varning - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? Ändpunkt-till-ändpunkt-kryptering är inte konfigurerad på den här enheten. När den är konfigurerad kommer du att kunna kryptera den här mappen. Vill du aktivera ändpunkt-till-ändpunkt-kryptering? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Du kan inte kryptera en mapp med innehåll, ta bort filerna. @@ -470,121 +485,121 @@ Vänta på en ny synk, sedan kryptera den. Detta konto stödjer ändpunkt-till-ändpunkt-kryptering - + Encryption failed Kryptering misslyckades - + Could not encrypt folder because the folder does not exist anymore Kunde inte kryptera mappen eftersom den inte längre existerar - - + + Open folder Öppna mapp - + Encrypt Kryptera - - + + Edit Ignored Files Redigera ignorerade filer - - + + Create new folder Skapa ny mapp - - + + Availability Tillgänglighet - + Choose what to sync Välj vad som ska synkroniseras - + Force sync now Tvinga synkronisering nu - + Restart sync Starta om synkronisering - + Resume sync Återuppta synkronisering - + Pause sync Pausa synkronisering - + Remove folder sync connection Ta bort anslutning till mappsynkronisering - + Disable virtual file support … Inaktivera stöd för virtuella filer ... - + Enable virtual file support %1 … Aktivera stöd för virtuella filer %1 … - + (experimental) (experimentell) - + Folder creation failed Kunde inte skapa mappen - + <p>Could not create local folder <i>%1</i>.</p> <p>Kunde inte skapa lokal mapp <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Bekräfta radering av anslutning till mappsynkronisering - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vill du verkligen avbryta synkronisering av mappen <i>%1</i>?</p><p><b>Observera:</b> Detta kommer <b>inte</b> radera några filer.</p> - + Remove Folder Sync Connection Ta bort anslutning till mappsynkronisering - + Disable virtual file support? Inaktivera stöd för virtuella filer? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ Den enda fördelen med att inaktivera stöd för virtuella filer är att den sel Den här åtgärden avbryter alla synkroniseringar som körs. - + Disable support Inaktivera support @@ -607,145 +622,177 @@ Den här åtgärden avbryter alla synkroniseringar som körs. End to end krypteringsord - + End-to-end encryption mnemonic Ändpunkt-till-ändpunkt krypteringsord - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). För att skydda din krypteringsidentitet, krypterar vi den med en mnemoteknisk av 12 ord. Notera dessa krypteringsord och håll dem säkra. De kommer behövas för att lägga till andra enheter till ditt konto (t.ex. mobiltelefon eller laptop). - + + Disable end-to-end encryption + Inaktivera ändpunkt-till-ändpunkt-kryptering + + + + Disable end-to-end encryption for %1? + Inaktivera ändpunkt-till-ändpunkt-kryptering för %1? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Om du tar bort ändpunkt-till-ändpunkt-kryptering tar du bort lokalt synkroniserade filer som är krypterade.<br>Krypterade filer kommer att finnas kvar på servern. + + + Sync Running Synkronisering pågår - + The syncing operation is running.<br/>Do you want to terminate it? En synkronisering pågår.<br/>Vill du avbryta den? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) av %2 används. Vissa mappar, inklusive nätverks- eller delade mappar, kan ha andra begränsningar. - + %1 of %2 in use %1 av %2 används - + Currently there is no storage usage information available. Just nu finns ingen utrymmes information tillgänglig - + %1 in use %1 används - + %1 as %2 %1 som %2 - + The server version %1 is unsupported! Proceed at your own risk. Serverversion %1 stöds inte officiellt! Fortsätt på egen risk. - + Connected to %1. Ansluten till %1. - + Server %1 is temporarily unavailable. Servern %1 är för tillfället inte tillgänglig. - + Server %1 is currently in maintenance mode. Servern %1 är för närvarande i underhållsläge. - + Signed out from %1. Utloggad från %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Anskaffar autentisering från webbläsaren. <a href='%1'>Klicka här </a> för att öppna webbläsaren igen. - + Connecting to %1 … Ansluter till %1 … - + No connection to %1 at %2. Ingen anslutning till %1 vid %2. - + Server configuration error: %1 at %2. Felaktig serverkonfiguration: %1 på %2. - + No %1 connection configured. Ingen %1 anslutning konfigurerad. - + There are folders that were not synchronized because they are too big: Dessa mappar har inte synkroniserats för att de är för stora: - + There are folders that were not synchronized because they are external storages: Det finns mappar som inte synkroniserats för att de är externa lagringsytor: - + There are folders that were not synchronized because they are too big or external storages: Det finns mappar som inte blivit synkroniserade på grund av att de är för stora eller är externa lagringsytor: - + Confirm Account Removal Bekräfta radering an kontot - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vill du verkligen avsluta anslutningen till kontot <i>%1</i>?</p><p><b>Observera:</b> Detta kommer <b>inte</b> radera några filer.</p> - + Remove connection Ta bort anslutning - - + This account supports end-to-end encryption Detta konto stödjer ändpunkt-till-ändpunkt-kryptering - + Set up encryption Aktivera kryptering - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - Ändpunkt-till-ändpunkt-kryptering har aktiverats på det här kontot med en annan enhet.<br>Det kan aktiveras på den här enheten genom att ange ditt krypteringsord. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Ändpunkt-till-ändpunkt-kryptering har aktiverats på det här kontot med en annan enhet.<br>Det kan aktiveras på den här enheten genom att ange ditt krypteringsord.<br>Detta kommer att möjliggöra synkronisering av befintliga krypterade mappar. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Den autentiserade begäran till servern omdirigerades till "%1". URL:n är felaktig, servern är felkonfigurerad. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Åtkomst förbjuden av servern. För att bekräfta att du har korrekta rättigheter, <a href="%1">klicka här</a> för att ansluta till tjänsten med din webb-läsare. + + + + There was an invalid response to an authenticated WebDAV request + Det var ett ogiltigt svar på en verifierad WebDAV-begäran @@ -799,7 +846,7 @@ Den här åtgärden avbryter alla synkroniseringar som körs. OCC::ActivityListModel - + For more activities please open the Activity app. Öppna Aktivitetsappen för fler aktiviteter. @@ -809,12 +856,12 @@ Den här åtgärden avbryter alla synkroniseringar som körs. Hämtar aktiviteter... - + Fetching activities … Hämtar aktiviteter ... - + Files from the ignore list as well as symbolic links are not synced. Filer från ignorerings-listan och symboliska länkar synkroniseras inte. @@ -865,32 +912,59 @@ Den här åtgärden avbryter alla synkroniseringar som körs. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Att fortsätta innebär <b>att dessa inställningar tas bort</b>. - + Continuing will mean <b>ignoring these settings</b>. Att fortsätta innebär <b>att dessa inställningar ignoreras</b>. - + 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>. Vissa inställningar har konfigurerats i nyare versioner av den här klienten och använder funktioner som inte är tillgängliga i den här versionen.<br><br>%1<br><br>Den aktuella konfigurationsfilen har redan säkerhetskopierats till <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Avsluta - + Continue Fortsätt - + Error accessing the configuration file Kunde inte komma åt konfigurationsfilen @@ -900,12 +974,12 @@ Den här åtgärden avbryter alla synkroniseringar som körs. Ett fel uppstod vid läsning av konfigurationsfil vid %1. Kontrollera att filen kan nås av din användare. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Ett fel uppstod vid läsning av konfigurationsfilen på %1. Kontrollera att filen kan nås av ditt systemkonto. - + Quit %1 Avsluta %1 @@ -951,56 +1025,216 @@ Den här åtgärden avbryter alla synkroniseringar som körs. Filen %1 har ogiltig ändringstid. Ladda inte upp till servern. - + File Removed (start upload) %1 Filen borttagen (starta uppladdning) %1 - + File %1 has invalid modification time. Do not upload to the server. Filen %1 har ogiltig ändringstid. Ladda inte upp till servern. - + Local file changed during syncing. It will be resumed. Lokal fil ändrades under synkronisering. Den kommer återupptas. - - + + Local file changed during sync. Lokal fil ändrades under synkronisering. - + Network error: %1 Nätverksfel: %1 - + Error updating metadata: %1 Ett fel uppstod när metadata skulle uppdateras: %1 - + The file %1 is currently in use Filen %1 används för tillfället - + The local file was removed during sync. Den lokala filen togs bort under synkronisering. - + Restoration failed: %1 Återställning misslyckades: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Kunde inte byta namn på filen eftersom filnamnet är upptaget. Ange ett annat filnamn. + + + + Could not rename file. Please make sure you are connected to the server. + Kunde inte byta namn på filen. Kontrollera anslutningen till servern. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Du har inte behörighet att byta namn på den här filen. Be ägaren till filen att byta namn på den. + + + + Failed to fetch permissions with error %1 + Misslyckades att hämta behörigheter med felet %1 + + + + Filename contains leading and trailing spaces. + Filnamnet innehåller blanksteg i början och slutet. + + + + Filename contains leading spaces. + Filnamnet innehåller inledande blanksteg. + + + + Filename contains trailing spaces. + Filnamnet innehåller blanksteg i slutet. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Skiftlägeskonflikt + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Filen kunde inte synkroniseras eftersom den skapar en skiftlägeskonflikt med en befintlig fil på detta system. + + + + Error + Fel + + + + Existing file + Befintlig fil + + + + file A + fil A + + + + fileA + filA + + + + + today + idag + + + + + 0 byte + 0 byte + + + + + Open existing file + Öppna befintlig fil + + + + Case clashing file + Fil med skiftlägeskonflikt. + + + + file B + fil B + + + + fileB + filB + + + + + Open clashing file + Öppna den konfliktande filen + + + + Please enter a new name for the clashing file: + Ange ett nytt namn för den konfliktande filen: + + + + New filename + Nytt filnamn + + + + Rename file + Byt namn på fil + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Filen "%1" kunde inte synkroniseras på grund av en skiftlägeskonflikt med en befintlig fil på detta system. + + + + %1 does not support equal file names with only letter casing differences. + %1 stöder inte lika filnamn med endast skiftlägesskillnader. + + + + Filename contains leading and trailing spaces. + Filnamnet innehåller blanksteg i början och slutet. + + + + Filename contains leading spaces. + Filnamnet innehåller inledande blanksteg. + + + + Filename contains trailing spaces. + Filnamnet innehåller blanksteg i slutet. + + + + Use invalid name + Använd ogiltigt namn + + + + Filename contains illegal characters: %1 + Filnamnet innehåller ogiltiga tecken: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database Fel vid skrivning av metadata till databasen @@ -1018,12 +1252,12 @@ Den här åtgärden avbryter alla synkroniseringar som körs. Vänligen ange ditt lösenord för end-to-end-kryptering:<br><br>Användare: %2<br>Konto: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Ange din lösenordsfras för ändpunkt-till-ändpunkt-kryptering:<br><br>Användarnamn: %2<br>Konto: %3<br> - + Enter E2E passphrase Ange lösenord för E2E @@ -1199,8 +1433,8 @@ Den här åtgärden avbryter alla synkroniseringar som körs. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Serverfel: PROPFIND-svar är inte XML-formaterat! @@ -1208,27 +1442,27 @@ Den här åtgärden avbryter alla synkroniseringar som körs. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Fel uppstod när mappen %1 öppnades - + Directory not accessible on client, permission denied Mappen kan inte öppnas av klienten, åtkomst nekad - + Directory not found: %1 Mappen hittades inte: %1 - + Filename encoding is not valid Filnamnets teckenuppsättning är ogiltig - + Error while reading directory %1 Ett fel uppstod när mappen %1 skulle öppnas @@ -1236,91 +1470,91 @@ Den här åtgärden avbryter alla synkroniseringar som körs. OCC::EditLocallyJob - + Invalid token received. Ogiltig token mottagen. - - - - - - + + + + + + Please try again. Försök igen. - + Invalid file path was provided. Ogiltig sökväg angavs. - + Could not find an account for local editing. Det gick inte att hitta ett konto för lokal redigering. - - + + Could not validate the request to open a file from server. Det gick inte att validera begäran om att öppna en fil från servern. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Det gick inte att hitta en fil för lokal redigering. Se till att sökvägen är giltig och att den är synkroniserad lokalt. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Det gick inte att hitta en fil för lokal redigering. Kontrollera att den inte exkluderas via selektiv synkronisering. - + Server error: PROPFIND reply is not XML formatted! Serverfel: PROPFIND-svar är inte XML-formaterat! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Kunde inte hitta remote filinformation för lokal redigering. Kontrollera att sökvägen är giltig. - + Could not open %1 - + Kunde inte öppna %1 - + File %1 already locked. - + Filen %1 är redan låst. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Låset varar i %1 minuter. Du kan också låsa upp filen manuellt när du är klar med redigeringen. - + File %1 now locked. - + Filen %1 är nu låst. - + File %1 could not be locked. - + Filen %1 kunde inte låsas. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Kunde inte generera metadata för kryptering, låser upp mappen. @@ -1450,145 +1684,145 @@ Det kan vara problem med dina OpenSSL-bibliotek. OCC::Folder - + Local folder %1 does not exist. Den lokala mappen %1 finns inte. - + %1 should be a folder but is not. %1 borde vara en mapp, men är inte det. - + %1 is not readable. %1 är inte läsbar. - + %1 and %n other file(s) have been removed. %1 och %n andra filer har tagits bort.%1 och %n andra filer har tagits bort. - + %1 has been removed. %1 names a file. %1 har tagits bort. - + %1 and %n other file(s) have been added. %1 fil har lagts till.%1 och %n ytterligare filer har lagts till. - + %1 has been added. %1 names a file. %1 har lagts till. - + %1 and %n other file(s) have been updated. %1 och %n andra filer har uppdaterats.%1 och %n andra filer har uppdaterats. - + %1 has been updated. %1 names a file. %1 har uppdaterats. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 har döpts om till %2 och %n andra filer har döpts om.%1 har döpts om till %2 och %n andra filer har döpts om. - + %1 has been renamed to %2. %1 and %2 name files. %1 har döpts om till %2. - + %1 has been moved to %2 and %n other file(s) have been moved. %1 har flyttats till %2 och %n andra filer har flyttats.%1 har flyttats till %2 och %n andra filer har flyttats. - + %1 has been moved to %2. %1 har flyttats till %2. - + %1 has and %n other file(s) have sync conflicts. %1 har och %n annan fil har synkroniseringskonflikter.%1 har och %n andra filer har synkroniseringskonflikter. - + %1 has a sync conflict. Please check the conflict file! %1 har en synkroniseringskonflikt. Vänligen kontrollera konfliktfilen! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 och %n andra filer kunde inte synkas på grund av fel. Se loggen för detaljer.%1 och %n andra filer kunde inte synkroniseras på grund av fel. Se loggen för detaljer. - + %1 could not be synced due to an error. See the log for details. %1 kunde inte synkroniseras på grund av ett fel. Se loggen för detaljer. - + %1 and %n other file(s) are currently locked. %1 och %n andra fil(er) är för närvarande låsta.%1 och %n andra fil(er) är för närvarande låsta. - + %1 is currently locked. %1 är för närvarande låst. - + Sync Activity Synkroniseringsaktivitet - + Could not read system exclude file Kunde inte läsa systemets exkluderings-fil - + A new folder larger than %1 MB has been added: %2. En ny mapp större än %1 MB har lagts till: %2. - + A folder from an external storage has been added. En mapp från en extern lagringsyta har lagts till. - + Please go in the settings to select it if you wish to download it. Vänligen gå till inställningar och välj den om du önskar att hämta den. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Mappen %1 skapades men var tidigare exkluderad från synkronisering. Data i denna mapp kommer inte att synkroniseras. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Filen %1 skapades men var tidigare exkluderad från synkronisering. Den kommer inte att synkroniseras. - + 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). @@ -1601,7 +1835,7 @@ Det betyder att synkroniseringsklienten inte kan ladda upp lokala ändringar ome %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ Om du återställer dessa filer kommer de att synkroniseras till servern på nyt Om du bestämmer dig för att radera filerna är de inte tillgängliga för dig, såvida du inte är ägaren. - + 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. @@ -1621,17 +1855,17 @@ If this was an accident and you decide to keep your files, they will be re-synce Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroniseras på nytt från servern. - + Remove All Files? Ta bort alla filer? - + Remove all files Ta bort alla filer - + Keep files Behåll filer @@ -1667,22 +1901,22 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni OCC::FolderMan - + Could not reset folder state Kunde inte återställa mappens skick - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. En gammal synkroniseringsjournal "%1" hittades, men kunde inte tas bort. Kontrollera att inget program använder den för närvarande. - + (backup) (säkerhetskopia) - + (backup %1) (säkerhetkopia %1) @@ -1692,27 +1926,27 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni Okänt tillstånd. - + Undefined state. Okänt tillstånd. - + Waiting to start syncing. Väntar på att starta synkronisering. - + Preparing for sync. Förbereder synkronisering - + Sync is running. Synkronisering pågår. - + Sync finished with unresolved conflicts. Synkroniseringen lyckades, men olösta konflikter uppstod. @@ -1732,62 +1966,62 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni Användare Avbryt - + Last sync was successful. Senaste synkronisering lyckades. - + Setup error. Inställningsfel. - + Sync request was cancelled. Synkroniseringsbegäran avbröts. - + Sync is paused. Synkronisering är pausad. - + %1 (Sync is paused) %1 (synkronisering pausad) - + No valid folder selected! Ingen giltig mapp markerad! - + The selected path does not exist! Den valda sökvägen existerar inte! - + The selected path is not a folder! Den markerade sökvägen är inte en mapp! - + You have no permission to write to the selected folder! Du har inga skrivrättigheter till den valda mappen! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Den lokala mappen %1 innehåller redan en mapp som synkroniseras. Vänligen välj en annan! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Den lokala mappen %1 finns redan inuti en mapp som synkroniseras. Vänligen välj en annan! - + There is already a sync from the server to this local folder. Please pick another local folder! Det pågår redan en synkronisering från servern till denna lokala mappen. Vänligen välj en annan lokal mapp. @@ -1800,7 +2034,7 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni Lägg till mappsynkroniseringsanslutning - + File Fil @@ -1808,152 +2042,156 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni OCC::FolderStatusModel - + You need to be connected to add a folder Du måste vara ansluten för att lägga till en mapp - + Click this button to add a folder to synchronize. Klicka på den här knappen för att lägga till en mapp att synkronisera. - - + + Could not decrypt! + Kunde inte dekryptera! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Ett fel uppstod när mapplistan försökte läsas in från servern. - + Fetching folder list from server … Hämtar mapplistan från server … - + There are unresolved conflicts. Click for details. Det finns olösta konflikter. Klicka för detaljer. - + Virtual file support is enabled. Stöd för virtuella filer är aktiverat. - + Signed out Utloggad - + Synchronizing VirtualFiles with local folder Synkroniserar virtuella filer med lokal mapp - + Synchronizing with local folder Synkroniserar med lokal mapp - + Checking for changes in remote "%1" Söker efter ändringar i fjärrmappen "%1" - + Checking for changes in local "%1" Söker efter ändringar i lokal '%1' - + Reconciling changes slå ihop förärändringar - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Synkroniserar %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) hämta %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) ladda upp %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 av %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Några sekunder kvar, %1 av %2, fil %3 av %4 - + %5 left, %1 of %2, file %3 of %4 %5 kvar, %1 av %2, fil %3 av %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 av %2, fil %3 av %4 - + file %1 of %2 fil %1 av %2 - + Waiting … Väntar ... - + Waiting for %n other folder(s) … Väntat på %n andra mapp(ar) ...Väntat på %n andra mapp(ar) ... - + Preparing to sync … Förbereder synk ... @@ -1963,7 +2201,7 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni The watcher did not receive a test notification. - + Bevakaren fick ingen testnotifikation. @@ -2184,13 +2422,13 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni - + stable stabil - + beta beta @@ -2242,59 +2480,61 @@ Om detta var ett misstag och du vill behålla dina filer, kommer de att synkroni - + Create Debug Archive Skapa felsökningsarkiv - + Server notifications that require attention. Serveraviseringar som kräver uppmärksamhet. - + Show call notification dialogs. Visa dialogrutor för samtalsmeddelanden. - + You cannot disable autostart because system-wide autostart is enabled. Du kan inte deaktivera autostart eftersom autostart är aktiverat på systemnivå. - + Change update channel? Ändra uppdateringskanal? - + 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. 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. - + Uppdateringskanalen avgör vilka klientuppdateringar som kommer att erbjudas för installation. Den "stabila" kanalen innehåller endast uppgraderingar som anses tillförlitliga, medan versionerna i "beta"-kanalen kan innehålla nyare funktioner och buggfixar, men har ännu inte testats ordentligt. + +Observera att detta endast väljer vilken pool uppgraderingar tas från, och att det inte finns några nedgraderingar: Så att gå tillbaka från betakanalen till den stabila kanalen kan vanligtvis inte göras omedelbart och innebär att vänta på en stabil version som är nyare än den för närvarande installerade betaversionen. - + Change update channel Ändra uppdateringskanal - + Cancel Avbryt - + Zip Archives Zip-arkiv - + Debug Archive Created Felsökningsarkiv skapat - + Debug archive is created at %1 Felsökningsarkiv är skapat på %1 @@ -2302,22 +2542,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Lösenord för delning krävs - + Please enter a password for your link share: Ange ett lösenord for din länkdelning: - + Sharing error Fel vid delning - + Could not retrieve or create the public link share. Error: %1 @@ -2555,6 +2795,11 @@ Objekt där radering är tillåtet raderas om de förhindrar att en mapp tas bor Close Stäng + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2578,7 +2823,9 @@ Objekt där radering är tillåtet raderas om de förhindrar att en mapp tas bor The client can write debug logs to a temporary folder. These logs are very helpful for diagnosing problems. Since log files can get large, the client will start a new one for each sync run and compress older ones. It will also delete log files after a couple of hours to avoid consuming too much disk space. If enabled, logs will be written to %1 - + Klienten kan skriva felsökningsloggar till en temporär mapp. Dessa loggar är till stor hjälp för att diagnostisera problem. +Eftersom loggfiler kan bli stora kommer klienten att skapa en ny för varje synkroniseringskörning och komprimera äldre loggar. Den kommer även radera loggfiler efter några timmar för att undvika att förbruka för mycket diskutrymme. +Om aktiverat kommer loggar att skrivas till %1 @@ -2888,60 +3135,60 @@ Observera att om du använder kommandoradsalternativ för loggning kommer den h - + Use &virtual files instead of downloading content immediately %1 Använd &virtuella filer istället för att ladda ner innehåll direkt %1 - + (experimental) (experimentell) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Windows stödjer inte virtuella filer direkt i rotkataloger. Välj en underkatalog. - + %1 folder "%2" is synced to local folder "%3" %1 mappen "%2" är synkroniserad mot den lokala mappen "%3" - + Sync the folder "%1" Synkronisera mappen '%1' - + Warning: The local folder is not empty. Pick a resolution! Varning: Den lokala mappen är inte tom. Välj en lösning! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 ledigt utrymme - + Virtual files are not available for the selected folder Virtuella filer är inte tillgängliga för den valda mappen - + Local Sync Folder Lokal mapp för synkronisering - - + + (%1) (%1) - + There isn't enough free space in the local folder! Det finns inte tillräckligt med ledigt utrymme i den lokala mappen! @@ -3013,7 +3260,8 @@ Observera att om du använder kommandoradsalternativ för loggning kommer den h OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Omöjligt att få ändringstid för filen i konflikten %1 @@ -3045,144 +3293,144 @@ Observera att om du använder kommandoradsalternativ för loggning kommer den h OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Lyckades ansluta till %1: %2 version %3 (%4)</font><br/><br/> - + Invalid URL Ogiltig webbadress - + Failed to connect to %1 at %2:<br/>%3 Misslyckades att ansluta till %1 vid %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Försök att ansluta till %1 på %2 tog för lång tid. - + Trying to connect to %1 at %2 … Försöker ansluta till %1 på %2 ... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Den autentiserade begäran till servern omdirigerades till "%1". URL:n är felaktig, servern är felkonfigurerad. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Åtkomst förbjuden av servern. För att bekräfta att du har korrekta rättigheter, <a href="%1">klicka här</a> för att ansluta till tjänsten med din webb-läsare. - + There was an invalid response to an authenticated WebDAV request Det var ett ogiltigt svar på en verifierad WebDAV-begäran - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Den lokala synkroniseringsmappen % 1 finns redan, aktiverar den för synkronisering.<br/><br/> - + Creating local sync folder %1 … Skapar lokal synkroniseringsmapp %1 ... - + OK OK - + failed. misslyckades. - + Could not create local folder %1 Kunde inte skapa lokal mapp %1 - + No remote folder specified! Ingen fjärrmapp specificerad! - + Error: %1 Fel: %1 - + creating folder on Nextcloud: %1 skapar mapp på Nextcloud: %1 - + Remote folder %1 created successfully. Fjärrmapp %1 har skapats. - + The remote folder %1 already exists. Connecting it for syncing. Fjärrmappen %1 finns redan. Ansluter den för synkronisering. - - + + The folder creation resulted in HTTP error code %1 Skapande av mapp resulterade i HTTP felkod %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Det gick inte att skapa mappen efter som du inte har tillräckliga rättigheter!<br/>Vänligen återvänd och kontrollera dina rättigheter. - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Misslyckades skapa fjärrmappen, troligen p.g.a felaktiga inloggningsuppgifter.</font><br/>Kontrollera dina inloggningsuppgifter.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Misslyckades skapa fjärrmapp %1 med fel <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. En synkroniseringsanslutning från %1 till fjärrmappen %2 har skapats. - + Successfully connected to %1! Ansluten till %1! - + Connection to %1 could not be established. Please check again. Anslutningen till %1 kunde inte etableras. Vänligen kontrollera och försök igen. - + Folder rename failed Omdöpning av mapp misslyckades - + Cannot 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. 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. Stäng mappen eller filen och försök igen eller avbryt installationen. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Lokal synkroniseringsmapp %1 skapad!</b></font> @@ -3205,12 +3453,12 @@ Observera att om du använder kommandoradsalternativ för loggning kommer den h Avbryt - + Enable experimental feature? Aktivera experimentell funktion? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3227,12 +3475,12 @@ Om du byter till det här läget avbryts all pågående synkronisering. Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda det, rapportera eventuella problem som dyker upp. - + Enable experimental placeholder mode Aktivera experimentellt platshållarläge - + Stay safe Var försiktig @@ -3261,162 +3509,167 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Symboliska länkar kan ej synkroniseras. - + File is listed on the ignore list. Filen är listad i undantagslistan. - + File names ending with a period are not supported on this file system. Filnamn som slutar med en punkt stöds inte på detta filsystem. - + File names containing the character "%1" are not supported on this file system. ilnamn innehållandes tecknet "%1"' stöds inte på detta filsystem. - + File name contains at least one invalid character Filnamnet innehåller minst ett ogiltigt tecken - + The file name is a reserved name on this file system. Detta filnamn är reserverat på detta filsystem. - + Filename contains trailing spaces. Filnamnet innehåller inledande blanksteg. - + Filename contains leading spaces. Filnamnet innehåller inledande blanksteg. - + Filename contains leading and trailing spaces. Filnamnet innehåller blanksteg i början och slutet. - + Filename is too long. Filnamnet är för långt. - + File/Folder is ignored because it's hidden. Filen/mappen ignoreras eftersom den är dold. - + Stat failed. Status misslyckades. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Konflikt: Serverversion hämtad, lokal kopia omdöpt och inte uppladdad. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Skiftlägeskonflikt: Serverfilen har laddats ner och döpts om för att undvika konflikt. + + + The filename cannot be encoded on your file system. Filnamnet kan inte avkodas på ditt filsystem. - + The filename is blacklisted on the server. Filnamnet är svartlistat på servern. - + File has extension reserved for virtual files. Filens ändelse är reserverad för virtuella filer. - + size storlek - + permission behörighet - + file id fil-ID - + Server reported no %1 Servern svarade inte %1 - + Cannot sync due to invalid modification time Det går inte att synkronisera på grund av ogiltig ändringstid - + Error while deleting file record %1 from the database Fel vid borttagning av filpost %1 från databasen - + Conflict when uploading a folder. It's going to get cleared! Konflikt vid uppladdning av en mapp. Den kommer att rensas! - + Conflict when uploading a file. It's going to get removed! Konflikt vid uppladdning av en fil. Den kommer att tas bort! - + Ignored because of the "choose what to sync" blacklist Ignorerad eftersom den är svartlistad i "välj vad som ska synkroniseras" - + Not allowed because you don't have permission to add subfolders to that folder Otillåtet eftersom du inte har rättigheter att lägga till undermappar i den mappen. - + Not allowed because you don't have permission to add files in that folder Otillåtet eftersom du inte har rättigheter att lägga till filer i den mappen. - + Not allowed to upload this file because it is read-only on the server, restoring Inte tillåtet att ladda upp denna fil eftersom den är skrivskyddad på servern, återställer - + Moved to invalid target, restoring Flyttade till ogiltigt mål, återställer - + Not allowed to remove, restoring Borttagning tillåts ej, återställer - + Error while reading the database Fel uppstod när databasen skulle läsas - + Server replied with an error while reading directory "%1" : %2 Servern svarade med ett fel när mappen lästes "%1" : %2 @@ -3424,22 +3677,22 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::PropagateDirectory - + could not delete file %1 from local DB Kunde inte ta bort filen %1 från lokal DB - + Error updating metadata due to invalid modification time Fel vid uppdatering av metadata på grund av ogiltig ändringstid - + Error updating metadata: %1 Ett fel uppstod när metadata skulle uppdateras: %1 - + File is currently in use Filen används @@ -3452,19 +3705,19 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda kunde inte hämta filen %1 från lokal DB - + File %1 cannot be downloaded because encryption information is missing. Fil %1 kan inte hämtas eftersom krypteringsinformation fattas. - - + + File has changed since discovery Filen har ändrats sedan upptäckten - + Could not delete file record %1 from local DB Kunde inte ta bort filposten %1 från lokal DB @@ -3475,32 +3728,32 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Filen %1 kan inte hämtas på grund av namnkonflikt med en lokal fil! - + File %1 can not be downloaded because of a local file name clash! Filen %1 kan inte hämtas på grund av namnkonflikt med en lokal fil! - + The download would reduce free local disk space below the limit Hämtningen skulle reducera det fria diskutrymmet under gränsen - + Free space on disk is less than %1 Ledigt utrymme är under %1 - + File was deleted from server Filen har tagits bort från servern - + The file could not be downloaded completely. Filen kunde inte hämtas fullständigt. - + The downloaded file is empty, but the server said it should have been %1. Den nedladdade filen är tom, men servern meddelade att den borde ha varit %1. @@ -3510,18 +3763,23 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Fil %1 kan inte sparas eftersom namnet krockar med en lokal fil! - - + + File %1 has invalid modified time reported by server. Do not save it. Filen %1 har en ogiltig ändringstid rapporterad av servern. Spara den inte. - + + File %1 downloaded but it resulted in a local file name clash! + Fil %1 har laddats ner men det resulterade i en konflikt med ett lokalt filnamn! + + + Error updating metadata: %1 Ett fel uppstod när metadata skulle uppdateras: %1 - + The file %1 is currently in use Filen %1 används för tillfället @@ -3542,7 +3800,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 kunde inte ta bort fil %1, fel: %2 @@ -3553,16 +3811,21 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda + Folder %1 cannot be created because of a local file or folder name clash! + Mapp %1 kan inte skapas på grund av en konflikt med ett lokalt fil- eller mappnamn! + + + Could not create folder %1 Kunde inte skapa mappen %1 - + Error updating metadata: %1 Ett fel uppstod när metadata skulle uppdateras: %1 - + The file %1 is currently in use Filen %1 används för tillfället @@ -3570,7 +3833,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Det gick inte att ta bort %1 på grund av ett lokalt filnamn @@ -3583,46 +3846,51 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Filen %1 kan inte döpas om till %2 på grund av namnkonflikt med en lokal fil - - - + + File %1 downloaded but it resulted in a local file name clash! + Fil %1 har laddats ner men det resulterade i en konflikt med ett lokalt filnamn! + + + + + could not get file %1 from local DB kunde inte hämta filen %1 från lokal DB - + Error setting pin state Kunde inte sätta pin-status - - + + Error updating metadata: %1 Fel vid uppdatering av metadata: %1 - + The file %1 is currently in use Filen %1 används för tillfället - - + + Could not delete file record %1 from local DB Kunde inte ta bort filposten %1 från lokal DB - + Failed to propagate directory rename in hierarchy - + Kunde inte propagera namnbyte på katalogen i hierarkin - + Failed to rename file Kunde inte döpa om filen @@ -3643,7 +3911,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Felaktig HTTP-kod i svaret från servern. 204 förväntades, men "%1 %2" mottogs. @@ -3656,12 +3924,12 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Felaktig HTTP-kod i svaret från servern. '201' förväntades, men "%1 %2" mottogs. - + Error writing metadata to the database: %1 Det gick inte att skriva metadata till databasen: %1 - + The file %1 is currently in use Filen %1 används för tillfället @@ -3669,42 +3937,42 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Kunde inte byta namn på %1 till %2, fel: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Felaktig HTTP-kod i svaret från servern. '201' förväntades, men "%1 %2" mottogs. - + could not get file %1 from local DB kunde inte hämta filen %1 från lokal DB - + Could not delete file record %1 from local DB Kunde inte ta bort filposten %1 från lokal DB - + Error updating metadata: %1 Fel vid uppdatering av metadata: %1 - + The file %1 is currently in use Filen %1 används för tillfället - + Error setting pin state Kunde inte sätta pin-status - + Error writing metadata to the database Fel vid skrivning av metadata till databasen @@ -3894,7 +4162,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::ServerNotificationHandler - + Reply Svara @@ -3912,23 +4180,23 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Inställningar - + %1 Settings This name refers to the application name e.g Nextcloud %1 inställningar - + General Allmänt - + Network Nätverk - + Account Konto @@ -3936,17 +4204,22 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::ShareModel - + Share link Dela länk - + Link share Länkdelning - + + Internal link + Intern länk + + + Enter a note for the recipient Ange en notering till mottagaren @@ -4022,7 +4295,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4031,132 +4304,171 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::SocketApi - + + Failed to encrypt folder at "%1" + Det gick inte att kryptera mappen "%1" + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + Kontot %1 har inte end-till-end-kryptering konfigurerad. Konfigurera detta i dina kontoinställningar för att aktivera mappkryptering. + + + + Failed to encrypt folder + Kunde inte kryptera mapp + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Kunde inte kryptera följande mapp: "%1". + +Servern svarade med fel: %2 + + + + Folder encrypted successfully + Kryptering av mapp lyckades + + + + The following folder was encrypted successfully: "%1" + Följande mapp krypterades: "%1" + + + Context menu share Delningsmeny - + Select new location … Välj ny plats … - + I shared something with you Jag delade något med dig - - + + Share options Delningsalternativ - - + + Activity Aktivitet - + Copy private link to clipboard Kopiera privat länk till urklipp - + Send private link by email … Skicka privat länk med e-post ... + + + Expire in %1 minutes + remaining time before lock expire + Går ut om %1 minuterGår ut om %1 minuter + - + Leave this share Lämna denna delning - + Resharing this file is not allowed Vidaredelning av denna fil är inte tillåtet - + Resharing this folder is not allowed Vidaredelning av denna mapp är inte tillåtet - - + + Copy public link Kopiera publik länk - + Copy internal link Kopiera intern länk - + + Encrypt + Kryptera + + + Lock file Lås fil - + Unlock file Lås upp fil - + Locked by %1 Låst av %1 - - Expire in %1 minutes - remaining time before lock expire - Går ut om %1 minuterGår ut om %1 minuter - - - + Expires in %1 minutes remaining time before lock expires Går ut om %1 minuterGår ut om %1 minuter - + Edit Ändra - + Open in browser Öppna i webbläsare - + Resolve conflict … Lös konflikt … - + Move and rename … Flytta och byt namn … - + Move, rename and upload … Flytta, byt namn och ladda upp … - + Delete local changes Radera lokala ändringar - + Move and upload … Flytta och ladda upp … - + Delete Ta bort @@ -4374,63 +4686,63 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (skippad på grund av ett tidigare fel, försök igen om %2) - + Could not update file: %1 Kunde inte uppdatera filen: %1 - + Could not update virtual file metadata: %1 Kunde inte uppdatera virtuell filmetadata: %1 - + Could not update file metadata: %1 Kunde inte uppdatera filens metadata: %1 - + Could not set file record to local DB: %1 Kunde inte ställa in filposten till lokal DB: %1 - + Unresolved conflict. Olöst konflikt. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Endast %1 tillgängligt, behöver minst %2 för att starta - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Kunde inte öppna eller återskapa den lokala synkroniseringsdatabasen. Säkerställ att du har skrivrättigheter till synkroniseringsmappen. - + Using virtual files with suffix, but suffix is not set Använder virtuella filer med suffix, men suffix är inte inställt - + Unable to read the blacklist from the local database Kunde inte läsa svartlistan från den lokala databasen - + Unable to read from the sync journal. Det går inte att läsa från synkroniseringsjournalen. - + Cannot open the sync journal Det går inte att öppna synkroniseringsjournalen @@ -4440,12 +4752,12 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Synkroniseringen kommer att återupptas inom kort. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Diskutrymmet är lågt: Hämtningar som skulle reducera det fria utrymmet under %1 hoppas över. - + There is insufficient space available on the server for some uploads. Det finns inte tillräckligt med utrymme på servern för vissa uppladdningar. @@ -4514,59 +4826,59 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::Systray - + Download Ladda ner - + Add account Lägg till konto - + Open main dialog Öppna huvuddialogen - - + + Pause sync Pausa synkronisering - - + + Resume sync Återuppta synkronisering - + Settings Inställningar - + Help Hjälp - + Exit %1 Avsluta %1 - + Pause sync for all Pausa synkronisering för alla - + Resume sync for all Återuppta synkronisering för alla - + %1: %2 %1: %2 @@ -4574,24 +4886,24 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Skrivbordsklient</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>Version %1. För mer information klicka <a href='%2'>här</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Använder plugin för virtuella filer: %1</small></p> - + <p>This release was supplied by %1</p> <p>Denna release levererades av %1</p> @@ -4599,22 +4911,22 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Kunde inte hämta leverantörer - + Failed to fetch search providers for '%1'. Error: %2 Det gick inte att hämta sökleverantörer för '%1'. Fel: %2 - + Search has failed for '%2'. Sökningen "%2' misslyckades. - + Search has failed for '%1'. Error: %2 Sökningen "%1'. Fel: %2. @@ -4622,30 +4934,36 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::User - + Retry all uploads Försök ladda upp igen + + + + Resolve conflict + Lös konflikt + OCC::UserModel - + Confirm Account Removal Bekräfta radering an kontot - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Vill du verkligen ta bort anslutningen till konto <i>%1</i>?</p><p><b>OBS:</b> Detta kommer <b>inte</b> radera några filer.</p> - + Remove connection Ta bort anslutning - + Cancel Avbryt @@ -4783,8 +5101,8 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Fel vid uppdatering av metadata på grund av ogiltig ändringstid @@ -4792,8 +5110,8 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Fel vid uppdatering av metadata på grund av ogiltig ändringstid @@ -4891,123 +5209,123 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda OCC::ownCloudGui - + Unsupported Server Version Serverversion stöds inte - + 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. Servern på kontot %1 kör en version %2 som inte stöds. Att använda den här klienten med serverversioner som inte stöds är oprövat och potentiellt farligt. Fortsätt på egen risk. - + Disconnected Bortkopplad - + Disconnected from some accounts Nedkopplad från vissa konton - + Disconnected from %1 Koppla från %1 - + Disconnected from accounts: Bortkopplad från dessa konton: - + Account %1: %2 Konto %1: %2 - + Please sign in Vänliga logga in - + Signed out Utloggad - + Account synchronization is disabled Synkronisering för konto är avstängd - - + + Synchronization is paused Synkroniseringen är pausad - + Folder %1: %2 Mapp %1: %2 - + Unresolved conflicts Olösta konflikter. - + Up to date Aktuell version - + Error during synchronization Fel vid synkronisering - + There are no sync folders configured. Det finns inga synkroniseringsmappar konfigurerade. - + No sync folders configured Inga mappar valda för synkronisering - + Checking for changes in remote "%1" Söker efter ändringar i fjärrmappen "%1" - + Checking for changes in local "%1" Söker efter ändringar i lokala "%1" - + Syncing %1 of %2 (%3 left) Synkroniserar %1 av %2 (%3 kvar) - + Syncing %1 of %2 Synkroniserar %1 av %2 - + Syncing %1 (%2 left) Synkroniserar %1 (%2 kvar) - + Syncing %1 Synkroniserar %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5159,27 +5477,27 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Ny mapp - + You renamed %1 Du döpte om %1 - + You deleted %1 Du raderade %1 - + You created %1 Du skapade %1 - + You changed %1 Du ändrade %1 - + Synced %1 Synkroniserade %1 @@ -5245,30 +5563,106 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Markera som läst + + ShareDelegate + + + Create a new share link + Skapa en ny delad länk + + + + Copy share link location + Kopiera delningslänkens plats + + + + Share options + Delningsalternativ + + + + ShareDetailsPage + + + An error occurred setting the share password. + Ett fel uppstod vid inställning av delningslösenordet. + + + + Edit share + Redigera delning + + + + Dismiss + Avfärda + + + + Share label + Delningsetikett + + + + Allow editing + Tillåt redigering + + + + Password protect + Lösenordsskydda + + + + Set expiration date + Välj utgångsdatum + + + + Note to recipient + Notering till mottagare + + + + Unshare + Sluta dela + + + + Add another link + Lägg till en annan länk + + + + Copy share link + Kopiera delningslänk + + ShareView - + Password required for new share Lösenord krävs för ny delning - + Share password Lösenord för delning - + Sharing is disabled Delning är inaktiverat - + This item cannot be shared. Det här objektet kan inte delas. - + Sharing is disabled. Delning är inaktiverat. @@ -5284,7 +5678,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda SyncJournalDb - + Failed to connect database. Kunde inte koppla mot databasen. @@ -5331,7 +5725,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Search result skeleton. - + Sökresultatskelett @@ -5342,6 +5736,22 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Visa fler resultat + + UnifiedSearchResultNothingFound + + + No results for + Inga resultat för + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + Sökresultat %1 + + UserLine @@ -5405,67 +5815,67 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda UserStatusSelector - + Online status Status - + Online Online - + Away Borta - + Do not disturb Stör ej - + Mute all notifications Stäng av alla aviseringar - + Invisible Osynlig - + Appear offline Visa som frånkopplad - + Status message Statusmeddelande - + What is your status? Vad är din status? - + Clear status message after Rensa status efter - + Cancel Avbryt - + Clear status message Rensa status - + Set status message Välj status @@ -5549,24 +5959,24 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Window - + Nextcloud desktop main dialog Nextcloud-klient huvuddialog - + Current account Nuvarande konto - - + + Resume sync for all Återuppta synkronisering för alla - - + + Pause sync for all Pausa synkronisering för alla @@ -5576,22 +5986,22 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Välj användarstatus - + Add account Lägg till konto - + Add new account Lägg till nytt konto - + Settings Inställningar - + Exit Avsluta @@ -5600,11 +6010,6 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Current user avatar Nuvarande användaravatar - - - Current account avatar - Avatar för aktuellt konto - Current user status is online @@ -5616,70 +6021,75 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda Användarens status är "Stör ej" - + + Current account avatar + Avatar för aktuellt konto + + + Current account status is online Aktuell kontostatus är online - + Current account status is do not disturb Aktuell kontostatus är stör ej - + + %1 - File activity + %1 - filhändelser + + + Account switcher and settings menu Kontobytare och inställningsmeny - + Open local folder of current account Öppna lokal mapp för aktuellt konto - + Connected Ansluten - + Disconnected Bortkopplad - + Open Nextcloud Talk in browser Öppna Nextcloud Talk i webbläsaren - + More apps Fler appar - + Open %1 in browser Öppna %1 i webbläsaren - + Unified search results list Sammanlagda sökresultat - - - %1 - File activity - %1 - filhändelser - main.cpp - + System Tray not available Systemfältet är inte tillgängligt - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 kräver ett fungerande systemfält. Om du kör XFCE, följ <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">dessa instruktioner</a>. Annars, installera ett systemfälts-program som "trayer" och försök igen. @@ -5687,7 +6097,7 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Byggd från Git revision <a href="%1">%2</a> den %3, %4 med Qt %5, %6</small></p> @@ -5721,72 +6131,77 @@ Detta är ett nytt experimentellt läge. Om du bestämmer dig för att använda + Server version downloaded, copied changed local file into case conflict conflict file + Serverversionen har laddats ner, den ändrade lokala filen har kopierats in i en fil för skiftlägeskonflikt. + + + Deleted Raderad - + Moved to %1 Flyttad till %1 - + Ignored Ignorerad - + Filesystem access error Åtkomstfel till filsystemet - + Error Fel - + Updated local metadata Uppdaterade lokal metadata - + Unknown Okänt - + downloading hämta - + uploading laddar upp - + deleting raderar - + moving flyttar - + ignoring ignorerar - + error fel - + updating local metadata uppdaterar lokala metadata diff --git a/translations/client_th.ts b/translations/client_th.ts index 86a3f20da..dfa59d6eb 100644 --- a/translations/client_th.ts +++ b/translations/client_th.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally เปิด %1 ในต้นทาง - + In %1 ใน %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions แสดงตัวเลือกเพิ่มเติม @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss ปิดทิ้ง + + + Open file details + เปิดรายละเอียดไฟล์ + Open share dialog @@ -37,20 +42,20 @@ ActivityList - + Activity list รายการกิจกรรม No activities yet - + ยังไม่มีกิจกรรม BasicComboBox - + Clear status message menu @@ -65,7 +70,7 @@ Answer Talk call notification - + รับสายในการแจ้งเตือน Talk @@ -75,7 +80,7 @@ Decline Talk call notification - + ปฏิเสธสายในการแจ้งเตือน Talk @@ -167,7 +172,7 @@ Opening file for local editing - + กำลังเปิดไฟล์สำหรับการแก้ไขที่ต้นทาง @@ -183,20 +188,25 @@ Error - + ข้อผิดพลาด FileDetailsPage - + + Dismiss + ปิดทิ้ง + + + Activity - + กิจกรรม - + Sharing - + การแชร์ @@ -204,7 +214,7 @@ File details of %1 · %2 - + รายละเอียดไฟล์ %1 · %2 @@ -223,15 +233,15 @@ Moving to the trash is not implemented on this platform - + แพลตฟอร์มนี้ยังไม่รองรับการย้ายไปยังถังขยะ - + Error removing "%1": %2 เกิดข้อผิดพลาดในการลบ "%1": %2 - + Could not remove folder "%1" ไม่สามารถลบโฟลเดอร์ "%1" @@ -321,7 +331,7 @@ - + "%1 Failed to unlock encrypted folder %2". "%1 ไม่สามารถปลดล็อกโฟลเดอร์เข้ารหัส %2" @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. ไฟล์ %1 ถูกล็อคอยู่โดย %2 - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel ยกเลิก @@ -400,12 +410,12 @@ - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,28 +425,28 @@ ไม่ต้องเข้ารหัสโฟลเดอร์ - + Do not encrypt folder - + Encrypt folder เข้ารหัสโฟลเดอร์ - + No account configured. ไม่มีบัญชีที่กำหนดค่าไว้ - - Display mnemonic + + Disable encryption - End-to-end encryption has been enabled for this account + Display mnemonic @@ -445,18 +455,23 @@ เปิดใช้งานการเข้ารหัส - + + End-to-end encryption has been enabled for this account + + + + Warning คำเตือน - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. @@ -468,121 +483,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed การเข้ารหัสล้มเหลว - + Could not encrypt folder because the folder does not exist anymore - - + + Open folder เปิดโฟลเดอร์ - + Encrypt เข้ารหัส - - + + Edit Ignored Files - - + + Create new folder สร้างโฟลเดอร์ใหม่ - - + + Availability ความพร้อมใช้งาน - + Choose what to sync เลือกสิ่งที่จะซิงค์ - + Force sync now บังคับซิงค์ตอนนี้ - + Restart sync เริ่มซิงค์ใหม่ - + Resume sync ซิงค์ต่อ - + Pause sync หยุดซิงค์ชั่วคราว - + Remove folder sync connection ลบการเชื่อมต่อโฟลเดอร์ซิงค์ - + Disable virtual file support … - + Enable virtual file support %1 … - + (experimental) - + Folder creation failed สร้างโฟลเดอร์ล้มเหลว - + <p>Could not create local folder <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal ยืนยันการลบการเชื่อมต่อโฟลเดอร์ซิงค์ - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>คุณต้องการหยุดซิงค์โฟลเดอร์ <i>%1</i> จริง ๆ หรือไม่?</p><p><b>หมายเหตุ:</b> การกระทำนี้จะ<b>ไม่</b>ลบไฟล์ใด ๆ</p> - + Remove Folder Sync Connection ลบการเชื่อมต่อโฟลเดอร์ซิงค์ - + Disable virtual file support? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -591,7 +606,7 @@ This action will abort any currently running synchronization. - + Disable support @@ -601,144 +616,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running กำลังซิงค์ - + The syncing operation is running.<br/>Do you want to terminate it? กำลังดำเนินการซิงค์อยู่<br/>คุณต้องการหยุดการทำงานหรือไม่? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. ใช้งานอยู่ %1 (%3%) จาก %2 บางโฟลเดอร์ รวมถึงที่ต่อเชื่อมบนเครือข่ายหรือโฟลเดอร์ที่แชร์อาจมีข้อจำกัดที่แตกต่างกัน - + %1 of %2 in use ใช้งานอยู่ %1 จาก %2 - + Currently there is no storage usage information available. ขณะนี้ไม่มีข้อมูลการใช้พื้นที่จัดเก็บ - + %1 in use ใช้งานอยู่ %1 - + %1 as %2 %1 ด้วยบัญชี %2 - + The server version %1 is unsupported! Proceed at your own risk. ไม่รองรับเซิร์ฟเวอร์รุ่น %1! ดำเนินการต่อบนความเสี่ยงของคุณเอง - + Connected to %1. เชื่อมต่อกับ %1 แล้ว - + Server %1 is temporarily unavailable. เซิร์ฟเวอร์ %1 ไม่สามารถใช้ได้ชั่วคราว - + Server %1 is currently in maintenance mode. เซิร์ฟเวอร์ %1 อยู่ในโหมดการบำรุงรักษา - + Signed out from %1. ลงชื่อออกจาก %1 แล้ว - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. กำลังได้รับอนุญาตจากเบราว์เซอร์ <a href='%1'>คลิกที่นี่</a>เพื่อเปิดเบราว์เซอร์อีกครั้ง - + Connecting to %1 … กำลังเชื่อมต่อไปยัง %1 … - + No connection to %1 at %2. ไม่มีการเชื่อมต่อไปยัง %1 ที่ %2 - + Server configuration error: %1 at %2. การกำหนดค่าเซิร์ฟเวอร์ผิดพลาด: %1 ที่ %2 - + No %1 connection configured. ไม่มีการเชื่อมต่อ %1 ที่ถูกกำหนดค่า - + There are folders that were not synchronized because they are too big: มีบางโฟลเดอร์ที่ไม่ถูกซิงโครไนซ์เพราะมีขนาดใหญ่เกินไป: - + There are folders that were not synchronized because they are external storages: มีบางโฟลเดอร์ที่ไม่ถูกซิงโครไนซ์เพราะเป็นพื้นที่จัดเก็บข้อมูลภายนอก: - + There are folders that were not synchronized because they are too big or external storages: มีบางโฟลเดอร์ที่ไม่ถูกซิงโครไนซ์เพราะมีขนาดใหญ่เกินไป หรือเป็นพื้นที่จัดเก็บข้อมูลภายนอก: - + Confirm Account Removal ยืนยันการนำบัญชีออก - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>คุณต้องการลบการเชื่อมต่อกับบัญชี <i>%1</i> หรือไม่?</p><p><b>หมายเหตุ:</b> การกระทำนี้จะ<b>ไม่</b>ลบไฟล์ใด ๆ</p> - + Remove connection ลบการเชื่อมต่อ - - + This account supports end-to-end encryption บัญชีนี้รองรับการเข้ารหัสลับแบบต้นทางถึงปลายทาง - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -793,7 +840,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. @@ -803,12 +850,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. @@ -859,32 +906,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. - + Continuing will mean <b>ignoring these settings</b>. - + 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>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit ออก - + Continue ดำเนินการต่อ - + Error accessing the configuration file เกิดข้อผิดพลาดในการเข้าถึงไฟล์กำหนดค่า @@ -894,12 +968,12 @@ This action will abort any currently running synchronization. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 ออกจาก %1 @@ -945,56 +1019,216 @@ This action will abort any currently running synchronization. - + File Removed (start upload) %1 - + File %1 has invalid modification time. Do not upload to the server. - + Local file changed during syncing. It will be resumed. ไฟล์ต้นทางมีการเปลี่ยนแปลงขณะซิงค์ กำลังดำเนินการต่อ - - + + Local file changed during sync. ไฟล์ต้นทางมีการเปลี่ยนแปลงขณะซิงค์ - + Network error: %1 - + Error updating metadata: %1 - + The file %1 is currently in use - + The local file was removed during sync. - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล @@ -1012,12 +1246,12 @@ This action will abort any currently running synchronization. - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase @@ -1193,8 +1427,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! @@ -1202,27 +1436,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 - + Directory not accessible on client, permission denied - + Directory not found: %1 ไม่พบไดเรกทอรี: %1 - + Filename encoding is not valid - + Error while reading directory %1 @@ -1230,83 +1464,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1314,7 +1548,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. @@ -1443,145 +1677,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. โฟลเดอร์ในเครื่อง %1 ไม่มีอยู่ - + %1 should be a folder but is not. %1 ควรเป็นโฟลเดอร์ แต่ไม่ใช่ - + %1 is not readable. %1 อ่านไม่ได้ - + %1 and %n other file(s) have been removed. %1 และ %n ไฟล์อื่น ๆ ถูกลบออกแล้ว - + %1 has been removed. %1 names a file. %1 ถูกลบออกแล้ว - + %1 and %n other file(s) have been added. - + %1 has been added. %1 names a file. - + %1 and %n other file(s) have been updated. %1 และ %n ไฟล์อื่น ๆ ถูกอัปเดตแล้ว - + %1 has been updated. %1 names a file. %1 ถูกอัปเดตแล้ว - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 ถูกเปลี่ยนชื่อเป็น %2 และอีก %n ไฟล์อื่น ๆ ถูกเปลี่ยนชื่อแล้ว - + %1 has been renamed to %2. %1 and %2 name files. %1 ถูกเปลี่ยนชื่อเป็น %2 แล้ว - + %1 has been moved to %2 and %n other file(s) have been moved. %1 ถูกย้ายไปยัง %2 และอีก %n ไฟล์ถูกย้ายแล้ว - + %1 has been moved to %2. %1 ถูกย้ายไปยัง %2 แล้ว - + %1 has and %n other file(s) have sync conflicts. %1 และอีก %n ไฟล์ เกิดข้อขัดแย้งการซิงค์ - + %1 has a sync conflict. Please check the conflict file! %1 มีข้อขัดแย้งขณะซิงค์ กรุณาตรวจสอบไฟล์ที่มีปัญหา! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. ไม่สามารถซิงค์ %1 และอีก %n ไฟล์ เนื่องจากเกิดข้อผิดพลาด กรุณาดูบันทึกสำหรับรายละเอียดเพิ่มเติม - + %1 could not be synced due to an error. See the log for details. ไม่สามารถซิงค์ %1 เนื่องจากเกิดข้อผิดพลาด กรุณาดูบันทึกสำหรับรายละเอียดเพิ่มเติม - + %1 and %n other file(s) are currently locked. - + %1 is currently locked. - + Sync Activity กิจกรรมซิงค์ - + Could not read system exclude file ไม่สามารถอ่านไฟล์ยกเว้นของระบบ - + A new folder larger than %1 MB has been added: %2. เพิ่มโฟลเดอร์ใหม่ที่มีขนาดใหญ่กว่า %1 MB แล้ว: %2 - + A folder from an external storage has been added. เพิ่มโฟลเดอร์จากพื้นที่จัดเก็บข้อมูลภายนอกแล้ว - + Please go in the settings to select it if you wish to download it. กรุณาเข้าไปในการตั้งค่าเพื่อเลือก ถ้าคุณต้องการดาวน์โหลด - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. - + 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). @@ -1590,7 +1824,7 @@ This means that the synchronization client might not upload local changes immedi - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1598,26 +1832,26 @@ If you decide to delete the files, they will be unavailable to you, unless you a - + 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. - + Remove All Files? ลบไฟล์ทั้งหมดหรือไม่? - + Remove all files ลบไฟล์ทั้งหมด - + Keep files - เก็บไฟล์เอาไว้ + เก็บไฟล์ไว้ @@ -1651,22 +1885,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state ไม่สามารถรีเซ็ตสถานะโฟลเดอร์ - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. - + (backup) (สำรองข้อมูล) - + (backup %1) (สำรองข้อมูล %1) @@ -1676,34 +1910,34 @@ If this was an accident and you decide to keep your files, they will be re-synce สถานะที่ไม่ได้กำหนด - + Undefined state. - + Waiting to start syncing. กำลังรอเริ่มต้นการซิงค์ - + Preparing for sync. กำลังเตรียมการซิงค์ - + Sync is running. การซิงค์กำลังทำงาน - + Sync finished with unresolved conflicts. Last Sync was successful. - ซิงค์ครั้งล่าสุดเสร็จเรียบร้อยแล้ว + การซิงค์ครั้งล่าสุดสำเร็จ @@ -1716,64 +1950,64 @@ If this was an accident and you decide to keep your files, they will be re-synce ยกเลิกโดยผู้ใช้ - + Last sync was successful. - + Setup error. - + Sync request was cancelled. - + Sync is paused. การซิงค์ถูกหยุดไว้ชั่วคราว - + %1 (Sync is paused) %1 (การซิงค์ถูกหยุดชั่วคราว) - + No valid folder selected! เลือกโฟลเดอร์ไม่ถูกต้อง! - + The selected path does not exist! - + The selected path is not a folder! เส้นทางที่เลือกไม่ใช่โฟลเดอร์! - + You have no permission to write to the selected folder! - คุณมีสิทธิ์ที่จะเขียนโฟลเดอร์ที่เลือกนี้! + คุณไม่มีสิทธิ์ที่จะเขียนไปยังโฟลเดอร์ที่เลือก! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! - เนื้อหาโฟลเดอร์ต้นทาง %1 ได้ถูกใช้ไปแล้วในโฟลเดอร์ที่ซิงค์ กรุณาเลือกอีกอันหนึ่ง! + โฟลเดอร์ต้นทาง %1 มีโฟลเดอร์ที่ใช้ในการเชื่อมต่อโฟลเดอร์ซิงค์อยู่แล้ว กรุณาเลือกโฟลเดอร์อื่น! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! - เนื้อหาของโฟลเดอร์ต้นทาง %1 ไดถูกใช้ไปแล้วในโฟลเดอร์ที่ซิงค์ กรุณาเลือกอีกอันหนึ่ง! + โฟลเดอร์ต้นทาง %1 มีอยู่ในโฟลเดอร์ที่ถูกใช้ในการเชื่อมต่อโฟลเดอร์ซิงค์อยู่แล้ว กรุณาเลือกโฟลเดอร์อื่น! - + There is already a sync from the server to this local folder. Please pick another local folder! - โฟลเดอร์ต้นทางนี้ได้ถูกซิงค์กับเซิร์ฟเวอร์แล้ว โปรดเลือกโฟลเดอร์ต้นทางอื่นๆ! + มีการซิงค์จากเซิร์ฟเวอร์มายังโฟลเดอร์ต้นทางนี้แล้ว กรุณาเลือกโฟลเดอร์ต้นทางอื่น! @@ -1781,10 +2015,10 @@ If this was an accident and you decide to keep your files, they will be re-synce Add Folder Sync Connection - เพิ่มโฟลเดอร์ที่ต้องการซิงค์ + เพิ่มการเชื่อมต่อโฟลเดอร์ซิงค์ - + File ไฟล์ @@ -1792,152 +2026,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder คุณต้องเชื่อมต่อก่อนที่จะเพิ่มโฟลเดอร์ - + Click this button to add a folder to synchronize. คลิกที่ปุ่มนี้เพื่อเพิ่มโฟลเดอร์ที่ต้องการซิงค์ - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. - ข้อผิดพลาดขณะโหลดรายชื่อโฟลเดอร์จากเซิร์ฟเวอร์ + เกิดข้อผิดพลาดขณะโหลดรายชื่อโฟลเดอร์จากเซิร์ฟเวอร์ - + Fetching folder list from server … กำลังดึงรายการโฟลเดอร์จากเซิร์ฟเวอร์ … - + There are unresolved conflicts. Click for details. - มีข้อขัดแย้งที่ยังไม่ได้รับการแก้ไข คลิกเพื่อดูรายละเอียด + มีข้อขัดแย้งที่ยังไม่ได้แก้ไข คลิกเพื่อดูรายละเอียด - + Virtual file support is enabled. - + Signed out ออกจากระบบแล้ว - + Synchronizing VirtualFiles with local folder - + Synchronizing with local folder - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Reconciling changes กำลังคืนค่าการเปลี่ยนแปลง - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" กำลังซิงค์ %1 - - + + , - หรือ + , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) ดาวน์โหลด %1/วิ - + ↓ %1/s ↓ %1/วิ - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) อัปโหลด %1/วิ - + ↑ %1/s ↑ %1/วิ - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 จาก %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 เหลืออีก %5, %1 จาก %2, ไฟล์ที่ %3 จาก %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 จาก %2, ไฟล์ที่ %3 จาก %4 - + file %1 of %2 ไฟล์ที่ %1 จาก %2 - + Waiting … กำลังรอ … - + Waiting for %n other folder(s) … - กำลังรออีก %n โฟลเดอร์อื่น … + กำลังรอสำหรับ %n โฟลเดอร์อื่น … - + Preparing to sync … @@ -1963,12 +2201,12 @@ If this was an accident and you decide to keep your files, they will be re-synce Add Folder Sync Connection - เพิ่มโฟลเดอร์ที่ต้องการซิงค์ + เพิ่มการเชื่อมต่อโฟลเดอร์ซิงค์ Add Sync Connection - เพิ่มการซิงค์ให้ตรงกัน + เพิ่มการเชื่อมต่อการซิงค์ @@ -1976,7 +2214,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Click to select a local folder to sync. - คลิกเพื่อเลือกโฟลเดอร์ในการซิงค์ + คลิกเพื่อเลือกโฟลเดอร์ต้นทางที่จะซิงค์ @@ -1999,12 +2237,12 @@ If this was an accident and you decide to keep your files, they will be re-synce Enter the name of the new folder to be created below "%1": - ใส่ชื่อของโฟลเดอร์ใหม่ที่จะถูกสร้างขึ้นภายใต้ '%1': + ใส่ชื่อของโฟลเดอร์ใหม่ที่จะถูกสร้างขึ้นภายใต้ "%1": Folder was successfully created on %1. - โฟลเดอร์ถูกสร้างขึ้นเรียบร้อยเมื่อ %1 + สร้างโฟลเดอร์บน %1 เรียบร้อย @@ -2014,7 +2252,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Failed to create the folder on %1. Please check manually. - ไม่สามารถสร้างโฟลเดอร์บน %1 กรุณาตรวจสอบด้วยตนเอง + ไม่สามารถสร้างโฟลเดอร์บน %1 กรุณาตรวจสอบด้วยตัวเอง @@ -2168,13 +2406,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable - + beta @@ -2196,7 +2434,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Ask for confirmation before synchronizing folders larger than - ถามก่อนที่จะซิงค์กับโฟลเดอร์ที่มีขนาดใหญ่กว่า + ถามก่อนที่จะซิงค์โฟลเดอร์ที่มีขนาดใหญ่กว่า @@ -2217,7 +2455,7 @@ If this was an accident and you decide to keep your files, they will be re-synce S&how crash reporter - แ&สดงรายงานความผิดพลาด + แ&สดงตัวรายงานข้อผิดพลาด @@ -2226,59 +2464,59 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive - + Server notifications that require attention. - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. - + Change update channel? - + 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. 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. - + Change update channel - + Cancel ยกเลิก - + Zip Archives - + Debug Archive Created - + Debug archive is created at %1 @@ -2286,22 +2524,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required - + Please enter a password for your link share: กรุณาใส่รหัสผ่านสำหรับลิงก์แชร์ของคุณ: - + Sharing error ข้อผิดพลาดการแชร์ - + Could not retrieve or create the public link share. Error: %1 @@ -2348,17 +2586,17 @@ Note that this selects only what pool upgrades are taken from, and that there ar Global Ignore Settings - รายละเอียดการตั้งค่าทั่วไป + การตั้งค่าการละเว้นทั้งหมด Sync hidden files - ซิงค์ไฟล์ที่ถูกซ่อนอยู่ + ซิงค์ไฟล์ที่ซ่อนอยู่ Files Ignored by Patterns - ข้ามไฟล์โดยรูปแบบ + รูปแบบไฟล์ที่ละเว้น @@ -2537,6 +2775,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2553,7 +2796,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from Log Output - ผลลัพธ์ของไฟล์ log + ผลลัพธ์ของไฟล์บันทึก @@ -2676,7 +2919,7 @@ Note that using any logging command line options will override this setting. Proxy server requires authentication - ต้องตรวจสอบพร็อกซีเซิร์ฟเวอร์ + พร็อกซีเซิร์ฟเวอร์ต้องยืนยันตัวตน @@ -2686,13 +2929,13 @@ Note that using any logging command line options will override this setting. Download Bandwidth - ดาวน์โหลดแบนด์วิดธ์ + แบนด์วิดท์ดาวน์โหลด Limit to - จำกัดถึง + จำกัดที่ @@ -2721,22 +2964,22 @@ Note that using any logging command line options will override this setting. Upload Bandwidth - อัพโหลดแบนด์วิดธ์ + แบนด์วิดท์อัปโหลด Hostname of proxy server - ชื่อโฮสต์ของเซิร์ฟเวอร์พร็อกซี่ + ชื่อโฮสต์ของพร็อกซีเซิร์ฟเวอร์ Username for proxy server - ชื่อผู้ใช้ของเซิร์ฟเวอร์พร็อกซี่ + ชื่อผู้ใช้ของพร็อกซีเซิร์ฟเวอร์ Password for proxy server - รหัสผ่านของเซิร์ฟเวอร์พร็อกซี่ + รหัสผ่านของพร็อกซีเซิร์ฟเวอร์ @@ -2847,12 +3090,12 @@ Note that using any logging command line options will override this setting. Update status is unknown: Did not check for new updates. - สถานะการอัพเดทที่ไม่รู้จัก: จะไม่มีการตรวจสอบการอัพเดทใหม่ + สถานะการอัปเดตไม่รู้จัก: ไม่ได้ตรวจสอบการอัปเดตใหม่ No updates available. Your installation is at the latest version. - ไม่พบการอัพเดท ตัวที่ติดตั้งเป็นเวอร์ชั่นล่าสุด + ไม่พบการอัปเดต การติดตั้งของคุณเป็นรุ่นล่าสุด @@ -2869,60 +3112,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 - + (experimental) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. - + %1 folder "%2" is synced to local folder "%3" - + Sync the folder "%1" - + Warning: The local folder is not empty. Pick a resolution! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB - + Virtual files are not available for the selected folder - + Local Sync Folder โฟลเดอร์ซิงค์ต้นทาง - - + + (%1) (%1) - + There isn't enough free space in the local folder! @@ -2988,13 +3231,14 @@ Note that using any logging command line options will override this setting. Login in your browser - เข้าสู่ระบบในเบราเซอร์ของคุณ + เข้าสู่ระบบในเบราว์เซอร์ของคุณ OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 @@ -3010,7 +3254,7 @@ Note that using any logging command line options will override this setting. &Next > - &ถัดไป > + ถั&ดไป > @@ -3026,146 +3270,146 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">เชื่อมต่อกับ %1: %2 รุ่น %3 (%4) เสร็จเรียบร้อยแล้ว</font><br/><br/> - + Invalid URL URL ไม่ถูกต้อง - + Failed to connect to %1 at %2:<br/>%3 ไม่สามารถเชื่อมต่อไปยัง %1 ที่ %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. - หมดเวลาขณะที่พยายามเชื่อมต่อไปยัง %1 ที่ %2 + หมดเวลาขณะพยายามเชื่อมต่อไปยัง %1 ที่ %2 - + Trying to connect to %1 at %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. การเข้าถึงถูกระงับโดยเซิร์ฟเวอร์ เพื่อตรวจสอบว่าคุณมีการเข้าถึงที่เหมาะสม <a href="%1">คลิกที่นี่</a>เพื่อเข้าถึงบริการกับเบราว์เซอร์ของคุณ - + There was an invalid response to an authenticated WebDAV request - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> - ซิงค์โฟลเดอร์ต้นทาง %1 มีอยู่แล้ว กรุณาตั้งค่าเพื่อถ่ายข้อมูล <br/<br/> + โฟลเดอร์ซิงค์ต้นทาง %1 มีอยู่แล้ว กำลังตั้งค่าเพื่อซิงค์ <br/><br/> - + Creating local sync folder %1 … - + OK - + failed. ล้มเหลว - + Could not create local folder %1 - ไม่สามารถสร้างผสานข้อมูลโฟลเดอร์ต้นทาง %1... + ไม่สามารถสร้างโฟลเดอร์ต้นทาง %1 - + No remote folder specified! ไม่มีโฟลเดอร์รีโมทที่ระบุ! - + Error: %1 ข้อผิดพลาด: %1 - + creating folder on Nextcloud: %1 - + Remote folder %1 created successfully. โฟลเดอร์รีโมท %1 ถูกสร้างเรียบร้อยแล้ว - + The remote folder %1 already exists. Connecting it for syncing. โฟลเดอร์ปลายทาง %1 มีอยู่แล้ว กำลังเชื่อมต่อเพื่อซิงค์ข้อมูล - - + + The folder creation resulted in HTTP error code %1 การสร้างโฟลเดอร์ดังกล่าวทำให้เกิดรหัสข้อผิดพลาด HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> - สร้างโฟลเดอร์ระยะไกลล้มเหลวเนื่องจากมีข้อมูลผิดพลาด! + สร้างโฟลเดอร์ระยะไกลล้มเหลว เนื่องจากข้อมูลประจำตัวที่ระบุไว้ไม่ถูกต้อง!<br/>กรุณาย้อนกลับไปตรวจสอบข้อมูลประจำตัวของคุณ</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">การสร้างโฟลเดอร์ปลายทางล้มเหลว ซึ่งอาจมีสาเหตุมาจากการกรอกข้อมูลส่วนตัวไม่ถูกต้อง</font><br/>กรุณาย้อนกลับและตรวจสอบข้อมูลส่วนตัวของคุณอีกครั้ง</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. การสร้างโฟลเดอร์ปลายทาง %1 ล้มเหลวเนื่องจากข้อผิดพลาด <tt>%2</tt> - + A sync connection from %1 to remote directory %2 was set up. - การเชื่อมต่อเผื่อซิงค์จาก %1 ไปที่ไดเร็กทอรี่ระยะไกล %2 ได้ถูกติดตั้งแล้ว + การเชื่อมต่อการซิงค์จาก %1 ไปยังไดเร็กทอรีระยะไกล %2 ได้ถูกติดตั้งแล้ว - + Successfully connected to %1! เชื่อมต่อไปที่ %1 สำเร็จ - + Connection to %1 could not be established. Please check again. การเชื่อมต่อกับ %1 ไม่สามารถดำเนินการได้ กรุณาตรวจสอบอีกครั้ง - + Folder rename failed เปลี่ยนชื่อโฟลเดอร์ล้มเหลว - + Cannot 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. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> - <font color="green"><b>ซิงค์โฟลเดอร์ต้นทาง %1 ได้ถูกสร้างขึ้นเรียบร้อยแล้ว!</b></font> + <font color="green"><b>สร้างโฟลเดอร์ซิงค์ต้นทาง %1 เรียบร้อยแล้ว!</b></font> @@ -3186,12 +3430,12 @@ Note that using any logging command line options will override this setting. - + Enable experimental feature? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3202,12 +3446,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Enable experimental placeholder mode - + Stay safe @@ -3236,162 +3480,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. - + File is listed on the ignore list. - + File names ending with a period are not supported on this file system. - + File names containing the character "%1" are not supported on this file system. - + File name contains at least one invalid character - + The file name is a reserved name on this file system. - + Filename contains trailing spaces. - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. - + File/Folder is ignored because it's hidden. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. - + The filename is blacklisted on the server. - + File has extension reserved for virtual files. - + size - + permission - + file id - + Server reported no %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! - + Conflict when uploading a file. It's going to get removed! - + Ignored because of the "choose what to sync" blacklist - + Not allowed because you don't have permission to add subfolders to that folder - + Not allowed because you don't have permission to add files in that folder - + Not allowed to upload this file because it is read-only on the server, restoring - + Moved to invalid target, restoring - + Not allowed to remove, restoring - + Error while reading the database - + Server replied with an error while reading directory "%1" : %2 @@ -3399,22 +3648,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time - + Error updating metadata: %1 - + File is currently in use @@ -3427,19 +3676,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. - - + + File has changed since discovery ไฟล์มีการเปลี่ยนแปลงตั้งแต่ถูกพบ - + Could not delete file record %1 from local DB @@ -3450,53 +3699,58 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 can not be downloaded because of a local file name clash! - ไฟล์ %1 ไม่สามารถดาวน์โหลดได้เพราะชื่อไฟล์ต้นทางเหมือนกัน! + ไม่สามารถดาวน์โหลดไฟล์ %1 เพราะชื่อไฟล์ต้นทางเหมือนกัน! - + The download would reduce free local disk space below the limit - การดาวน์โหลดจะช่วยลดพืนที่จัดเก็บภายในเครื่องที่ต่ำกว่าขีดจำกัด + การดาวน์โหลดจะลดพื้นที่จัดเก็บที่ว่างอยู่ในเครื่องลงต่ำกว่าขีดจำกัด - + Free space on disk is less than %1 พื้นที่ว่างในดิสก์น้อยกว่า %1 - + File was deleted from server ไฟล์ถูกลบออกจากเซิร์ฟเวอร์ - + The file could not be downloaded completely. - ดาวน์โหลดไฟล์ไม่สำเร็จ + ไม่สามารถดาวน์โหลดไฟล์ได้ครบถ้วน - + The downloaded file is empty, but the server said it should have been %1. File %1 cannot be saved because of a local file name clash! - ไฟล์ %1 ไม่สามารถบันทึกได้เพราะชื่อไฟล์ต้นทางเหมือนกัน! + ไม่สามารถบันทึกไฟล์ %1 เพราะชื่อไฟล์ต้นทางเหมือนกัน! - - + + File %1 has invalid modified time reported by server. Do not save it. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 - + The file %1 is currently in use @@ -3506,38 +3760,43 @@ This is a new, experimental mode. If you decide to use it, please report any iss ; Restoration Failed: %1 - ; ฟื้นฟูล้มเหลว: %1 + ; กู้คืนล้มเหลว: %1 A file or folder was removed from a read only share, but restoring failed: %1 - ไฟล์หรือโฟลเดอร์ที่ถูกลบออกจากส่วนการอ่านเพียงอย่างเดียว แต่ล้มเหลวในการฟื้นฟู: %1 + มีไฟล์หรือโฟลเดอร์ถูกลบออกจากการแชร์แบบอ่านเท่านั้นแล้ว แต่การกู้คืนล้มเหลว: %1 OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 ไม่สามารถลบไฟล์ %1, ข้อผิดพลาด: %2 Attention, possible case sensitivity clash with %1 - คำเตือน เคสที่เป็นไปไม่ได้มีผลกับ %1 + คำเตือน เป็นไปได้ว่ามีตัวพิมพ์เล็กใหญ่เหมือนกับ %1 + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 - + Error updating metadata: %1 - + The file %1 is currently in use @@ -3545,9 +3804,9 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash - ไม่สามารถลบ %1 เพราะชื่อไฟล์ต้นทางเหมือนกัน! + ไม่สามารถลบ %1 เพราะชื่อไฟล์ต้นทางเหมือนกัน @@ -3558,46 +3817,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state - - + + Error updating metadata: %1 - + The file %1 is currently in use - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file @@ -3607,7 +3871,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Wrong HTTP code returned by server. Expected 204, but received "%1 %2". - รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 204 แต่กลับได้รับ "%1 %2" + รหัส HTTP ที่ส่งคืนจากเซิร์ฟเวอร์ไม่ถูกต้อง คาดว่าจะได้รับรหัส 204 แต่ได้รับ "%1 %2" @@ -3618,7 +3882,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". @@ -3628,15 +3892,15 @@ This is a new, experimental mode. If you decide to use it, please report any iss Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 201 แต่กลับได้รับ "%1 %2" + รหัส HTTP ที่ส่งคืนจากเซิร์ฟเวอร์ไม่ถูกต้อง คาดว่าจะได้รับรหัส 201 แต่ได้รับ "%1 %2" - + Error writing metadata to the database: %1 - + The file %1 is currently in use @@ -3644,42 +3908,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". - รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 201 แต่กลับได้รับ "%1 %2" + รหัส HTTP ที่ส่งคืนจากเซิร์ฟเวอร์ไม่ถูกต้อง คาดว่าจะได้รับรหัส 201 แต่ได้รับ "%1 %2" - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 - + The file %1 is currently in use - + Error setting pin state - + Error writing metadata to the database ข้อผิดพลาดในการเขียนข้อมูลเมตาไปยังฐานข้อมูล @@ -3694,13 +3958,13 @@ This is a new, experimental mode. If you decide to use it, please report any iss File %1 cannot be uploaded because another file with the same name, differing only in case, exists - ไม่สามารถอัพโหลดไฟล์ %1 เนื่องจากมีไฟล์อื่นที่มีชื่อเดียวกันอยู่แล้ว + ไม่สามารถอัปโหลดไฟล์ %1 เนื่องจากมีไฟล์อื่นที่มีชื่อเดียวกันอยู่ แต่ต่างกันเพียงตัวพิมพ์ใหญ่เล็ก Upload of %1 exceeds the quota for the folder - การอัพโหลด %1 เกินโควต้าของโฟลเดอร์ + การอัปโหลด %1 เกินโควต้าของโฟลเดอร์ @@ -3717,12 +3981,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Local file changed during syncing. It will be resumed. - ไฟล์ต้นทางถูกเปลี่ยนแปลงในระหว่างการซิงค์ มันจะกลับมา + ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะซิงค์ การซิงค์จะกลับมาต่อ Local file changed during sync. - ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะกำลังซิงค์ + ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะซิงค์ @@ -3750,7 +4014,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Local file changed during sync. - ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะกำลังซิงค์ + ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะซิงค์ @@ -3760,7 +4024,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Unexpected return code from server (%1) - มีรหัสข้อผิดพลาดตอบกลับมาจากเซิร์ฟเวอร์ (%1) + มีรหัสส่งคืนที่ไม่คาดคิดตอบกลับมาจากเซิร์ฟเวอร์ (%1) @@ -3770,7 +4034,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Missing ETag from server - ETag ได้หายไปจากเซิร์ฟเวอร์ + ETag จากเซิร์ฟเวอร์ขาดไป @@ -3778,7 +4042,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Poll URL missing - ไม่มี Poll URL + Poll URL ขาดไป @@ -3788,7 +4052,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Local file changed during sync. - ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะกำลังซิงค์ + ไฟล์ต้นทางถูกเปลี่ยนแปลงขณะซิงค์ @@ -3801,12 +4065,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Proxy authentication required - การตรวจสอบพร็อกซีที่จำเป็น + จำเป็นต้องตรวจสอบความถูกต้องพร็อกซี Username: - ชื่อผู้ใช้งาน + ชื่อผู้ใช้: @@ -3858,7 +4122,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss No subfolders currently on the server. - ไม่มีโฟลเดอร์ย่อยอยู่บนเซิร์ฟเวอร์ + ไม่มีโฟลเดอร์ย่อยที่อยู่บนเซิร์ฟเวอร์ @@ -3869,14 +4133,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Dismiss - ยกเลิก + ปิดทิ้ง @@ -3884,26 +4148,26 @@ This is a new, experimental mode. If you decide to use it, please report any iss Settings - ตั้งค่า + การตั้งค่า - + %1 Settings This name refers to the application name e.g Nextcloud - + General ทั่วไป - + Network เครือข่าย - + Account บัญชี @@ -3911,17 +4175,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -3997,7 +4266,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) @@ -4006,132 +4275,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share - + Select new location … - + I shared something with you ฉันได้แชร์ไฟล์ให้คุณ - - + + Share options - - + + Activity - + Copy private link to clipboard คัดลอกลิงก์ส่วนตัวไปยังคลิปบอร์ด - + Send private link by email … + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed - + Resharing this folder is not allowed - - + + Copy public link - + Copy internal link - + + Encrypt + + + + Lock file - + Unlock file - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit - + Open in browser - + Resolve conflict … - + Move and rename … - + Move, rename and upload … - + Delete local changes - + Move and upload … - + Delete ลบ @@ -4176,7 +4482,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Serial: - ซีเรียล: + หมายเลขลำดับ: @@ -4232,7 +4538,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss This connection is encrypted using %1 bit %2. - การเชื่อมต่อนี้ถูกเข้ารหัสโดยใช้ %1 บิต %2 + การเชื่อมต่อนี้ถูกเข้ารหัสโดยใช้ %2 %1 บิต + @@ -4293,7 +4600,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss &lt;not specified&gt; - &lt;ยังไม่ได้ถูกระบุ&gt; + &lt;ไม่ได้ระบุ&gt; @@ -4347,63 +4654,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (ข้ามไปเนื่องจากข้อผิดพลาดก่อนหน้านี้ กำลังลองอีกครั้งใน %2) - + Could not update file: %1 - + Could not update virtual file metadata: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. ข้อขัดแย้งที่ยังไม่ได้แก้ไข - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() มีเพียง %1 ต้องมีอย่างน้อย %2 เพื่อเริ่มต้น - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. ไม่สามารถเปิดหรือสร้างฐานข้อมูลการซิงค์ในเครื่อง ตรวจสอบว่าคุณมีสิทธิ์การเขียนในโฟลเดอร์ซิงค์ - + Using virtual files with suffix, but suffix is not set - + Unable to read the blacklist from the local database ไม่สามารถอ่านบัญชีดำจากฐานข้อมูลต้นทาง - + Unable to read from the sync journal. ไม่สามารถอ่านจากบันทึกการซิงค์ - + Cannot open the sync journal ไม่สามารถเปิดบันทึกการซิงค์ @@ -4413,12 +4720,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Disk space is low: Downloads that would reduce free space below %1 were skipped. พื้นที่จัดเก็บเหลือน้อย: การดาวน์โหลดที่จะลดพื้นที่ว่างลงต่ำกว่า %1 ถูกข้ามไป - + There is insufficient space available on the server for some uploads. มีพื้นที่ว่างบนเซิร์ฟเวอร์ไม่เพียงพอสำหรับการอัปโหลดบางรายการ @@ -4487,59 +4794,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download - + Add account เพิ่มบัญชี - + Open main dialog - - + + Pause sync - - + + Resume sync - + Settings - ตั้งค่า + การตั้งค่า - + Help - + Exit %1 - + Pause sync for all - + Resume sync for all - + %1: %2 %1: %2 @@ -4547,24 +4854,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> - + <p>This release was supplied by %1</p> @@ -4572,22 +4879,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. - + Failed to fetch search providers for '%1'. Error: %2 - + Search has failed for '%2'. - + Search has failed for '%1'. Error: %2 @@ -4595,30 +4902,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> - + Remove connection - + Cancel @@ -4756,8 +5069,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time @@ -4765,8 +5078,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time @@ -4864,123 +5177,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version รุ่นของเซิร์ฟเวอร์ที่ไม่รองรับ - + 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. - + Disconnected ยกเลิกการเชื่อมต่อแล้ว - + Disconnected from some accounts ยกเลิกการเชื่อมต่อจากบางบัญชีแล้ว - + Disconnected from %1 ยกเลิกการเชื่อมต่อจาก %1 แล้ว - + Disconnected from accounts: ยกเลิกการเชื่อมต่อจากบัญชี: - + Account %1: %2 บัญชี %1: %2 - + Please sign in กรุณาเข้าสู่ระบบ - + Signed out ออกจากระบบแล้ว - + Account synchronization is disabled การซิงค์บัญชีถูกปิดใช้งาน - - + + Synchronization is paused หยุดการซิงค์ชั่วคราว - + Folder %1: %2 โฟลเดอร์ %1: %2 - + Unresolved conflicts - + Up to date ล่าสุดแล้ว - + Error during synchronization - เกิดข้อผิดพลาดขณะทำการซิงค์ + เกิดข้อผิดพลาดขณะซิงโครไนซ์ - + There are no sync folders configured. ไม่มีการกำหนดค่าโฟลเดอร์ซิงค์ - + No sync folders configured ไม่ได้กำหนดค่าโฟลเดอร์ที่จะซิงค์ - + Checking for changes in remote "%1" - + Checking for changes in local "%1" - + Syncing %1 of %2 (%3 left) - + Syncing %1 of %2 กำลังซิงค์ %1 จาก %2 - + Syncing %1 (%2 left) กำลังซิงค์ %1 (เหลือ %2) - + Syncing %1 กำลังซิงค์ %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5046,7 +5359,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Choose what to sync - เลือกข้อมูลที่ต้องการประสาน + เลือกสิ่งที่จะซิงค์ @@ -5132,27 +5445,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + You renamed %1 - + You deleted %1 - + You created %1 - + You changed %1 - + Synced %1 @@ -5189,7 +5502,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Less than a minute ago - ไม่กี่นาทีที่ผ่านมา + ไม่ถึงนาทีที่ผ่านมา @@ -5218,30 +5531,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5257,7 +5646,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. @@ -5315,6 +5704,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5378,67 +5783,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status - + Online - + Away - + Do not disturb - + Mute all notifications - + Invisible - + Appear offline - + Status message - + What is your status? - + Clear status message after - + Cancel - + Clear status message - + Set status message @@ -5448,17 +5853,17 @@ This is a new, experimental mode. If you decide to use it, please report any iss %L1 GB - %L1 กิกะไบต์ + %L1 GB %L1 MB - %L1 เมกะไบต์ + %L1 MB %L1 KB - %L1 กิโลไบต์ + %L1 KB @@ -5522,24 +5927,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog - + Current account - - + + Resume sync for all - - + + Pause sync for all @@ -5549,22 +5954,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + Add account เพิ่มบัญชี - + Add new account - + Settings การตั้งค่า - + Exit @@ -5573,11 +5978,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar - - - Current account avatar - - Current user status is online @@ -5589,70 +5989,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + + Current account avatar + + + + Current account status is online - + Current account status is do not disturb - + + %1 - File activity + + + + Account switcher and settings menu - + Open local folder of current account - + Connected เชื่อมต่อแล้ว - + Disconnected ยกเลิกการเชื่อมต่อแล้ว - + Open Nextcloud Talk in browser - + More apps - + Open %1 in browser เปิด %1 ในเบราว์เซอร์ - + Unified search results list - - - %1 - File activity - - main.cpp - + System Tray not available ถาดระบบไม่สามารถใช้ได้ - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. @@ -5660,7 +6065,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> @@ -5694,72 +6099,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted ลบแล้ว - + Moved to %1 ถูกย้ายไปยัง %1 - + Ignored ถูกละเว้น - + Filesystem access error ข้อผิดพลาดในการเข้าถึงระบบไฟล์ - + Error ข้อผิดพลาด - + Updated local metadata อัปเดตเมตาดาต้าต้นทางแล้ว - + Unknown ไม่ทราบ - + downloading กำลังดาวน์โหลด - + uploading กำลังอัปโหลด - + deleting กำลังลบ - + moving กำลังย้าย - + ignoring กำลังละเว้น - + error ข้อผิดพลาด - + updating local metadata กำลังอัปเดตเมตาดาต้าต้นทาง @@ -5774,7 +6184,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Waiting to start sync - กำลังรอการเริ่มต้นซิงค์ + กำลังรอเริ่มต้นการซิงค์ @@ -5784,7 +6194,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Sync Success - การซิงค์เสร็จสิ้น + การซิงค์สำเร็จ @@ -5799,7 +6209,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Setup Error - เกิดข้อผิดพลาดในการตั้งค่า + ตั้งค่าผิดพลาด @@ -6016,7 +6426,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Set expiration date - กำหนดวันที่หมดอายุ + กำหนดวันหมดอายุ diff --git a/translations/client_tr.ts b/translations/client_tr.ts index 206c54d1d..202894e93 100644 --- a/translations/client_tr.ts +++ b/translations/client_tr.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally %1 ögesini yerel olarak aç - + In %1 %1 içinde @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Diğer işlemleri görüntüle @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Yok say + + + Open file details + Dosya bilgilerini aç + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list İşlem listesi @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Durum iletisini kaldırma menüsü @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + Yok say + + + Activity İşlem - + Sharing Paylaşım @@ -226,12 +236,12 @@ Bu platform üzerinde çöpe taşıma özelliği yok - + Error removing "%1": %2 "%1" silinirken sorun çıktı: %2 - + Could not remove folder "%1" "%1" klasörü silinemedi @@ -321,7 +331,7 @@ Sunucudan alınan HTTP kodu yanlış. 204 bekleniyordu, ancak "%1 %2" alındı. - + "%1 Failed to unlock encrypted folder %2". "%1, %2 şifreli klasörünün kilidini açamadı". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. %1 dosyası zaten %2 tarafından kilitlenmiş. - + Lock operation on %1 failed with error %2 %1 kilitleme işlemi %2 hatası nedeniyle yapılamadı - + Unlock operation on %1 failed with error %2 %1 kilit açma işlemi %2 hatası nedeniyle yapılamadı @@ -353,9 +363,9 @@ - - - + + + Cancel İptal @@ -400,12 +410,12 @@ Görünüşe göre bu klasör için sanal dosyalar özelliğini etkinleştirmişsiniz. Şu anda uçtan uca şifrelenmiş sanal dosyaların örtülü olarak indirilmesi desteklenmiyor. Sanal dosyalar ve uçtan uca şifreleme ile en iyi deneyimi elde etmek için, şifrelenmiş klasörün "Her zaman yerel olarak kullanılabilsin" olarak işaretlendiğinden emin olun. - + End-to-end Encryption with Virtual Files Sanal dosyalar ile uçtan uca şifreleme - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". Görünüşe göre bu klasör için sanal dosyalar özelliğini etkinleştirmişsiniz. Şu anda uçtan uca şifrelenmiş sanal dosyaların örtülü olarak indirilmesi desteklenmiyor. Sanal dosyalar ve uçtan uca şifreleme ile en iyi deneyimi elde etmek için, şifrelenmiş klasörün "Her zaman yerel olarak kullanılabilsin" olarak işaretlendiğinden emin olun. @@ -415,29 +425,29 @@ Klasör şifrelenmesin - + Do not encrypt folder Klasör şifrelenmesin - + Encrypt folder Klasör şifrelensin - + No account configured. Herhangi bir hesap yapılandırılmamış. - - Display mnemonic - Anımsatıcı görüntülensin + + Disable encryption + Şifreleme kullanılmasın - End-to-end encryption has been enabled for this account - Bu hesap için uçtan uca şifreleme kullanılıyor + Display mnemonic + Anımsatıcı görüntülensin @@ -445,19 +455,24 @@ Şifreleme kullanılsın - + + End-to-end encryption has been enabled for this account + Bu hesap için uçtan uca şifreleme kullanılıyor + + + Warning Uyarı - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? Bu aygıtta uçtan uca şifreleme yapılandırılmamış. Yapılandırmayı tamamladığınızda, bu klasörü şifreleyebilirsiniz. Uçtan uca şifrelemeyi kurmak ister misiniz? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. İçi dolu olan bir klasör şifrelenemez, lütfen dosyaları kaldırın. @@ -470,121 +485,121 @@ Eşitlemenin tamamlanmasını bekleyip klasörü şifreleyin Bu hesap uçtan uca şifrelemeyi destekliyor - + Encryption failed Şifrelenemedi - + Could not encrypt folder because the folder does not exist anymore Klasör bulunamadığından şifrelenemedi - - + + Open folder Klasörü aç - + Encrypt Şifrele - - + + Edit Ignored Files Yok sayılan dosyaları düzenle - - + + Create new folder Klasör ekle - - + + Availability Kullanılabilirlik - + Choose what to sync Eşitlenecek ögeleri seçin - + Force sync now Şimdi eşitlemeye zorla - + Restart sync Eşitlemeyi yeniden başlat - + Resume sync Eşitlemeyi sürdür - + Pause sync Eşitlemeyi duraklat - + Remove folder sync connection Klasör eşitleme bağlantısını sil - + Disable virtual file support … Sanal dosya desteğini devre dışı bırak … - + Enable virtual file support %1 … %1 için sanal dosya desteği kullanılsın … - + (experimental) (deneysel) - + Folder creation failed Klasör oluşturulamadı - + <p>Could not create local folder <i>%1</i>.</p> <p><i>%1</i> yerel klasörü oluşturulamadı.</p> - + Confirm Folder Sync Connection Removal Klasör eşitleme bağlantısını silmeyi onaylayın - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p><i>%1</i> klasörünün eşitlemesini durdurmak istediğinize emin misiniz?</p><p><b>Not:</b> Bu işlem herhangi bir dosyayı <b>silmez</b>.</p> - + Remove Folder Sync Connection Klasör eşitleme bağlantısını sil - + Disable virtual file support? Sanal dosya desteği devre dışı bırakılsın mı? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ Sanal dosya desteğini devre dışı bırakmanın tek faydası isteğe bağlı e Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur. - + Disable support Desteği devre dışı bırak @@ -607,145 +622,177 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur.Uçtan uca şifreleme anımsatıcısı - + End-to-end encryption mnemonic Uçtan uca şifreleme anımsatıcısı - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). Şifreli kimliğiniz korunmak için 12 sözlük sözcüğünden oluşan bir anımsatıcı ile şifrelendi. Lütfen bu sözcükleri not ederek güvenli bir yerde saklayın. Bu bilgi hesabınıza başka aygıtlar (cep telefonu ya da bilgisayar) eklemek istediğinizde gerekir. - + + Disable end-to-end encryption + Uçtan uca şifreleme kullanılmasın + + + + Disable end-to-end encryption for %1? + %1 için uçtan uca şifreleme kapatılsın mı? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + Uçtan uca şifrelemenin kapatılması, yerel olarak eşitlenmiş şifrelenmiş dosyaları kaldırır.<br>Şifrelenmiş dosyalar sunucuda kalır. + + + Sync Running Eşitleme çalışıyor - + The syncing operation is running.<br/>Do you want to terminate it? Eşitleme işlemi sürüyor.<br/>Durdurmak istiyor musunuz? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) / %2 kullanımda. Ağ üzerinden bağlanmış ya da paylaşılmış klasörlerin sınırları farklı olabilir. - + %1 of %2 in use %1 / %2 kullanılıyor - + Currently there is no storage usage information available. Şu anda depolama kullanımı ile ilgili bir bilgi yok. - + %1 in use %1 kullanılıyor - + %1 as %2 %1, %2 olarak - + The server version %1 is unsupported! Proceed at your own risk. - %1 sunucu sürümü desteklenmiyor! Riski üstlenerek devam edebilirsiniz. + %1 sunucu sürümü desteklenmiyor! Riski üstlenerek sürdürebilirsiniz. - + Connected to %1. %1 ile bağlı. - + Server %1 is temporarily unavailable. %1 sunucusu geçici olarak kullanılamıyor. - + Server %1 is currently in maintenance mode. %1 sunucusu bakım kipinde. - + Signed out from %1. %1 oturumu kapatıldı. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Kimlik web tarayıcısı üzerinden doğrulanıyor. Web tarayıcıyı yeniden açmak için <a href='%1'>buraya tıklayın</a>. - + Connecting to %1 … %1 bağlantısı kuruluyor … - + No connection to %1 at %2. %1 ile %2 üzerinde bağlantı yok. - + Server configuration error: %1 at %2. Sunucu yapılandırma sorunu: %1 ile %2. - + No %1 connection configured. Henüz bir %1 bağlantısı yapılandırılmamış. - + There are folders that were not synchronized because they are too big: Çok büyük oldukları için eşitlenmeyen klasörler var: - + There are folders that were not synchronized because they are external storages: Dış depolama alanlarında bulundukları için eşitlenmeyen klasörler var: - + There are folders that were not synchronized because they are too big or external storages: Çok büyük oldukları için ya da dış depolama alanında bulundukları için eşitlenmeyen klasörler var: - + Confirm Account Removal Hesap silmeyi onaylayın - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p><i>%1</i> hesabının bağlantısını kaldırmak istediğinize emin misiniz?</p><p><b>Not:</b> Bu işlem herhangi bir dosyayı <b>silmez</b>.</p> - + Remove connection Bağlantıyı kaldır - - + This account supports end-to-end encryption Bu hesap uçtan uca şifrelemeyi destekliyor - + Set up encryption Şifreleme kurulumu - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - Bu hesapta uçtan uca şifreleme başka bir aygıt ile etkinleştirilmiş.<br>Anımsatıcınızı yazarak bu aygıt için etkinleştirebilirsiniz. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + Bu hesapta uçtan uca şifreleme başka bir aygıt ile etkinleştirilmiş.<br>Anımsatıcınızı yazarak bu aygıt için etkinleştirebilirsiniz.<br>Böylece var olan şifrelenmiş klasörler eşitlenmeye başlanır. + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + Sunucuya yapılan kimlik doğrulama isteği "%1" adresine yönlendirildi. Adres ya da sunucu yapılandırması hatalı. + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + Erişim sunucu tarafından engellendi. Web tarayıcınız ile hizmete erişerek yeterli izne sahip olup olmadığınızı doğrulamak için <a href="%1">buraya tıklayın</a>. + + + + There was an invalid response to an authenticated WebDAV request + Kimliği doğrulanmış bir WebDAV isteğine geçersiz bir yanıt verildi @@ -799,7 +846,7 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur. OCC::ActivityListModel - + For more activities please open the Activity app. Diğer işlemler için lütfen İşlemler uygulamasını açın. @@ -809,12 +856,12 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur.İşlemler alınıyor… - + Fetching activities … İşlemler alınıyor… - + Files from the ignore list as well as symbolic links are not synced. Yok sayma listesindeki dosyalar ve sembolik bağlantılar eşitlenmez. @@ -865,32 +912,59 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur. OCC::Application - + Continuing will mean <b>deleting these settings</b>. İlerlerseniz <b>bu ayarlar silinecek</b>. - + Continuing will mean <b>ignoring these settings</b>. İlerlerseniz <b>bu ayarlar yok sayılacak</b>. - + 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>. Bazı ayarlar, bu uygulamanın daha yeni sürümleri üzerinden yapılmış ve bu sürümde kullanılamaz.<br><br>%1<br><br>Geçerli yapılandırma dosyası zaten<i>%2</i> üzerine yedeklendi. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Çık - + Continue Sürdür - + Error accessing the configuration file Yapılandırma dosyasına erişilirken sorun çıktı @@ -900,12 +974,12 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur.%1 üzerindeki yapılandırma dosyasına erişilirken bir sorun çıktı. Lütfen kullanıcı hesabınızın yapılandırma dosyasına erişme izinlerinin olduğundan emin olun. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. %1 üzerindeki yapılandırma dosyasına erişilirken bir sorun çıktı. Lütfen sistem hesabınızın yapılandırma dosyasına erişme izinlerinin olduğundan emin olun. - + Quit %1 %1 uygulamasından çık @@ -951,58 +1025,218 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur.%1 dosyasının değiştirilme zamanı geçersiz. Sunucuya yüklenmedi. - + File Removed (start upload) %1 Dosya kaldırıldı (yüklemeyi başlat) %1 - + File %1 has invalid modification time. Do not upload to the server. %1 dosyasının değiştirilme zamanı geçersiz. Sunucuya yüklenmedi. - + Local file changed during syncing. It will be resumed. Yerel dosya eşitleme sırasında değişmiş. Sürdürülecek. - - + + Local file changed during sync. Yerel dosya eşitleme sırasında değişmiş. - + Network error: %1 Ağ sorunu: %1 - + Error updating metadata: %1 Üst veriler güncellenirken sorun çıktı: %1 - + The file %1 is currently in use %1 dosyası şu anda kullanılıyor - + The local file was removed during sync. Yerel dosya eşitleme sırasında silinmiş. - + Restoration failed: %1 Geri yüklenemedi: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + Aynı adlı bir dosya sunucu üzerinde zaten var olduğundan dosya yeniden adlandırılamadı. Lütfen başka bir ad seçin. + + + + Could not rename file. Please make sure you are connected to the server. + Dosya yeniden adlandırılamadı. Sunucuya bağlı olduğunuzdan emin olun. + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + Bu dosyayı yeniden adlandırma izniniz yok. Dosya sahibinden dosyanın adını değiştirmesini isteyebilirsiniz. + + + + Failed to fetch permissions with error %1 + İzinler %1 hatası ile alınamadı + + + + Filename contains leading and trailing spaces. + Dosya adının başında ve sonunda boşluklar var. + + + + Filename contains leading spaces. + Dosya adının başında boşluklar var. + + + + Filename contains trailing spaces. + Dosya adının başında boşluklar var. + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + Çakışmayla karşılaşıldı + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + Bu sistemde var olan bir dosya ile çakışmaya yol açtığından bu dosya eşitlenemedi. + + + + Error + Hata + + + + Existing file + Var olan dosya + + + + file A + + + + + fileA + A dosyası + + + + + today + bugün + + + + + 0 byte + 0 bayt + + + + + Open existing file + Var olan dosyayı aç + + + + Case clashing file + Çakışan dosya + + + + file B + + + + + fileB + B dosyası + + + + + Open clashing file + Çakışan dosyayı aç + + + + Please enter a new name for the clashing file: + Lütfen çakışan dosya için yeni bir ad yazın: + + + + New filename + Yeni dosya adı + + + + Rename file + Dosyayı yeniden adlandır + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + Bu sistemde var olan bir dosya ile çakışmaya yol açtığından "%1" dosyası eşitlenemedi. + + + + %1 does not support equal file names with only letter casing differences. + %1, yalnızca büyük/küçük harf farklılıkları olan aynı dosya adlarını desteklemiyor. + + + + Filename contains leading and trailing spaces. + Dosya adının başında ve sonunda boşluklar var. + + + + Filename contains leading spaces. + Dosya adının başında boşluklar var. + + + + Filename contains trailing spaces. + Dosya adının sonunda boşluklar var. + + + + Use invalid name + Geçersiz ad kullanılsın + + + + Filename contains illegal characters: %1 + Dosya adında izin verilmeyen karakterler var: %1 + + OCC::CleanupPollsJob - + Error writing metadata to the database - Üst veri veritabanına yazılırken sorun çıktı + Üst veri veri tabanına yazılırken sorun çıktı @@ -1018,12 +1252,12 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur.Lütfen uçtan uca şifreleme parolasını yazın:<br><br>Kullanıcı:%2<br>Hesap:%3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> Lütfen uçtan uca şifreleme parolasını yazın:<br><br>Kullanıcı adı: %2<br>Hesap: %3<br> - + Enter E2E passphrase Uçtan uca şifreleme parolasını yazın @@ -1199,8 +1433,8 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Sunucu hatası: PROPFIND yanıtı XML biçiminde değil! @@ -1208,27 +1442,27 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 %1 klasörü açılırken sorun çıktı - + Directory not accessible on client, permission denied İstemciden klasöre erişilemedi, izin verilmedi - + Directory not found: %1 Klasör bulunamadı: %1 - + Filename encoding is not valid Dosya adı kodlaması geçersiz - + Error while reading directory %1 %1 klasörü okunurken sorun çıktı @@ -1236,91 +1470,91 @@ Bu işlem şu anda yürütülmekte olan eşitleme işlemlerini durdurur. OCC::EditLocallyJob - + Invalid token received. Alınan kod geçersiz - - - - - - + + + + + + Please try again. Lütfen yeniden deneyin. - + Invalid file path was provided. Belirtilen dosya yolu geçersiz. - + Could not find an account for local editing. Yerel düzenleme için bir hesap bulunamadı. - - + + Could not validate the request to open a file from server. Sunucudaki bir dosyayı açma isteği doğrulanamadı. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. Yerel düzenleme için bir dosya bulunamadı. Dosyanın yolunun geçerli olduğundan ve yerel olarak eşitlendiğinden emin olun. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. Yerel düzenleme için bir dosya bulunamadı. Dosyanın seçimli eşitleme ile katılmayacak olarak seçilmediğinden emin olun. - + Server error: PROPFIND reply is not XML formatted! - + Sunucu hatası: PROPFIND yanıtı XML biçiminde değil! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Yerel düzenleme için bir uzak dosya bulunamadı. Dosya yolunun geçerli olduğundan emin olun. - + Could not open %1 - + %1 açılamadı - + File %1 already locked. - + %1 dosyası zaten kilitli. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + Kilit %1 dakika sonra açılacak. İsterseniz dosyayı düzenlemeyi bitirdikten sonra kilidini el ile açabilirsiniz. - + File %1 now locked. - + %1 dosyası kilitlendi. - + File %1 could not be locked. - + %1 dosyası kilitlenemedi. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Şifreleme için üst veri üretilemedi. Klasörün kilidi açılıyor. @@ -1450,145 +1684,145 @@ Bu durum OpenSLL kitaplıkları ile ilgili bir sorun olabilir. OCC::Folder - + Local folder %1 does not exist. %1 yerel klasörü bulunamadı. - + %1 should be a folder but is not. %1 bir klasör olmalı, ancak değil. - + %1 is not readable. %1 okunabilir değil. - + %1 and %n other file(s) have been removed. %1 ve diğer %n dosya kaldırıldı.%1 ve diğer %n dosya kaldırıldı. - + %1 has been removed. %1 names a file. %1 kaldırıldı. - + %1 and %n other file(s) have been added. %1 ve diğer %n dosya eklendi.%1 ve diğer %n dosya eklendi. - + %1 has been added. %1 names a file. %1 eklendi. - + %1 and %n other file(s) have been updated. %1 ve diğer %n dosya güncellendi.%1 ve diğer %n dosya güncellendi. - + %1 has been updated. %1 names a file. %1 güncellendi. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1, %2 olarak yeniden adlandırıldı ve diğer %n dosyanın adı değiştirildi.%1, %2 olarak yeniden adlandırıldı ve diğer %n dosyanın adı değiştirildi. - + %1 has been renamed to %2. %1 and %2 name files. %1, %2 olarak adlandırıldı. - + %1 has been moved to %2 and %n other file(s) have been moved. %1, %2 konumuna taşındı ve diğer %n dosya taşındı.%1, %2 konumuna taşındı ve diğer %n dosya taşındı. - + %1 has been moved to %2. %1, %2 konumuna taşındı. - + %1 has and %n other file(s) have sync conflicts. %1 ve diğer %n dosya için eşitleme çakışması var.%1 ve diğer %n dosya için eşitleme çakışması var. - + %1 has a sync conflict. Please check the conflict file! %1 için eşitleme çakışması var. Lütfen çakışan dosyayı denetleyin! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 ve diğer %n dosya sorunlar nedeniyle eşitlenemedi. Ayrıntılı bilgi almak için günlük dosyasına bakın.%1 ve diğer %n dosya sorunlar nedeniyle eşitlenemedi. Ayrıntılı bilgi almak için günlük dosyasına bakabilirsiniz. - + %1 could not be synced due to an error. See the log for details. %1 bir sorun nedeniyle eşitlenemedi. Ayrıntılı bilgi almak için günlük dosyasına bakabilirsiniz. - + %1 and %n other file(s) are currently locked. Şu anda %1 ve %n diğer dosya kilitli.Şu anda %1 ve %n diğer dosya kilitli. - + %1 is currently locked. %1 şu anda kilitli. - + Sync Activity Eşitleme işlemi - + Could not read system exclude file Sistem katılmayacaklar dosyası okunamadı - + A new folder larger than %1 MB has been added: %2. %1 MB boyutundan büyük yeni bir klasör eklendi: %2. - + A folder from an external storage has been added. Dış depolama alanından bir klasör eklendi. - + Please go in the settings to select it if you wish to download it. İndirmek istiyorsanız seçmek için lütfen ayarlar bölümüne gidin. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. %1 klasörü oluşturulmuş ancak daha önce eşitleme dışı bırakılmış. Bu klasördeki veriler eşitlenmeyecek. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. %1 dosyası oluşturulmuş ancak daha önce eşitleme dışı bırakılmış. Bu dosyadaki veriler eşitlenmeyecek. - + 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). @@ -1599,7 +1833,7 @@ This means that the synchronization client might not upload local changes immedi Bunun sonucunda eşitleme istemcisi yerel değişiklikleri anında yükleyemez. Onun yerine yalnızca yerel değişiklikleri tarar ve aralıklarla yükler (varsayılan olarak iki saatte bir). - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1610,7 +1844,7 @@ Geri yükleme yetkiniz varsa ve geri yüklemeyi seçerseniz, dosyalar sunucu ile Silmeyi seçerseniz, sahibi değilseniz bu dosyaları artık kullanamazsınız. - + 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. @@ -1620,17 +1854,17 @@ Sunucuda bu eşitleme işlemlerinin yapılmasını istediğinizden emin misiniz? Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanız dosyalar sunucudan yeniden eşitlenecek. - + Remove All Files? Tüm dosyalar silinsin mi? - + Remove all files Tüm dosyalar silinsin - + Keep files Dosyalar korunsun @@ -1666,22 +1900,22 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı OCC::FolderMan - + Could not reset folder state Klasör durumu sıfırlanamadı - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Eski bir "%1" eşitleme günlüğü bulundu ancak kaldırılamadı. Günlüğün Başka bir uygulama tarafından kullanılmadığından emin olun. - + (backup) (yedek) - + (backup %1) (yedek %1) @@ -1691,27 +1925,27 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı Tanımlanmamış durum. - + Undefined state. Tanımlanmamış durum. - + Waiting to start syncing. Eşitlemenin başlatılması bekleniyor. - + Preparing for sync. Eşitleme için hazırlanılıyor. - + Sync is running. Eşitleme çalışıyor. - + Sync finished with unresolved conflicts. Eşitleme çözülememiş çakışmalar ile tamamlandı. @@ -1731,62 +1965,62 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı Kullanıcı iptal etti. - + Last sync was successful. Son eşitleme başarılıydı. - + Setup error. Kurulum sorunu. - + Sync request was cancelled. Eşitleme isteği iptal edildi. - + Sync is paused. Eşitleme duraklatıldı. - + %1 (Sync is paused) %1 (eşitleme duraklatıldı) - + No valid folder selected! Geçerli bir klasör seçilmemiş! - + The selected path does not exist! Seçilmiş yol bulunamadı! - + The selected path is not a folder! Seçilmiş yol bir klasör değil! - + You have no permission to write to the selected folder! Seçilmiş klasöre yazma izniniz yok! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! %1 yerel klasöründe eşitleme için kullanılan bir klasör zaten var. Lütfen başka bir klasör seçin! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! %1 yerel klasörü zaten eşitleme için kullanılan bir klasörün içinde. Lütfen başka bir klasör seçin! - + There is already a sync from the server to this local folder. Please pick another local folder! Sunucu ile bu yerel klasör zaten eşitleniyor. Lütfen başka bir yerel klasör seçin! @@ -1799,7 +2033,7 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı Klasör eşitleme bağlantısı ekle - + File Dosya @@ -1807,152 +2041,156 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı OCC::FolderStatusModel - + You need to be connected to add a folder Klasör eklemek için bağlantı kurmuş olmanız gerekir - + Click this button to add a folder to synchronize. Eşitlenecek bir klasör eklemek için bu düğmeye tıklayın. - - + + Could not decrypt! + Şifre çözülemedi! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Klasör listesi sunucudan yüklenirken sorun çıktı. - + Fetching folder list from server … Sunucudan klasör listesi alınıyor … - + There are unresolved conflicts. Click for details. Çözümlenmemiş çakışmalar var. Ayrıntılı bilgi için tıklayın. - + Virtual file support is enabled. Sanal dosya desteği etkinleştirildi. - + Signed out Oturum kapatıldı - + Synchronizing VirtualFiles with local folder Sanal dosyalar yerel klasör ile eşitleniyor - + Synchronizing with local folder Yerel klasör ile eşitleniyor - + Checking for changes in remote "%1" Uzak "%1" üzerindeki değişiklikler denetleniyor - + Checking for changes in local "%1" Yerel "%1" üzerindeki değişiklikler denetleniyor - + Reconciling changes Değişiklikler denkleştiriliyor - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" %1 eşitleniyor - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) indirme %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) yükleme %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 / %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Birkaç saniye kaldı, %1 / %2, dosya %3 / %4 - + %5 left, %1 of %2, file %3 of %4 Kalan %5, %1 / %2, dosya %3 / %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 / %2, %3 / %4 dosya - + file %1 of %2 dosya %1 / %2 - + Waiting … Bekleniyor … - + Waiting for %n other folder(s) … Diğer %n klasör bekleniyor …Diğer %n klasör bekleniyor … - + Preparing to sync … Eşitlemeye hazırlanılıyor … @@ -2105,7 +2343,7 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı We received a different E-Tag for resuming. Retrying next time. - Devam etmek için farklı bir E-Tag alındı. Gelecek sefer yeniden denenecek. + İlerlemek için farklı bir E-Tag alındı. Gelecek sefer yeniden denenecek. @@ -2183,13 +2421,13 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı - + stable kararlı - + beta beta @@ -2241,32 +2479,32 @@ Bu işlemi yanlışlıkla yaptıysanız ve dosyalarınızı korumak istiyorsanı - + Create Debug Archive Hata ayıklama arşivi oluştur - + Server notifications that require attention. İlgilenmeniz gereken sunucu bildirimleri. - + Show call notification dialogs. Çağrı bildirimi pencerelerini görüntüler. - + You cannot disable autostart because system-wide autostart is enabled. Otomatik başlatma sistem genelinde etkinleştirilmiş olduğundan, otomatik başlatma devre dışı bırakılamaz. - + Change update channel? Güncelleme kanalı değiştirilsin mi? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Bu seçenek yalnızca güncellemelerin hangi havuzdan alınacağını belirler. Güncelleme sonrası önceki sürüme geri dönülemeyeceğini unutmayın. Bu nedenle, genellikle beta kanalından kararlı kanala geri dönmek için kurulu olan beta sürümünden daha yeni bir kararlı sürümün yayınlanmasını beklemeniz gerekeceğinden bu işlem hemen gerçekleşmez. - + Change update channel Güncelleme kanalını değiştir - + Cancel İptal - + Zip Archives Zip arşivleri - + Debug Archive Created Hata ayıklama arşivi oluşturuldu - + Debug archive is created at %1 %1 üzerinde hata ayıklama arşivi oluşturuldu @@ -2303,22 +2541,22 @@ Bu seçenek yalnızca güncellemelerin hangi havuzdan alınacağını belirler. OCC::GetOrCreatePublicLinkShare - + Password for share required Paylaşım parolası zorunludur - + Please enter a password for your link share: Lütfen bağlantı paylaşımınız için bir parola yazın: - + Sharing error Paylaşım sorunu - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Silme izni verildiğinde bir klasörün silinmesini engelleyen ögeler silinir. Close Kapat + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Telif hakları 2017-2023 Nextcloud GmbH<br />Telif hakları 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Komut satırından verilen günlük komutlarının bu ayarın yerine geçeceğin - + Use &virtual files instead of downloading content immediately %1 İçerik &hemen indirilmek yerine sanal dosyalar kullanılsın %1 - + (experimental) (deneysel) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Sanal dosyalar, yerel klasör olarak Windows bölümü kök klasörlerini desteklemez. Lütfen sürücü harfinin altında bulunan bir klasör seçin. - + %1 folder "%2" is synced to local folder "%3" %1 klasörü "%2", yerel "%3" klasörü ile eşitlendi - + Sync the folder "%1" "%1" klasörünü eşitle - + Warning: The local folder is not empty. Pick a resolution! Uyarı: Yerel klasör boş değil. Bir çözüm seçin! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 boş alan - + Virtual files are not available for the selected folder Sanal dosyalar seçilmiş klasör için kullanılamaz - + Local Sync Folder Yerel eşitleme klasörü - - + + (%1) (%1) - + There isn't enough free space in the local folder! Yerel klasörde yeterli boş alan yok! @@ -3016,7 +3259,8 @@ Komut satırından verilen günlük komutlarının bu ayarın yerine geçeceğin OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 %1 ile çakışan dosyasının değiştirilme zamanı alınamadı @@ -3048,144 +3292,144 @@ Komut satırından verilen günlük komutlarının bu ayarın yerine geçeceğin OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">%1 bağlantısı kuruldu: %2 sürüm %3 (%4)</font><br/><br/> - + Invalid URL Adres geçersiz - + Failed to connect to %1 at %2:<br/>%3 %1 ile %2 zamanında bağlantı kurulamadı:<br/>%3 - + Timeout while trying to connect to %1 at %2. %1 ile %2 zamanında bağlantı kurulurken zaman aşımı. - + Trying to connect to %1 at %2 … %2 üzerindeki %1 ile bağlantı kuruluyor … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Sunucuya yapılan kimlik doğrulama isteği "%1" adresine yönlendirildi. Adres ya da sunucu yapılandırması hatalı. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Erişim sunucu tarafından engellendi. Web tarayıcınız ile hizmete erişerek yeterli izne sahip olup olmadığınızı doğrulamak için <a href="%1">buraya tıklayın</a>. - + There was an invalid response to an authenticated WebDAV request Kimliği doğrulanmış bir WebDAV isteğine geçersiz bir yanıt verildi - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> %1 yerel eşitleme klasörü zaten var, eşitlemeye ayarlanıyor.<br/><br/> - + Creating local sync folder %1 … %1 yerel eşitleme klasörü oluşturuluyor … - + OK Tamam - + failed. başarısız. - + Could not create local folder %1 %1 yerel klasörü oluşturulamadı - + No remote folder specified! Uzak klasör belirtilmemiş! - + Error: %1 Hata: %1 - + creating folder on Nextcloud: %1 Nextcloud üzerinde klasör oluşturuluyor: %1 - + Remote folder %1 created successfully. %1 uzak klasörü oluşturuldu. - + The remote folder %1 already exists. Connecting it for syncing. Uzak klasör %1 zaten var. Eşitlemek için bağlantı kuruluyor. - - + + The folder creation resulted in HTTP error code %1 Klasör oluşturma işlemi %1 HTTP hata kodu ile sonuçlandı - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Geçersiz kimlik doğrulama bilgileri nedeniyle uzak klasör oluşturulamadı!<br/>Lütfen geri giderek kimlik doğrulama bilgilerinizi denetleyin.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Büyük olasılıkla belirtilen kimlik doğrulama bilgileri hatalı olduğundan uzak klasör oluşturulamadı.</font><br/>Lütfen geri giderek kimlik doğrulama bilgilerinizi doğrulayın.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. %1 uzak klasörü <tt>%2</tt> hatası nedeniyle oluşturulamadı. - + A sync connection from %1 to remote directory %2 was set up. %1 ile %2 uzak klasörü arasında bir eşitleme bağlantısı ayarlandı. - + Successfully connected to %1! %1 ile bağlantı kuruldu! - + Connection to %1 could not be established. Please check again. %1 ile bağlantı kurulamadı. Lütfen yeniden denetleyin. - + Folder rename failed Klasör yeniden adlandırılamadı - + Cannot 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. Klasör ya da içindeki bir dosya başka bir program tarafından kullanıldığından, bu klasör üzerinde silme ya da yedekleme işlemleri yapılamıyor. Lütfen klasör ya da dosyayı kapatıp yeniden deneyin ya da kurulumu iptal edin. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>%1 yerel eşitleme klasörü oluşturuldu!</b></font> @@ -3208,12 +3452,12 @@ Komut satırından verilen günlük komutlarının bu ayarın yerine geçeceğin İptal - + Enable experimental feature? Deneysel özellikler etkinleştirilsin mi? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ Bu kipe geçildiğinde yürütülmekte olan eşitleme işlemleri iptal edilir. Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karşılaşabileceğiniz sorunları bize bildirin. - + Enable experimental placeholder mode Deneysel yer belirteci kipi etkinleştirilsin - + Stay safe Güvende kalın @@ -3264,162 +3508,167 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Sembolik bağlantıların eşitlenmesi desteklenmiyor. - + File is listed on the ignore list. Dosya yok sayılanlar listesinde. - + File names ending with a period are not supported on this file system. Nokta ile biten dosya adları bu dosya sisteminde desteklenmiyor. - + File names containing the character "%1" are not supported on this file system. "%1" karakterini içeren dosya adları bu sistemde desteklenmiyor. - + File name contains at least one invalid character Dosya adında en az bir geçersiz karakter var - + The file name is a reserved name on this file system. Bu dosya adı bu dosya sisteminde ayırtılmış bir ad olduğundan kullanılamaz. - + Filename contains trailing spaces. Dosya adının sonunda boşluklar var. - + Filename contains leading spaces. Dosya adının başında boşluklar var. - + Filename contains leading and trailing spaces. Dosya adının başında ve sonunda boşluklar var. - + Filename is too long. Dosya adı çok uzun. - + File/Folder is ignored because it's hidden. Dosya/klasör gizli olduğu için yok sayıldı. - + Stat failed. Durum alınamadı. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Çakışma: Sunucu sürümü indirildi, yerel kopya yeniden adlandırıldı ve yüklenmedi. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + Çakışmayla karşılaşıldı: Sunucu dosyası indirildi ve çakışmayı önlemek için adı değiştirildi. + + + The filename cannot be encoded on your file system. Dosya adı dosya sisteminizde kodlanamıyor. - + The filename is blacklisted on the server. Dosya adı sunucu üzerinde kara listeye alınmış. - + File has extension reserved for virtual files. Dosyanın uzantısı sanal dosyalar için ayrılmış. - + size boyut - + permission izin - + file id dosya kodu - + Server reported no %1 Sunucunun bildirilen numarası %1 - + Cannot sync due to invalid modification time Değiştirilme zamanı geçersiz olduğundan eşitlenemedi - + Error while deleting file record %1 from the database - %1 dosya kaydı veritabanından silinirken sorun çıktı + %1 dosya kaydı veri tabanından silinirken sorun çıktı - + Conflict when uploading a folder. It's going to get cleared! Bir klasör yüklenirken çakışma oldu. Çakışma temizlenecek! - + Conflict when uploading a file. It's going to get removed! Bir dosya yüklenirken çakışma oldu. Çakışma temizlenecek! - + Ignored because of the "choose what to sync" blacklist "Eşitlenecek ögeleri seçin" kara listesinde olduğundan yok sayıldı - + Not allowed because you don't have permission to add subfolders to that folder Bu klasöre alt klasör ekleme izniniz olmadığından izin verilmedi - + Not allowed because you don't have permission to add files in that folder Bu klasöre dosya ekleme izniniz olmadığından izin verilmedi - + Not allowed to upload this file because it is read-only on the server, restoring Sunucu üzerinde salt okunur olduğundan, bu dosya yüklenemedi, geri yükleniyor - + Moved to invalid target, restoring Geçersiz bir hedefe taşındı, geri yükleniyor - + Not allowed to remove, restoring Silmeye izin verilmedi, geri yükleniyor - + Error while reading the database - Veritabanı okunurken sorun çıktı + Veri tabanı okunurken sorun çıktı - + Server replied with an error while reading directory "%1" : %2 "%1" klasörü okunurken sunucu bir hata yanıtı verdi: %2 @@ -3427,22 +3676,22 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::PropagateDirectory - + could not delete file %1 from local DB - %1 dosyası yerel veritabanından silinemedi + %1 dosyası yerel veri tabanından silinemedi - + Error updating metadata due to invalid modification time Değiştirilme zamanı geçersiz olduğundan üst veriler yüklenirken sorun çıktı - + Error updating metadata: %1 Üst veriler güncellenirken sorun çıktı: %1 - + File is currently in use Dosya şu anda kullanılıyor @@ -3452,24 +3701,24 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş could not get file %1 from local DB - %1 dosyası yerel veritabanından alınamadı + %1 dosyası yerel veri tabanından alınamadı - + File %1 cannot be downloaded because encryption information is missing. %1 dosyası, adının şifreleme bilgilerinin eksik olması nedeniyle indirilemedi. - - + + File has changed since discovery Dosya taramadan sonra değiştirilmiş - + Could not delete file record %1 from local DB - %1 dosya kaydı yerel veritabanından silinemedi + %1 dosya kaydı yerel veri tabanından silinemedi @@ -3478,32 +3727,32 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş %1 dosyası, adının yerel bir dosya ile çakışması nedeniyle indirilemedi! - + File %1 can not be downloaded because of a local file name clash! %1 dosyası, adının yerel bir dosya ile çakışması nedeniyle indirilemedi! - + The download would reduce free local disk space below the limit İndirme sonucunda boş yerel disk alanı sınırın altına inebilir - + Free space on disk is less than %1 Boş disk alanı %1 değerinin altında - + File was deleted from server Dosya sunucudan silindi - + The file could not be downloaded completely. Dosya tam olarak indirilemedi. - + The downloaded file is empty, but the server said it should have been %1. İndirilen dosya boş. Ancak sunucu tarafından dosya boyutu %1 olarak bildirildi. @@ -3513,18 +3762,23 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş %1 dosyası, adının yerel bir dosya ile çakışması nedeniyle kaydedilemedi! - - + + File %1 has invalid modified time reported by server. Do not save it. Sunucu tarafından bildirilen %1 dosyasının değiştirilme tarihi geçersiz. Kaydedilmedi. - + + File %1 downloaded but it resulted in a local file name clash! + %1 dosyası indirildi ancak adı yerel bir dosya ile çakışıyor! + + + Error updating metadata: %1 Üst veriler güncellenirken sorun çıktı: %1 - + The file %1 is currently in use %1 dosyası şu anda kullanılıyor @@ -3545,7 +3799,7 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 %1 dosyası silinemedi, hata: %2 @@ -3556,16 +3810,21 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş + Folder %1 cannot be created because of a local file or folder name clash! + %1 klasörü, adının yerel bir dosya ya da klasör ile çakışması nedeniyle oluşturulamadı! + + + Could not create folder %1 %1 klasörü oluşturulamadı - + Error updating metadata: %1 Üst veriler güncellenirken sorun çıktı: %1 - + The file %1 is currently in use %1 dosyası şu anda kullanılıyor @@ -3573,59 +3832,64 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Yerel bir dosya adı ile çakışması nedeniyle %1 dosyası %2 olarak adlandırılamadı Could not delete file record %1 from local DB - %1 dosya kaydı yerel veritabanından silinemedi + %1 dosya kaydı yerel veri tabanından silinemedi OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Yerel bir dosya adı ile çakışması nedeniyle %1 dosyası %2 olarak adlandırılamadı - - - + + File %1 downloaded but it resulted in a local file name clash! + %1 dosyası indirildi ancak adı yerel bir dosya ile çakışıyor! + + + + + could not get file %1 from local DB - %1 dosyası yerel veritabanından alınamadı + %1 dosyası yerel veri tabanından alınamadı - + Error setting pin state Sabitleme durumu ayarlanırken sorun çıktı - - + + Error updating metadata: %1 Üst veriler güncellenirken sorun çıktı: %1 - + The file %1 is currently in use %1 dosyası şu anda kullanılıyor - - + + Could not delete file record %1 from local DB - %1 dosya kaydı yerel veritabanından silinemedi + %1 dosya kaydı yerel veri tabanından silinemedi - + Failed to propagate directory rename in hierarchy Hiyerarşi içinde klasörü yeniden adlandırma işlemi yapılamadı - + Failed to rename file Dosya yeniden adlandırılamadı @@ -3640,13 +3904,13 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Could not delete file record %1 from local DB - %1 dosya kaydı yerel veritabanından silinemedi + %1 dosya kaydı yerel veri tabanından silinemedi OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Sunucudan alınan HTTP kodu yanlış. 204 bekleniyordu, ancak "%1 %2" alındı. @@ -3659,12 +3923,12 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Sunucudan alınan HTTP kodu yanlış. 201 bekleniyordu, ancak "%1 %2" alındı. - + Error writing metadata to the database: %1 - Üst veriler veritabanına yazılırken sorun çıktı: %1 + Üst veriler veri tabanına yazılırken sorun çıktı: %1 - + The file %1 is currently in use %1 dosyası şu anda kullanılıyor @@ -3672,44 +3936,44 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 %1, %2 olarak yeniden adlandırılamadı, hata: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Sunucudan alınan HTTP kodu yanlış. 201 bekleniyordu, ancak "%1 %2" alındı. - + could not get file %1 from local DB - %1 dosyası yerel veritabanından alınamadı + %1 dosyası yerel veri tabanından alınamadı - + Could not delete file record %1 from local DB - %1 dosya kaydı yerel veritabanından silinemedi + %1 dosya kaydı yerel veri tabanından silinemedi - + Error updating metadata: %1 Üst veriler güncellenirken sorun çıktı: %1 - + The file %1 is currently in use %1 dosyası şu anda kullanılıyor - + Error setting pin state Sabitleme durumu ayarlanırken sorun çıktı - + Error writing metadata to the database - Üst veri veritabanına yazılırken sorun çıktı + Üst veriler veri tabanına yazılırken sorun çıktı @@ -3897,7 +4161,7 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::ServerNotificationHandler - + Reply Yanıtla @@ -3915,23 +4179,23 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Ayarlar - + %1 Settings This name refers to the application name e.g Nextcloud %1 Ayarları - + General Genel - + Network Ağ - + Account Hesap @@ -3939,17 +4203,22 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::ShareModel - + Share link Bağlantıyı paylaş - + Link share Bağlantı paylaşımı - + + Internal link + İç bağlantı + + + Enter a note for the recipient Alıcı için bir not yazın @@ -4025,7 +4294,7 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,171 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::SocketApi - + + Failed to encrypt folder at "%1" + "%1" klasörü şifrelenemedi + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + %1 hesabında uçtan uca şifreleme yapılandırılmamış. Klasör eşitlemesini kullanabilmek için lütfen hesap ayarlarınızdan etkinleştirin. + + + + Failed to encrypt folder + Klasör şifrelenemedi + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + Şu klasör şifrelenemedi: "%1". + +Sunucunun verdiği hata yanıtı: %2 + + + + Folder encrypted successfully + Klasör şifrelendi + + + + The following folder was encrypted successfully: "%1" + Şu klasör şifrelendi: "%1" + + + Context menu share Sağ tık menüsü paylaşımı - + Select new location … Yeni konum seçin … - + I shared something with you Sizinle bir şey paylaştım - - + + Share options Paylaşım seçenekleri - - + + Activity İşlem - + Copy private link to clipboard Kişisel bağlantıyı panoya kopyala - + Send private link by email … Kişisel bağlantıyı e-posta ile paylaş … + + + Expire in %1 minutes + remaining time before lock expire + %1 dakika sonra açılacak%1 dakika sonra açılacak + - + Leave this share Bu paylaşımdan ayrıl - + Resharing this file is not allowed Bu dosya yeniden paylaşılamaz - + Resharing this folder is not allowed Bu klasör yeniden paylaşılamaz - - + + Copy public link Herkese açık bağlantıyı kopyala - + Copy internal link İç bağlantıyı kopyala - + + Encrypt + Şifrele + + + Lock file Dosyayı kilitle - + Unlock file Dosyanın kilidini aç - + Locked by %1 %1 tarafından kilitlenmiş - - Expire in %1 minutes - remaining time before lock expire - %1 dakika sonra açılacak%1 dakika sonra açılacak - - - + Expires in %1 minutes remaining time before lock expires %1 dakika sonra açılacak%1 dakika sonra açılacak - + Edit Düzenle - + Open in browser Tarayıcıda aç - + Resolve conflict … Çakışmayı çöz … - + Move and rename … Taşı ve yeniden adlandır … - + Move, rename and upload … Taşı, yeniden adlandır ve yükle … - + Delete local changes Yerel değişiklikleri sil - + Move and upload … Taşı ve yükle … - + Delete Sil @@ -4377,63 +4685,63 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (önceki bir sorun nedeniyle atlandı, %2 içinde yeniden denenecek) - + Could not update file: %1 Dosya güncellenemedi: %1 - + Could not update virtual file metadata: %1 Sanal dosya üst verileri güncellenemedi: %1 - + Could not update file metadata: %1 Dosya üst verileri güncellenemedi: %1 - + Could not set file record to local DB: %1 - Dosya kaydı yerel veritabanına yapılamadı: %1 + Dosya kaydı yerel veri tabanına yapılamadı: %1 - + Unresolved conflict. Çözülmemiş çakışma. - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Yalnızca %1 kullanılabilir, başlatabilmek için en az %2 gerekli - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Yerel eşitleme klasörü açılamadı ya da oluşturulamadı. Eşitleme klasörüne yazma izniniz olduğundan emin olun. - + Using virtual files with suffix, but suffix is not set Sanal dosyalar son ek ile kullanılıyor. Ancak son ek ayarlanmamış - + Unable to read the blacklist from the local database - Yerel veritabanından kara liste okunamadı + Yerel veri tabanından kara liste okunamadı - + Unable to read from the sync journal. Eşitleme günlüğü okunamadı. - + Cannot open the sync journal Eşitleme günlüğü açılamadı @@ -4443,12 +4751,12 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Eşitleme kısa bir süre sonra sürdürülecek - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Disk alanı azaldı: Boş alanı %1 değerinin altına düşürecek indirmeler atlandı. - + There is insufficient space available on the server for some uploads. Sunucu üzerinde bazı yüklemeleri kaydetmek için yeterli alan yok. @@ -4517,59 +4825,59 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::Systray - + Download İndir - + Add account Hesap ekle - + Open main dialog Ana pencereyi aç - - + + Pause sync Eşitlemeyi duraklat - - + + Resume sync Eşitlemeyi sürdür - + Settings Ayarlar - + Help Yardım - + Exit %1 %1 uygulamasından çık - + Pause sync for all Tümü için eşitlemeyi duraklat - + Resume sync for all Tümü için eşitlemeyi sürdür - + %1: %2 %1: %2 @@ -4577,24 +4885,24 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 Masaüstü istemcisi</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>%1. sürüm. Ayrıntılı bilgi almak için <a href='%2'>buraya tıklayabilirsiniz</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Sanal dosyalar eklentisi kullanılarak: %1</small></p> - + <p>This release was supplied by %1</p> <p>Bu sürüm %1 tarafından hazırlanmıştır</p> @@ -4602,22 +4910,22 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Hizmet sağlayıcılar alınamadı. - + Failed to fetch search providers for '%1'. Error: %2 '%1' için hizmet sağlayıcılar alınamadı. Hata: %2 - + Search has failed for '%2'. '%2' için arama yapılamadı. - + Search has failed for '%1'. Error: %2 '%1' için arama yapılamadı. Hata: %2 @@ -4625,30 +4933,36 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::User - + Retry all uploads Tüm yüklemeleri yinele + + + + Resolve conflict + Çakışmayı çöz + OCC::UserModel - + Confirm Account Removal Hesap silmeyi onaylayın - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p><i>%1</i> hesabının bağlantısını silmek istediğinize emin misiniz?</p><p><b>Not:</b> Bu işlem herhangi bir dosyayı <b>silmez</b>.</p> - + Remove connection Bağlantıyı sil - + Cancel İptal @@ -4786,8 +5100,8 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Değiştirilme zamanı geçersiz olduğundan üst veriler yüklenirken sorun çıktı @@ -4795,8 +5109,8 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Değiştirilme zamanı geçersiz olduğundan üst veriler yüklenirken sorun çıktı @@ -4894,123 +5208,123 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş OCC::ownCloudGui - + Unsupported Server Version Sunucu sürümü desteklenmiyor - + 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. - %1 hesabındaki sunucu desteklenmeyen %2 sürümünü kullanıyor. Bu istemci desteklenmeyen sunucu sürümleri üzerinde denenmemiş olduğundan tehlikeli olabilir. Bu riski alıyorsanız devam edebilirsiniz. + %1 hesabındaki sunucu desteklenmeyen %2 sürümünü kullanıyor. Bu istemci desteklenmeyen sunucu sürümleri üzerinde denenmemiş olduğundan tehlikeli olabilir. Bu riski alıyorsanız ilerleyebilirsiniz. - + Disconnected Bağlantı kesildi - + Disconnected from some accounts Bazı hesapların bağlantısı kesildi - + Disconnected from %1 %1 ile bağlantı kesildi - + Disconnected from accounts: Şu hesapların bağlantısı kesildi: - + Account %1: %2 Hesap %1: %2 - + Please sign in Lütfen oturum açın - + Signed out Oturum kapatıldı - + Account synchronization is disabled Hesap eşitlemesi devre dışı bırakıldı - - + + Synchronization is paused Eşitleme duraklatıldı - + Folder %1: %2 Klasör %1: %2 - + Unresolved conflicts Çözülmemiş çakışmalar - + Up to date Güncel - + Error during synchronization Eşitleme sırasında sorun çıktı - + There are no sync folders configured. Herhangi bir eşitleme klasörü yapılandırılmamış. - + No sync folders configured Herhangi bir eşitleme klasörü yapılandırılmamış - + Checking for changes in remote "%1" Uzak "%1" üzerindeki değişiklikler denetleniyor - + Checking for changes in local "%1" Yerel "%1" üzerindeki değişiklikler denetleniyor - + Syncing %1 of %2 (%3 left) %1 / %2 eşitleniyor (%3 kaldı) - + Syncing %1 of %2 %1 / %2 eşitleniyor - + Syncing %1 (%2 left) %1 eşitleniyor (%2 kaldı) - + Syncing %1 %1 eşitleniyor - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5476,27 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Yeni klasör - + You renamed %1 %1 ögesini yeniden adlandırdınız - + You deleted %1 %1 ögesini sildiniz - + You created %1 %1 ögesini eklediniz - + You changed %1 %1 ögesini değiştirdiniz - + Synced %1 %1 ögesi eşitlendi @@ -5248,30 +5562,106 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Okunmuş olarak işaretle + + ShareDelegate + + + Create a new share link + Yeni bir paylaşım bağlantısı ekle + + + + Copy share link location + Paylaşım bağlantısı konumunu kopyala + + + + Share options + Paylaşım seçenekleri + + + + ShareDetailsPage + + + An error occurred setting the share password. + Paylaşım parolası ayarlanırken bir sorun çıktı + + + + Edit share + Paylaşımı düzenle + + + + Dismiss + Yok say + + + + Share label + Paylaşım etiketi + + + + Allow editing + Düzenlenebilsin + + + + Password protect + Parola koruması + + + + Set expiration date + Son kullanma tarihini ayarla + + + + Note to recipient + Alıcıya not + + + + Unshare + Paylaşımdan kaldır + + + + Add another link + Başka bir bağlantı ekle + + + + Copy share link + Paylaşım bağlantısını kopyala + + ShareView - + Password required for new share Yeni paylaşım için parola gerekli - + Share password Parolayı paylaş - + Sharing is disabled Paylaşım devre dışı - + This item cannot be shared. Bu öge paylaşılamaz. - + Sharing is disabled. Paylaşım devre dışı. @@ -5287,9 +5677,9 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş SyncJournalDb - + Failed to connect database. - Veritabanı bağlantısı kurulamadı. + Veri tabanı bağlantısı kurulamadı. @@ -5345,6 +5735,22 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Diğer sonuçları yükle + + UnifiedSearchResultNothingFound + + + No results for + Şunun için bir sonuç bulunamadı + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + %1 bölümü için arama sonuçları + + UserLine @@ -5408,67 +5814,67 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş UserStatusSelector - + Online status Çevrimiçi durumu - + Online Çevrimiçi - + Away Uzakta - + Do not disturb Rahatsız etmeyin - + Mute all notifications Tüm bildirimleri kapat - + Invisible Görünmez - + Appear offline Çevrimdışı görün - + Status message Durum iletisi - + What is your status? Durumunuz nedir? - + Clear status message after Durum iletisinin kaldırılma süresi - + Cancel İptal - + Clear status message Durum iletisini kaldır - + Set status message Durum iletisini ayarla @@ -5552,24 +5958,24 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Window - + Nextcloud desktop main dialog Nextcloud masaüstü ana penceresi - + Current account Geçerli hesap - - + + Resume sync for all Tümünü eşitlemeyi sürdür - - + + Pause sync for all Tümünü eşitlemeyi duraklat @@ -5579,22 +5985,22 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Kullanıcı durumunu ayarla - + Add account Hesap ekle - + Add new account Hesap ekle - + Settings Ayarlar - + Exit Çık @@ -5603,11 +6009,6 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Current user avatar Geçerli kullanıcı avatarı - - - Current account avatar - Geçerli hesap avatarı - Current user status is online @@ -5619,70 +6020,75 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş Kullanıcının geçerli durumu: Rahatsız etmeyin - + + Current account avatar + Geçerli hesap avatarı + + + Current account status is online Hesabın geçerli durumu: Çevrimiçi - + Current account status is do not disturb Hesabın geçerli durumu: Rahatsız etmeyin - + + %1 - File activity + %1 - Dosya işlemi + + + Account switcher and settings menu Hesap değiştirici ve ayarlar menüsü - + Open local folder of current account Geçerli hesabın yerel klasörünü aç - + Connected Bağlantı kuruldu - + Disconnected Bağlantı kesildi - + Open Nextcloud Talk in browser Web tarayıcıda Nextcloud Talk uygulamasını aç - + More apps Diğer uygulamalar - + Open %1 in browser %1 ögesini tarayıcıda aç - + Unified search results list Birleşik arama sonuçları listesi - - - %1 - File activity - %1 - Dosya işlemi - main.cpp - + System Tray not available Sistem tepsisi kullanılamıyor - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 için çalışan bir sistem tepsisi gerekir. XFCE kullanıyorsanız lütfen <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">bu yönergeleri</a> izleyin. Yoksa "trayer" benzeri bir sistem tepsisi uygulaması kurarak yeniden deneyin. @@ -5690,7 +6096,7 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Git sürümü <a href="%1">%2</a> ile %3 zamanında, %4 Qt %5 kullanılarak, %6 hazırlandı</small></p> @@ -5724,72 +6130,77 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş + Server version downloaded, copied changed local file into case conflict conflict file + Sunucu sürümü indirildi, değiştirilmiş yerel dosya çakışmaya yol açan dosya içine kopyalandı + + + Deleted Silindi - + Moved to %1 %1 konumuna taşındı - + Ignored Yok sayıldı - + Filesystem access error Dosya sistemi erişim sorunu - + Error Hata - + Updated local metadata Yerel üst veri güncellendi - + Unknown Bilinmiyor - + downloading indirilen: - + uploading yüklenen: - + deleting silinen: - + moving taşınan: - + ignoring yok sayılan: - + error sorun - + updating local metadata yerel üst veri güncelleniyor @@ -5931,7 +6342,7 @@ Bu yeni ve deneysel bir özelliktir. Kullanmaya karar verirseniz, lütfen karş share label - paylaşma etiketi + paylaşım etiketi diff --git a/translations/client_uk.ts b/translations/client_uk.ts index 50f659e53..4227a34de 100644 --- a/translations/client_uk.ts +++ b/translations/client_uk.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally Відкрити %1 на пристрої - + In %1 У %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions Показувати більше дій @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss Відхилити + + + Open file details + + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list Список дій @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu Очистити меню статусних повідомлень @@ -134,7 +139,7 @@ Recently changed - Останні зміни + Нещодавні зміни @@ -175,7 +180,7 @@ No recent emojis - Немає останніх емодзі + Ще не було емоційок @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity - + Sharing @@ -226,12 +236,12 @@ Ця платформа не дозволяє переміщення об\'єктів до кошика - + Error removing "%1": %2 Помилка під час вилучення "%1": %2 - + Could not remove folder "%1" Неможливо вилучити каталог "%1" @@ -321,7 +331,7 @@ Неправильний код HTTP, повернутий сервером. Очікується 204, але отримано "%1 %2". - + "%1 Failed to unlock encrypted folder %2". "%1 Не вдалося розблокувати зашифрований каталог %2". @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. Файл %1 вже заблоковано %2. - + Lock operation on %1 failed with error %2 Під час блокування файлу %1 виявлено помилку %2 - + Unlock operation on %1 failed with error %2 Під час розблокування файлу %1 виявлено помилку %2 @@ -353,9 +363,9 @@ - - - + + + Cancel Скасувати @@ -400,12 +410,12 @@ Схоже, що ви увімкнули функціонал віртуальних файлів для цього каталогу. Наразі, явним чином неможливо завантажувати віртуальні файли, які було зашифровано за допомогою наскрізного шифрування. Щоби отримати максимум можливостей від віртуальних файлів та насрізного шифрування, радимо позначити зашифровані каталоги "Зробити завжди доступними на пристрої". - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". @@ -415,29 +425,29 @@ Не шифрувати каталог - + Do not encrypt folder Не шифрувати каталог - + Encrypt folder Шифрувати каталог - + No account configured. Обліковий запис не налаштовано. - - Display mnemonic - Відобразити мнемоніку + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + Відобразити мнемоніку @@ -445,18 +455,23 @@ Увімкнути шифрування - + + End-to-end encryption has been enabled for this account + + + + Warning Увага - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. Ви не можете зашифрувати каталог із вмістом, будь ласка, вилучіть файли. @@ -469,121 +484,121 @@ Wait for the new sync, then encrypt it. Цей обліковий запис підтримує наскрізне шифрування - + Encryption failed Невдале шифрування - + Could not encrypt folder because the folder does not exist anymore Не вдалося зашифрувати каталог, оскільки такий каталог більше не існує - - + + Open folder Відкрити каталог - + Encrypt Шифрувати - - + + Edit Ignored Files Редагувати список ігнорованих файлів - - + + Create new folder Створити новий каталог - - + + Availability Доступність - + Choose what to sync Оберіть, що хочете синхронізувати - + Force sync now Примусово синхронізувати зараз - + Restart sync Перезапустити синхронізацію - + Resume sync Продовжити синхронізацію - + Pause sync Призупинити синхронізацію - + Remove folder sync connection Вилучити синхронізацію для цього каталогу - + Disable virtual file support … Вимкнути підтримку віртуальних файлів - + Enable virtual file support %1 … Увімкнути підтримку віртуальних файлів %1 - + (experimental) (експериментальна функція) - + Folder creation failed Не вдалося створити каталог - + <p>Could not create local folder <i>%1</i>.</p> <p>Неможливо створити каталог на пристрої <i>%1</i>.</p> - + Confirm Folder Sync Connection Removal Підтвердити скасування синхронізації для цього каталогу - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Дійсно зупинити синхронізацію каталогу <i>%1</i>?</p><p><b>Примітка:</b> Це <b>не</b> призведе до вилучення файлів.</p> - + Remove Folder Sync Connection Вилучити синхронізацію для цього каталогу - + Disable virtual file support? Підтвердіть вимкнення підтримки віртуальних файлів. - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -596,7 +611,7 @@ This action will abort any currently running synchronization. Ця дія скасує будь-яку синхронізацію, що зараз виконується. - + Disable support Вимкнути підтримку @@ -606,144 +621,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). - + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? + + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running Виконується синхронізація - + The syncing operation is running.<br/>Do you want to terminate it? Виконується процедура синхронізації.<br/>Бажаєте зупинити? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. Використовується %1 (%3%) з %2. Окремі каталоги, включно з мережевими або спільними, можуть мати інші обмеження. - + %1 of %2 in use Використовується %1 з %2 - + Currently there is no storage usage information available. На даний час немає відомостей про наповнення сховища. - + %1 in use %1 використовується - + %1 as %2 %1 як %2 - + The server version %1 is unsupported! Proceed at your own risk. Версія серверу %1 не підтримується! Продовження операції здійснюватиметься на ваш ризик. - + Connected to %1. Підключено до %1. - + Server %1 is temporarily unavailable. Сервер %1 тимчасово недоступний. - + Server %1 is currently in maintenance mode. Сервер %1 перебуває у режимі обслуговування. - + Signed out from %1. Вийшли з облікового запису %1. - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. Отримання авторизації від переглядача. <a href='%1'>Клацніть тут</a>, щоби повторно відкрити переглядач. - + Connecting to %1 … З'єднання з %1... - + No connection to %1 at %2. Відсутнє з'єднання між %2 та %1. - + Server configuration error: %1 at %2. Помилка у налаштуванні сервера: %1, див. %2. - + No %1 connection configured. Жодного %1 підключення не налаштовано. - + There are folders that were not synchronized because they are too big: Окремі каталоги не було синхронізовано, оскільки їхній розмір завеликий: - + There are folders that were not synchronized because they are external storages: Окремі каталоги не було синхронізовано, оскільки вони розміщені у зовнішніх сховищах: - + There are folders that were not synchronized because they are too big or external storages: Окремі каталоги не було синхронізовано, оскільки їхній розмір завеликий або розміщені у зовнішніх сховищах: - + Confirm Account Removal Підтвердіть вилучення облікового запису - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Дійсно вилучити з'єднання з обліковим записом <i>%1</i>?</p><p><b>Примітка:</b> Це <b>не </b> призведе до вилучення файлів.</p> - + Remove connection Вилучити з'єднання - - + This account supports end-to-end encryption Цей обліковий запис підтримує шифрування end-to-end - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + + + + + There was an invalid response to an authenticated WebDAV request @@ -798,7 +845,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. Для докладного перегляду змін, будь ласка, відкрийте застосунок Події. @@ -808,12 +855,12 @@ This action will abort any currently running synchronization. Отримую діяльності... - + Fetching activities … Отримую діяльності... - + Files from the ignore list as well as symbolic links are not synced. Файли зі списку ігнорування, а також символічні посилання не сихронізуватимуться. @@ -864,32 +911,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. Продовження означатиме <b>вилучення цих налаштувань</b>. - + Continuing will mean <b>ignoring these settings</b>. Продовження означатиме <b>вилучення цих налаштувань</b>. - + 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>. Окремі параметри, які стосуються користувацьких функцій, було сконфігуровано у новішій версії клієнта не доступні для поточної версії.<br><br>%1<br><br>Створено резервну копію поточного файлу конфігурації у <i>%2</i>. - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit Вихід - + Continue Продовжити - + Error accessing the configuration file Помилка доступу до файлу конфігурації @@ -899,12 +973,12 @@ This action will abort any currently running synchronization. Помилка з доступом до файлу налаштувань %1. Будь ласка, перевірте чи файл буде доступний для вашого користувача. - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. Виявлено помилку під час отримання доступу до файлу конфігурації у %1. Будь ласка, пересвідчитеся, що присутній доступ до файлу у системного облікового запису. - + Quit %1 Вийти %1 @@ -950,56 +1024,216 @@ This action will abort any currently running synchronization. Файл %1 має некоректний час модифікації. Не завантажуйте його на сервер. - + File Removed (start upload) %1 Файл вилучено (почато завантаження) %1 - + File %1 has invalid modification time. Do not upload to the server. Файл %1 має некоректний час модифікації. Не завантажуйте його на сервер. - + Local file changed during syncing. It will be resumed. Файл на комп'ютері змінено під час синхронізації. Його буде відновлено. - - + + Local file changed during sync. Файл на комп'ютері змінено під час синхронізації. - + Network error: %1 Помилка мережі: %1 - + Error updating metadata: %1 Помилка під час оновлення метаданих: %1 - + The file %1 is currently in use Файл %1 зараз у використанні - + The local file was removed during sync. Файл на комп'ютері вилучено під час синхронізації. - + Restoration failed: %1 Відновлення не вдалося: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database Помилка із записом метаданих до бази даних @@ -1017,12 +1251,12 @@ This action will abort any currently running synchronization. Будь ласка, зазначте пароль для наскрізного шифрування:<br><br>Користувач: %2<br>Обліковий запис: %3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase Зазначте пароль для наскрізного шифрування @@ -1038,7 +1272,7 @@ This action will abort any currently running synchronization. Conflicting versions of %1. - Конфліктуючі версії %1. + Конфліктні версії %1. @@ -1076,7 +1310,7 @@ This action will abort any currently running synchronization. Server version - Server version + Версія у хмарі @@ -1112,7 +1346,7 @@ This action will abort any currently running synchronization. Keep server version - Зберегти серверну версію + Зберегти версію у хмарі @@ -1198,8 +1432,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! Помилка серверу: PROPFIND reply is not XML formatted! @@ -1207,27 +1441,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 Помилка під час відкриття каталогу %1 - + Directory not accessible on client, permission denied Каталог недоступний на клієнті - доступ заборонено. - + Directory not found: %1 Каталог не знайдено: %1 - + Filename encoding is not valid Некоректне кодування назви файлу - + Error while reading directory %1 Помилка під час читання каталогу %1 @@ -1235,83 +1469,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. - + Invalid file path was provided. - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1319,7 +1553,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. Не вдалося створити метадані для шифрування, розблокування каталогу. @@ -1449,145 +1683,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. Каталог %1 на пристрої відсутній. - + %1 should be a folder but is not. %1 має бути каталогом, але не є таким. - + %1 is not readable. %1 не читається. - + %1 and %n other file(s) have been removed. %1 та ще %n файл було вилучено.%1 та ще %n файли було вилучено.%1 та ще %n файлів було вилучено.%1 та ще %n файлів було вилучено. - + %1 has been removed. %1 names a file. %1 вилучено. - + %1 and %n other file(s) have been added. %1 файл було додано%1 та %n інші файли було додано%1 та %n інших файлів було додано%1 та %n інших файлів було додано - + %1 has been added. %1 names a file. %1 додано. - + %1 and %n other file(s) have been updated. %1 та ще %n файл було оновлено.%1 та ще %n файли було оновлено.%1 та ще %n файлів було оновлено.%1 та ще %n файлів було оновлено. - + %1 has been updated. %1 names a file. %1 оновлено. - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 було перейменовано на %2 та ще %n інший файл було перейменовано.%1 було перейменовано на %2 та ще %n інших файли було перейменовано.%1 було перейменовано на %2 та ще %n інших файлів було перейменовано.%1 було перейменовано на %2 та ще %n інших файлів було перейменовано. - + %1 has been renamed to %2. %1 and %2 name files. %1 перейменовано на %2 - + %1 has been moved to %2 and %n other file(s) have been moved. %1 було переміщено до %2 та ще %n інший файл було переміщено.%1 було переміщено до %2 та ще %n інших файли було переміщено.%1 було переміщено до %2 та ще %n інших файлів було переміщено.%1 було переміщено до %2 та ще %n інших файлів було переміщено. - + %1 has been moved to %2. %1 переміщено в %2. - + %1 has and %n other file(s) have sync conflicts. %1 та ще %n файл мають конфлікт синхронізації.%1 та ще %n файли мають конфлікт синхронізації.%1 та ще %n файлів мають конфлікт синхронізації.%1 та ще %n файлів мають конфлікт синхронізації. - + %1 has a sync conflict. Please check the conflict file! %1 має конфлікт синхронізації. Будь ласка, перевірте цей файл! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 та ще %n файл неможливо синхронізувати через помилки. Дивіться журнал для докладної інформації.%1 та ще %n файли неможливо синхронізувати через помилки. Дивіться журнал для докладної інформації.%1 та ще %n файлів неможливо синхронізувати через помилки. Дивіться журнал для докладної інформації.%1 та ще %n файлів неможливо синхронізувати через помилки. Дивіться журнал для докладної інформації. - + %1 could not be synced due to an error. See the log for details. %1 не може синхронізуватися через помилки. Дивіться деталі в журналі. - + %1 and %n other file(s) are currently locked. %1 та ще %n файл зараз заблоковано.%1 та ще %n файли зараз заблоковано.%1 та ще %n файлів зараз заблоковано.%1 та ще %n файлів зараз заблоковано. - + %1 is currently locked. %1 зараз заблоковано. - + Sync Activity Журнал синхронізації - + Could not read system exclude file Неможливо прочитати виключений системний файл - + A new folder larger than %1 MB has been added: %2. Додано новий каталог, обсяг якого більше %1 МБ: %2. - + A folder from an external storage has been added. Додано каталог із зовнішнього сховища - + Please go in the settings to select it if you wish to download it. Будь ласка, перейдіть у налаштуваннях, щоб вибрати її для подальшого звантаження. - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. Каталог %1 створено, але його раніше було виключено з синхронізації. Дані всередині цього каталогу не буде синхронізовано. - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. Файл %1 було створено, але раніше виключено з синхронізації. Цей файл не буде синхронізовано. - + 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). @@ -1600,7 +1834,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a Якщо ви вирішите вилучити ці файли, вони будуть недоступні вам, якщо ви не є їхнім власником. - + 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. @@ -1620,17 +1854,17 @@ If this was an accident and you decide to keep your files, they will be re-synce Якщо ви це зробили помилково та бажаєте зберегти ваші файли, їх буде повторно синхронізовано з хмари. - + Remove All Files? Вилучити усі файли? - + Remove all files Вилучити усі файли - + Keep files Зберегти файли @@ -1666,22 +1900,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state Не вдалося скинути стан каталогу - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. Знайдено застарійлий журнал синхронізації "%1", проте неможливо його вилучити. Пересвідчитеся, що жодний із застосунків його не використовує зараз. - + (backup) (Резервна копія) - + (backup %1) (Резервна копія %1) @@ -1691,27 +1925,27 @@ If this was an accident and you decide to keep your files, they will be re-synce Невизначений стан. - + Undefined state. Невизначений стан. - + Waiting to start syncing. Очікування початку синхронізації. - + Preparing for sync. Підготовка до синхронізації - + Sync is running. Синхронізація запущена. - + Sync finished with unresolved conflicts. Синхронізацію завершено з нерозв'язаними конфліктами. @@ -1731,62 +1965,62 @@ If this was an accident and you decide to keep your files, they will be re-synce Скасовано користувачем. - + Last sync was successful. Остання синхронізація завершилась успішно. - + Setup error. Помилка установлення. - + Sync request was cancelled. Запит на синхронізацію скасовано. - + Sync is paused. Синхронізація призупинена. - + %1 (Sync is paused) %1 (Синхронізація призупинена) - + No valid folder selected! Не вибрано прийнятного каталогу! - + The selected path does not exist! Вибраний шлях не існує! - + The selected path is not a folder! Вибраний шлях не є каталогом! - + You have no permission to write to the selected folder! У вас немає прав на запис до цього каталогу! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! Каталог %1 на пристрої вже містить каталог, який використовується для синхронізації каталогів. Будь ласка, виберіть інший каталог! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! Каталог %1 на пристрої вже присутній у каталозі, який використовується для синхронізації каталогів. Будь ласка, виберіть інший каталог! - + There is already a sync from the server to this local folder. Please pick another local folder! Синхронізацію між хмарою та каталогом на пристрої вже встановлено. Будь ласка, виберіть інший каталог! @@ -1799,7 +2033,7 @@ If this was an accident and you decide to keep your files, they will be re-synce Додати з'єднання для синхронізації каталогу - + File Файл @@ -1807,152 +2041,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder Ви маєте мати з'єднання з мережею, щоб додати каталог - + Click this button to add a folder to synchronize. Клацніть на цю кнопку, щоб додати каталог до синхронізації. - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. Помилка під час завантаження списку каталогів з сервера. - + Fetching folder list from server … Отримання списку каталогів з сервера... - + There are unresolved conflicts. Click for details. Наявні нерозв'язані конфлікти. Клацніть для докладної інформації. - + Virtual file support is enabled. Підтримку віртуальних файлів увімкнено. - + Signed out Вийшов - + Synchronizing VirtualFiles with local folder Синхронізація віртуальних файлів з каталогом на пристрої. - + Synchronizing with local folder Синхронізація з каталогом на пристрої - + Checking for changes in remote "%1" Перевірка наявності змін віддалено "%1" - + Checking for changes in local "%1" Перевірка наявності змін на пристрої "%1" - + Reconciling changes Узгодження змін - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" Синхронізація %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) завантаження %1/с - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) вивантаження %1/с - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2 (%3 of %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" Залишилося кілька секунд, %1 із %2, файл %3 із %4 - + %5 left, %1 of %2, file %3 of %4 %5 лишилося, %1 з %2, файл %3 з %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 з %2, файл %3 з %4 - + file %1 of %2 файл %1 з %2 - + Waiting … Очікується... - + Waiting for %n other folder(s) … Очікуються %n інший каталогОчікуються %n інші каталогиОчікуються %n інших каталогівОчікуються %n інших каталогів - + Preparing to sync … Підготовка до синхронізації... @@ -2183,13 +2421,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable Стабільний - + beta Бета-версія @@ -2241,32 +2479,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive Створити архів зневадження - + Server notifications that require attention. Сповіщення сервера, на які треба звернути увагу. - + Show call notification dialogs. Показати діалог сповіщень викликів - + You cannot disable autostart because system-wide autostart is enabled. Неможливо вимкнути автостарт, оскільки увімкнено автоматичний запуск на рівні системи. - + Change update channel? Чи змінити канал оновлень? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar Зауважте, що таким чином ви виберете набір оновлень, які буде застосовувано, і що неможливо буде повернутися до попередніх версій. Відтак повернення з "бета" до "стабільного" каналу зазвичай неможливо буде виконати одразу, натомість ви матимете зачекати на нову стабільну версію порівняно зі встановленою бета-версією. - + Change update channel Змінити оновлення каналу - + Cancel Скасувати - + Zip Archives Zip-архіви - + Debug Archive Created Архів зневадження створено - + Debug archive is created at %1 Архів зневадження створено у %1 @@ -2303,22 +2541,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required Потрібний пароль на спільний ресурс - + Please enter a password for your link share: Будь ласка, зазначте пароль на спільний ресурс - + Sharing error Помилка під час надання доступу - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close Закрити + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 Використовувати &віртуальні файли замість безпосереднього звантаження вмісту %1 - + (experimental) (експериментально) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Віртуальні файли не підтримуються для кореневих розділів у Windows у вигляді каталогів на пристрої. Будь ласка, виберіть дійсний підкаталог на диску. - + %1 folder "%2" is synced to local folder "%3" %1 каталог "%2" синхронізовано з каталогом на пристрої "%3" - + Sync the folder "%1" Синхронізувати каталог "%1" - + Warning: The local folder is not empty. Pick a resolution! Увага: Каталог на пристрої не є порожнім. Прийміть рішення! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 вільного місця - + Virtual files are not available for the selected folder Віртуальні файли не доступні для вибраного каталогу - + Local Sync Folder Каталог на пристрої для синхронізації - - + + (%1) (%1) - + There isn't enough free space in the local folder! Недостатньо вільного місця у каталозі на пристрої! @@ -3016,7 +3259,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 Неможливо отримати час зміни конфліктуючого файлу %1 @@ -3048,144 +3292,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">Успішно підключено до %1: %2 версія %3 (%4)</font><br/><br/> - + Invalid URL Невірний URL - + Failed to connect to %1 at %2:<br/>%3 Не вдалося з'єднатися з %1 в %2:<br/>%3 - + Timeout while trying to connect to %1 at %2. Перевищено час очікування з'єднання до %1 на %2. - + Trying to connect to %1 at %2 … З'єднання з %1 через %2... - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. Авторизований запит до сервера переспрямовано на "%1". Або URL неправильний, або помилка у конфігурації сервера. - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. Доступ заборонений сервером. Щоб довести, що у Вас є права доступу, <a href="%1">клікніть тут</a> для входу через Ваш браузер. - + There was an invalid response to an authenticated WebDAV request Отримано неправильну відповідь на запит авторизації WebDAV. - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> Каталог на пристрої для синхронізації %1 вже існує, налаштовуємо для синхронізації.<br/><br/> - + Creating local sync folder %1 … Створення каталогу на пристрої для синхронізації %1... - + OK Гаразд - + failed. не вдалося. - + Could not create local folder %1 Не вдалося створити каталог на вашому пристрої $1 - + No remote folder specified! Не зазначено віддалений каталог! - + Error: %1 Помилка: %1 - + creating folder on Nextcloud: %1 створення каталогу у хмарі на Nextcloud: %1 - + Remote folder %1 created successfully. Віддалений каталог %1 успішно створено. - + The remote folder %1 already exists. Connecting it for syncing. Віддалений каталог %1 вже існує. Під'єднання каталогу для синхронізації. - - + + The folder creation resulted in HTTP error code %1 Створення каталогу завершилось помилкою HTTP %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> Не вдалося створити віддалений каталог через направильно зазначені облікові дані.<br/>Поверніться назад та перевірте ваші облікові дані.</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">Створити віддалений каталог не вдалося, можливо, через неправильно зазначені облікові дані.</font><br/>Будь ласка, поверніться назад та перевірте облікові дані.</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. Не вдалося створити віддалений каталог %1 через помилку <tt>%2</tt>. - + A sync connection from %1 to remote directory %2 was set up. З'єднання для синхронізації %1 з віддаленим каталогом %2 встановлено. - + Successfully connected to %1! Успішно під'єднано до %1! - + Connection to %1 could not be established. Please check again. Підключення до %1 встановити не вдалося. Будь ласка, перевірте ще раз. - + Folder rename failed Не вдалося перейменувати каталог - + Cannot 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. Неможливо вилучити та створити резервну копію каталогу, оскільки такий каталог або файл відкрито в іншій програмі. Будь ласка, закрийте каталог або файл та спробуйте ще раз або скасуйте встановлення. - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>Каталог синхронізації %1 на пристрої успішно створено!</b></font> @@ -3208,12 +3452,12 @@ Note that using any logging command line options will override this setting.Скасувати - + Enable experimental feature? Чи увімкнути експериментальні функції? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Це новий експериментальний режим. Якщо ви будете його використовувати, будь ласка, повідомте про всі проблеми, з якими ви можете стикнутися. - + Enable experimental placeholder mode Увімкнути експериментальний режим заповнення - + Stay safe Залишайтеся в безпеці @@ -3264,162 +3508,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. Символічні посилання не підтримуються під час синхронізації. - + File is listed on the ignore list. Файл присутній у списку ігнорування. - + File names ending with a period are not supported on this file system. Імена файлів, що закінчуються на крапку, не підтримуються файловою системою. - + File names containing the character "%1" are not supported on this file system. Імена файлів, що містять символ "%1" не підтримуються файловою системою. - + File name contains at least one invalid character Ім'я файлу містить щонайменше один неправильний символ - + The file name is a reserved name on this file system. Таке ім'я файлу є зарезервованим ім'ям у файловій системі. - + Filename contains trailing spaces. Ім'я файлу містить пробіли наприкінці назви. - + Filename contains leading spaces. Ім'я файлу містить пробіли на початку назви. - + Filename contains leading and trailing spaces. Ім'я файлу містить пробіли на початку та наприкінці назви. - + Filename is too long. Ім'я файлу завелике - + File/Folder is ignored because it's hidden. Файл чи каталог проігноровано, оскільки він є прихований. - + Stat failed. - + Conflict: Server version downloaded, local copy renamed and not uploaded. Конфлікт: Звантажено версію з хмари, копію на пристрої перейменовано і не завантажено. - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. Неможливо зашифрувати ім'я файлу у вашій файловій системі. - + The filename is blacklisted on the server. Таке ім'я файлу внесено до чорного списку на сервері. - + File has extension reserved for virtual files. Файл має розширення, зарезервоване для віртуальних файлів. - + size розмір - + permission дозвіл - + file id ID файлу - + Server reported no %1 Cервер відповів, що немає %1 - + Cannot sync due to invalid modification time Неможливо виконати синхронізацію через неправильний час модифікації - + Error while deleting file record %1 from the database Помилка під час вилучення запису файлу %1 з бази даних - + Conflict when uploading a folder. It's going to get cleared! Виявлено конфлікт під час завантаження каталогу. Конфліктний каталог буде вилучено! - + Conflict when uploading a file. It's going to get removed! Виявлено конфлікт під час завантаження файлу. Конфліктний файл буде вилучено! - + Ignored because of the "choose what to sync" blacklist Проігноровано, оскільки те, що вибрано для синхронізації, міститься у чорному списку - + Not allowed because you don't have permission to add subfolders to that folder Не дозволено, оскільки ви не маєте повноважень додавати підкаталоги до цього каталогу - + Not allowed because you don't have permission to add files in that folder Не дозволено, оскільки ви не маєте повноважень додавати файли до цього каталогу - + Not allowed to upload this file because it is read-only on the server, restoring Не дозволено завантажити цей файл, оскільки він має ознаку у хмарі лише для читання, файл буде відновлено - + Moved to invalid target, restoring Пересунено до недійсного призначення, буде відновлено - + Not allowed to remove, restoring Не дозволено вилучати, буде відновлено - + Error while reading the database Помилка під час зчитування бази даних - + Server replied with an error while reading directory "%1" : %2 Відповідь сервера з помилкою під час зчитування каталогу "%1": %2 @@ -3427,22 +3676,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB неможливо вилучити файл %1 з локальною БД - + Error updating metadata due to invalid modification time Помилка при завантаженні метаданих через неправильні зміни часу - + Error updating metadata: %1 Помилка під час оновлення метаданих: %1 - + File is currently in use Файл зараз використовується @@ -3455,19 +3704,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss неможливо отримати файл %1 з локальної БД - + File %1 cannot be downloaded because encryption information is missing. Неможливо звантажити файл %1, оскільки відсутнє шифрування інформації. - - + + File has changed since discovery Файл було змінено вже після пошуку - + Could not delete file record %1 from local DB Неможливо вилучити запис файлу %1 з локальної БД @@ -3478,32 +3727,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss Неможливо звантажити файл %1 через конфлікт з назвою файлу на вашому пристрої - + File %1 can not be downloaded because of a local file name clash! Файл %1 не може бути завантажено через конфлікт назви файлу на пристрої! - + The download would reduce free local disk space below the limit Це звантаження зменшить розмір вільного місця на локальному диску нижче встановленого обмеження. - + Free space on disk is less than %1 На диску залишилося менше %1 - + File was deleted from server Файл вилучено з сервера - + The file could not be downloaded completely. - Файл не може бути завантажений повністю. + Неможливо повністю звантажити цей файл. - + The downloaded file is empty, but the server said it should have been %1. Файл, що завантажується, порожній, але сервер говорить, що він має бути %1. @@ -3513,18 +3762,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Файл %1 не збережено через конфлікт назви файлу на пристрої! - - + + File %1 has invalid modified time reported by server. Do not save it. Сервер визначив, що файл %1 має неправильний час зміни. Не зберігайте його. - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 Помилка під час оновлення метаданих: %1 - + The file %1 is currently in use Файл %1 зараз використовується @@ -3545,7 +3799,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 неможливо вилучити файл %1, помилка: %2 @@ -3556,16 +3810,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 Неможливо створити каталог %1 - + Error updating metadata: %1 Помилка під час оновлення метаданих: %1 - + The file %1 is currently in use Файл %1 зараз використовується @@ -3573,7 +3832,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash Неможливо вилучити %1 через конфлікт назви файлу на пристрої @@ -3586,46 +3845,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash Файл %1 неможливо перейменувати у %2 через конфлікт з назвою файлу на пристрої - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB неможливо отримати файл %1 з локальної БД - + Error setting pin state Помилка у встановленні стану PIN - - + + Error updating metadata: %1 Помилка під час оновлення метаданих: %1 - + The file %1 is currently in use Файл %1 зараз використовується - - + + Could not delete file record %1 from local DB Неможливо вилучити запис файлу %1 з локальної БД - + Failed to propagate directory rename in hierarchy - + Failed to rename file Помилка при перейменуванні файлу @@ -3646,7 +3910,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". Сервер повернув неправильний код HTTP. Очікувалося 204, але отримано "%1 %2". @@ -3659,12 +3923,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Сервер відповів неправильним HTTP кодом. Очікувався 201, але отримано "%1 %2". - + Error writing metadata to the database: %1 Помилка під час запису метаданих до бази даних: %1 - + The file %1 is currently in use Файл %1 зараз використовується @@ -3672,42 +3936,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 Неможливо перейменувати %1 у %2, помилка: %3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". Сервер відповів неправильним HTTP кодом. Очікувався 201, але отримано "%1 %2". - + could not get file %1 from local DB неможливо отримати файл %1 з локальної БД - + Could not delete file record %1 from local DB Неможливо вилучити запис файлу %1 з локальної БД - + Error updating metadata: %1 Помилка під час оновлення метаданих: %1 - + The file %1 is currently in use Файл %1 зараз використовується - + Error setting pin state Помилка у встановленні стану PIN - + Error writing metadata to the database Помилка із записом метаданих до бази даних @@ -3897,7 +4161,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply Відповідь @@ -3915,23 +4179,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss Налаштування - + %1 Settings This name refers to the application name e.g Nextcloud Налаштування %1 - + General Загалом - + Network Мережа - + Account Обліковий запис @@ -3939,17 +4203,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4025,7 +4294,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4034,132 +4303,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share Контекстне меню спільного доступу - + Select new location … Виберіть нове розташування... - + I shared something with you Я чимось поділив(ла)ся з вами - - + + Share options Поділитися - - + + Activity Дія - + Copy private link to clipboard Копіювати приватне посилання - + Send private link by email … Надіслати приватне посилання електронною поштою + + + Expire in %1 minutes + remaining time before lock expire + Термін дії спливає за %1 хвилинуТермін дії спливає за %1 хвилиниТермін дії спливає за %1 хвилинТермін дії спливає за %1 хвилин + - + Leave this share - + Resharing this file is not allowed Надання цього файлу у спільний доступ іншим не дозволено - + Resharing this folder is not allowed Повторне надання доступу до цього каталого заборонено - - + + Copy public link Копіювати публічне посилання - + Copy internal link Копіювати посилання - + + Encrypt + + + + Lock file Заблокувати файл - + Unlock file Розблокувати файл - + Locked by %1 Заблоковано %1 - - Expire in %1 minutes - remaining time before lock expire - Термін дії спливає за %1 хвилинуТермін дії спливає за %1 хвилиниТермін дії спливає за %1 хвилинТермін дії спливає за %1 хвилин - - - + Expires in %1 minutes remaining time before lock expires Спливає за %1 хвилинуСпливає за %1 хвилиниСпливає за %1 хвилинСпливає за %1 хвилин - + Edit Редагувати - + Open in browser Відкрити у бравзері - + Resolve conflict … Вирішити конфлікт... - + Move and rename … Перемістити та перейменувати... - + Move, rename and upload … Перемістити, перейменувати та завантажити... - + Delete local changes Вилучити зміни на пристрої - + Move and upload … Перемістити та завантажити - + Delete Вилучити @@ -4377,63 +4683,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (пропущено через попередню помилку, повторна спроба через %2) - + Could not update file: %1 Неможливо оновити файл: %1 - + Could not update virtual file metadata: %1 Неможливо оновити метадані віртуального файлу: %1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 Неможливо встановити запис файлу до локальної БД: %1 - + Unresolved conflict. Конфлікт, який неможна вирішити - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() Доступно лише %1, для початку необхідно хоча б %2 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. Неможливо відкрити або створити локальну синхронізовану базу даних. Перевірте, що ви маєте доступ на запис у каталозі синхронізації. - + Using virtual files with suffix, but suffix is not set Використання віртуальних файлів з суфіксом, але суфікс не встановлено - + Unable to read the blacklist from the local database Неможливо прочитати чорний список з локальної бази даних - + Unable to read from the sync journal. Неможливо прочитати з журналу синхронізації. - + Cannot open the sync journal Не вдається відкрити протокол синхронізації @@ -4443,12 +4749,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss Синхронізацію буде невдовзі відновлено. - + Disk space is low: Downloads that would reduce free space below %1 were skipped. Закінчується місце на диску. Звантаження, які можуть зменшити вільне місце до 1% буде пропущено. - + There is insufficient space available on the server for some uploads. Недостатньо місця на сервері для окремих завантажень. @@ -4517,59 +4823,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download Звантажити - + Add account Додати обліковий запис - + Open main dialog Відкрити основне вікно діалогу - - + + Pause sync Пауза синхронізації - - + + Resume sync Продовжити синхронізацію - + Settings Налаштування - + Help Допомога - + Exit %1 Вийти %1 - + Pause sync for all Призупинити синхронізацію для всіх - + Resume sync for all Продовжити синхронізацію для всіх - + %1: %2 %1: %2 @@ -4577,24 +4883,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 клієнт для робочої істанції</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> </p>Версія %1. Докладно дивіться <a href='%2'>тут</a>.</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>Використання плаґіну віртуальних файлів: %1</small></p> - + <p>This release was supplied by %1</p> <p>Цю збірку поставлено %1</p> @@ -4602,22 +4908,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. Не вдалося отримати провайдерів. - + Failed to fetch search providers for '%1'. Error: %2 Не вдалося отримати провайдерів пошуку для "%1". Помилка: %2 - + Search has failed for '%2'. Пошук не вдався для "%2". - + Search has failed for '%1'. Error: %2 Пошук не вдався для "%1". Помилка: %2 @@ -4625,30 +4931,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads Првторити усі завантаження + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal Підтвердіть вилучення облікового запису - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>Дійсно вилучити з'єднання з обліковим записом <i>%1</i>?</p><p><b>Примітка:</b> Це <b>не </b> призведе до вилучення файлів.</p> - + Remove connection Вилучити з'єднання - + Cancel Скасувати @@ -4786,8 +5098,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time Помилка з оновленням метаданих через неправильний час змін. @@ -4795,8 +5107,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time Помилка з оновленням метаданих через неправильний час змін. @@ -4894,123 +5206,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version Ця версія сервера не підтримується - + 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. Сервер облікового запису %1 має версію %2, яка не підтримується. Використання цього клієнта з версією сервера, яка не підтримується, не протестовано та може принести шкоду. Продовжуйте на власний ризик. - + Disconnected Від'єднаний - + Disconnected from some accounts Від - + Disconnected from %1 Від'єднано від %1 - + Disconnected from accounts: Від'єднано від облікових записів: - + Account %1: %2 Обліковий запис %1: %2 - + Please sign in Увійдіть будь ласка - + Signed out Вийшов - + Account synchronization is disabled Синхронізацію облікового запису вимкнено - - + + Synchronization is paused Синхронізація на паузі - + Folder %1: %2 Каталог %1: %2 - + Unresolved conflicts Нерозв'язані конфлікти - + Up to date Оновлено - + Error during synchronization Помилка під час синхронізації - + There are no sync folders configured. Відсутні налаштовані каталоги синхронізації. - + No sync folders configured Каталог(и) для синхронізації не налаштовано - + Checking for changes in remote "%1" Перевірка на зміни віддалено "%1" - + Checking for changes in local "%1" Перевірка на зміни на пристрої "%1" - + Syncing %1 of %2 (%3 left) Сихнронізація %1 з %2 (лишилося: %3) - + Syncing %1 of %2 Сихнронізація %1 з %2 - + Syncing %1 (%2 left) Синхронізовано %1 (залишилося %2) - + Syncing %1 Сихнронізація %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5162,27 +5474,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss Новий каталог - + You renamed %1 Ви перейменували %1 - + You deleted %1 Ви вилучили %1 - + You created %1 Ви створили %1 - + You changed %1 Ви змінили %1 - + Synced %1 Синхронізовано %1 @@ -5248,30 +5560,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss Позначити як прочитане + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5287,7 +5675,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. Не вдалося приєднатися до бази даних @@ -5345,6 +5733,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Показати ще + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5408,67 +5812,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status Статус в мережі - + Online У мережі - + Away Відійшов - + Do not disturb Не турбувати - + Mute all notifications Без сповіщень - + Invisible Невидимий - + Appear offline Схоже поза мережею - + Status message Статусне повідомлення - + What is your status? Який у вас статус? - + Clear status message after Очистити статусне повідомлення після - + Cancel Скасувати - + Clear status message Очистити статусне повідомлення - + Set status message Встановити статусне повідомлення @@ -5552,24 +5956,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Основний інтерфейс десктопного клієнта Nextcloud - + Current account Поточний обліковий запис - - + + Resume sync for all Продовжити синхронізацію для всіх - - + + Pause sync for all Призупинити синхронізацію для всіх @@ -5579,22 +5983,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss Встановити статус користувача - + Add account Додати обліковий запис - + Add new account Додати новий обліковий запис - + Settings Налаштування - + Exit Вийти @@ -5603,11 +6007,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar Поточна аватарка користувача - - - Current account avatar - Поточна аватарка облікового запису - Current user status is online @@ -5619,70 +6018,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss Поточний статус користувача: не турбувати - + + Current account avatar + Поточна аватарка облікового запису + + + Current account status is online Поточний статус облікового запису: у мережі - + Current account status is do not disturb Поточний статус облікового запису: не турбувати - + + %1 - File activity + %1 - дії з файлом + + + Account switcher and settings menu Перемикання обліковок та меню налаштування - + Open local folder of current account Відкрити каталог на пристрої для поточного облікового запису - + Connected З'єднаний - + Disconnected Від'єднаний - + Open Nextcloud Talk in browser Відкрити Nextcloud Talk у бравзері - + More apps Більше застосунків - + Open %1 in browser Відкрити %1 в браузері - + Unified search results list Список результатів універсального пошуку - - - %1 - File activity - %1 - дії з файлом - main.cpp - + System Tray not available Системний лоток недоступний - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 має бути присутній у треї операційної системи. Якщо ви маєте XFCE, будь ласка, виконайте <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">ці інструкції</a>. В іншому випадку, встановіть застосунок системного трею, напр., "trayer" та спробуйте ще раз. @@ -5690,7 +6094,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>Побудовано з ревізії Git<a href="%1">%2</a> на %3, %4 з використанням Qt %5, %6</small></p> @@ -5724,72 +6128,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted Вилучено - + Moved to %1 Переміщено до %1 - + Ignored Проігноровано - + Filesystem access error Помилка доступу до файлової системи - + Error Помилка - + Updated local metadata Оновлено метадані на пристрої - + Unknown Невідомо - + downloading зкачування - + uploading завантаження - + deleting вилучення - + moving переміщення - + ignoring ігнорування - + error помилка - + updating local metadata оновлення метаданих на пристрої diff --git a/translations/client_zh_CN.ts b/translations/client_zh_CN.ts index 30bb1f7a3..a0c6e25e0 100644 --- a/translations/client_zh_CN.ts +++ b/translations/client_zh_CN.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally 在本地打开 %1 - + In %1 在 %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions 显示更多操作 @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss 忽略 + + + Open file details + 打开文件的详细信息 + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list 动态列表 @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu @@ -75,7 +80,7 @@ Decline Talk call notification - + 拒绝通话通知 @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + + + + Activity 动态 - + Sharing 共享 @@ -226,12 +236,12 @@ 当前平台尚未支持移动到回收站的功能 - + Error removing "%1": %2 删除 "%1" 出错:%2 - + Could not remove folder "%1" 无法删除文件夹 "%1" @@ -321,7 +331,7 @@ 服务器返回了错误的 HTTP 代码。预期的是 204,但接收到的是 "%1 %2"。 - + "%1 Failed to unlock encrypted folder %2". "%1 未能解锁加密的文件夹 %2"。 @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. - + Lock operation on %1 failed with error %2 - + Unlock operation on %1 failed with error %2 @@ -353,9 +363,9 @@ - - - + + + Cancel 取消 @@ -397,17 +407,17 @@ You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are End-to-End encrypted. To get the best experience with Virtual Files and End-to-End Encryption, make sure the encrypted folder is marked with "Make always available locally". - 您似乎在此文件夹上启用了虚拟文件功能。目前,不可能隐式下载端到端加密的虚拟文件。为了获得虚拟文件和端到端加密的最佳体验,请确保加密文件夹被标记为“始终在本地可用”。 + 你似乎在这个文件夹上启用了虚拟文件功能。目前,不可能隐含下载端到端加密的虚拟文件。为了获得虚拟文件和端到端加密的最佳体验,请确保加密的文件夹被标记为 "始终在本地可用"。 - + End-to-end Encryption with Virtual Files - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". - + 你似乎在这个文件夹上启用了虚拟文件功能。目前,不可能隐含下载端到端加密的虚拟文件。为了获得虚拟文件和端到端加密的最佳体验,请确保加密的文件夹被标记为 "始终在本地可用"。 @@ -415,29 +425,29 @@ 不加密文件夹 - + Do not encrypt folder 不要加密文件夹 - + Encrypt folder 加密文件夹 - + No account configured. 没有配置账号。 - - Display mnemonic - 显示助记符 + + Disable encryption + - End-to-end encryption has been enabled for this account - + Display mnemonic + 显示助记符 @@ -445,18 +455,24 @@ 启用加密 - + + End-to-end encryption has been enabled for this account + + + + Warning 警告 - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? - + 该设备上没有配置端对端加密。一旦配置好了,你就可以对这个文件夹进行加密。 +你想设置端到端加密吗? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. 您无法使用内容加密文件夹,请删除文件。 @@ -469,121 +485,121 @@ Wait for the new sync, then encrypt it. - + Encryption failed 加密失败了 - + Could not encrypt folder because the folder does not exist anymore 无法加密文件夹,因为文件夹不再存在 - - + + Open folder 打开文件夹 - + Encrypt 加密 - - + + Edit Ignored Files 编辑已忽略的文件 - - + + Create new folder 创建新文件夹 - - + + Availability 可用性 - + Choose what to sync 选择同步内容 - + Force sync now 立即强制同步 - + Restart sync 重启同步 - + Resume sync 恢复同步 - + Pause sync 暂停同步 - + Remove folder sync connection 移除文件夹同步连接 - + Disable virtual file support … 禁用虚拟文件支持 ... - + Enable virtual file support %1 … 启用虚拟文件支持 %1 … - + (experimental) (实验性) - + Folder creation failed 文件夹创建失败 - + <p>Could not create local folder <i>%1</i>.</p> <p>无法新建本地文件夹 <i>%1</i>。</p> - + Confirm Folder Sync Connection Removal 确定移除文件夹同步连接 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您确定要停止文件夹<i>%1</i>同步?</p><p><b>注意:</b> 这 <b>不会</b> 删除任何文件。</p> - + Remove Folder Sync Connection 移除文件夹同步连接 - + Disable virtual file support? 禁用虚拟文件支持? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -592,7 +608,7 @@ This action will abort any currently running synchronization. 此操作将禁用虚拟文件支持。因此,当前标记为“仅在线可用”的文件夹的内容将被下载。禁用虚拟文件支持的唯一好处是选择性同步特性将再次可用。此操作将终止任何当前正在运行的同步。 - + Disable support 禁用支持 @@ -602,144 +618,176 @@ This action will abort any currently running synchronization. - + End-to-end encryption mnemonic - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). + 为了保护您的加密身份,我们用 12 个字典中的助记词对其进行加密。请记下这些并妥善保管。在向您的账户添加其他设备(如您的手机或笔记本电脑)时将需要它们。 + + + + Disable end-to-end encryption + + + + + Disable end-to-end encryption for %1? - + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + + + + Sync Running 正在同步 - + The syncing operation is running.<br/>Do you want to terminate it? 同步操作正在进行。<br/>您确定要停止吗? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) of %2 使用中。一些文件夹,例如网络挂载的和共享的文件夹,可能有不同的限制。 - + %1 of %2 in use 使用量 %1 / %2 - + Currently there is no storage usage information available. 目前没有储存使用量信息可用。 - + %1 in use 已使用 %1 - + %1 as %2 %1 作为 %2 - + The server version %1 is unsupported! Proceed at your own risk. 服务器版本 %1 不受支持!继续操作,风险自担。 - + Connected to %1. 已连接到 %1。 - + Server %1 is temporarily unavailable. 服务器 %1 暂时不可用。 - + Server %1 is currently in maintenance mode. 服务器 %1 目前正在维护。 - + Signed out from %1. 从 %1 登出。 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. 正在从浏览器获得授权。 <a href='%1'>点击此处</a> 重新打开浏览器。 - + Connecting to %1 … 正在连接到 %1 … - + No connection to %1 at %2. 没有到位于%2中的%1的连接 - + Server configuration error: %1 at %2. 服务器配置错误:%1 于 %2. - + No %1 connection configured. 没有 %1 连接配置。 - + There are folders that were not synchronized because they are too big: 以下目录由于太大而没有同步: - + There are folders that were not synchronized because they are external storages: 以下目录由于是外部存储而没有同步: - + There are folders that were not synchronized because they are too big or external storages: 以下目录由于太大或是外部存储而没有同步: - + Confirm Account Removal 确认移除账号 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您确定要移除与账号<i>%1</i>的连接吗?</p><p><b>注意:</b> 这 <b>不会</b> 删除任何文件。</p> - + Remove connection 移除连接 - - + This account supports end-to-end encryption 此账号支持端到端加密 - + Set up encryption - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + 在这个账户上已经在另一个设备上启用了端到端加密。<br>可以通过输入你的助记符在这个设备上启用它。<br>这将使现有的加密文件夹得到同步。 + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + 对服务器的认证请求被重定向到 "%1"。URL 有错误,服务器配置有误。 + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + 服务器禁止访问。为了验证你是否有适当的访问权限,请<a href="%1">点击这里</a>用你的浏览器访问该服务。 + + + + There was an invalid response to an authenticated WebDAV request @@ -794,7 +842,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. 有关更多动态,请打开 “动态” 应用。 @@ -804,12 +852,12 @@ This action will abort any currently running synchronization. - + Fetching activities … - + Files from the ignore list as well as symbolic links are not synced. 来自忽略列表的文件和符号链接不会被同步。 @@ -860,32 +908,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. 继续意味着<b>删除这些设置</b> - + Continuing will mean <b>ignoring these settings</b>. 继续意味着<b>忽略这些设置</b> - + 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>. 一些设置在此客户端的新版本中被配置,并使用了该版本中没有的功能。<br><br>%1<br><br>当前配置文件已经备份到<i>%2</i>。 - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit 退出 - + Continue 继续 - + Error accessing the configuration file 访问配置文件时发生错误 @@ -895,12 +970,12 @@ This action will abort any currently running synchronization. 访问配置文件 %1 时发生错误。请检查是否有访问权限。 - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. - + Quit %1 退出 %1 @@ -946,56 +1021,216 @@ This action will abort any currently running synchronization. 文件 %1 修改时间无效。不要上传到服务器。 - + File Removed (start upload) %1 文件已删除(开始上传)%1 - + File %1 has invalid modification time. Do not upload to the server. 文件 %1 修改时间无效。不要上传到服务器。 - + Local file changed during syncing. It will be resumed. 本地文件在同步时发生变化。将重新开始同步。 - - + + Local file changed during sync. 本地文件在同步时发生变化。 - + Network error: %1 - + Error updating metadata: %1 更新元数据出错:%1 - + The file %1 is currently in use 文件 %1 在使用中 - + The local file was removed during sync. 本地文件在同步时被删除 - + Restoration failed: %1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + + + + + Could not rename file. Please make sure you are connected to the server. + + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + + + + + Failed to fetch permissions with error %1 + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + + + + + Error + + + + + Existing file + + + + + file A + + + + + fileA + + + + + + today + + + + + + 0 byte + + + + + + Open existing file + + + + + Case clashing file + + + + + file B + + + + + fileB + + + + + + Open clashing file + + + + + Please enter a new name for the clashing file: + + + + + New filename + + + + + Rename file + + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + + + + + %1 does not support equal file names with only letter casing differences. + + + + + Filename contains leading and trailing spaces. + + + + + Filename contains leading spaces. + + + + + Filename contains trailing spaces. + + + + + Use invalid name + + + + + Filename contains illegal characters: %1 + + + OCC::CleanupPollsJob - + Error writing metadata to the database 向数据库写入元数据错误 @@ -1013,12 +1248,12 @@ This action will abort any currently running synchronization. 请输入端到端加密短语:<br><br>用户名:%2<br>账号:%3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> - + Enter E2E passphrase 输入 E2E 密语 @@ -1194,8 +1429,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! 服务器错误:PROPFIND 回复的格式不是 XML! @@ -1203,27 +1438,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 打开目录 %1 时出错 - + Directory not accessible on client, permission denied 目录在客户端上不可访问,权限被拒 - + Directory not found: %1 找不到目录:%1 - + Filename encoding is not valid 文件名编码无效 - + Error while reading directory %1 读取目录 %1 时出错 @@ -1231,83 +1466,83 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. - - - - - - + + + + + + Please try again. 请重试 - + Invalid file path was provided. 提供的文件路径无效。 - + Could not find an account for local editing. - - + + Could not validate the request to open a file from server. - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. - + Server error: PROPFIND reply is not XML formatted! - + Could not find a remote file info for local editing. Make sure its path is valid. - + Could not open %1 - + File %1 already locked. - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + File %1 now locked. - + File %1 could not be locked. @@ -1315,7 +1550,7 @@ This action will abort any currently running synchronization. OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. 无法生成用于加密的元数据,请解锁文件夹。 @@ -1445,145 +1680,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. 本地文件夹 %1 不存在。 - + %1 should be a folder but is not. %1 应该是一个文件夹,但是它现在不是。 - + %1 is not readable. %1 不可读。 - + %1 and %n other file(s) have been removed. %1 和 %n 其它文件已被移除。 - + %1 has been removed. %1 names a file. %1 已移除。 - + %1 and %n other file(s) have been added. 已添加 %1 和其他 %n 个文件 - + %1 has been added. %1 names a file. 已添加 %1 - + %1 and %n other file(s) have been updated. %1 和 %n 其它文件已更新。 - + %1 has been updated. %1 names a file. %1 已更新。 - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 已经更名为 %2,%n 其它文件也已更名。 - + %1 has been renamed to %2. %1 and %2 name files. %1 已更名为 %2。 - + %1 has been moved to %2 and %n other file(s) have been moved. %1 已移动到 %2,%n 其它文件也已移动。 - + %1 has been moved to %2. %1 已移动至 %2。 - + %1 has and %n other file(s) have sync conflicts. %1 和 %n 其他文件有同步冲突。 - + %1 has a sync conflict. Please check the conflict file! %1 有同步冲突。请检查冲突文件! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 和 %n 其他文件由于错误不能同步。详细信息请查看日志。 - + %1 could not be synced due to an error. See the log for details. %1 同步出错。详情请查看日志。 - + %1 and %n other file(s) are currently locked. %1 与 %n 其他文件目前均已被锁定。 - + %1 is currently locked. %1 已经被锁定 - + Sync Activity 同步动态 - + Could not read system exclude file 无法读取系统排除的文件 - + A new folder larger than %1 MB has been added: %2. 一个大于 %1 MB 的新文件夹 %2 已被添加。 - + A folder from an external storage has been added. 一个来自外部存储的文件夹已被添加。 - + Please go in the settings to select it if you wish to download it. 如果您想下载,请到设置页面选择它。 - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. 文件夹 %1 已创建但之前被排除出同步过程。文件夹中的数据将不会被同步。 - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. 文件 %1 已创建但之前被排除出同步过程。这个文件将不会被同步。 - + 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). @@ -1596,7 +1831,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1607,7 +1842,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a 如果您决定删除文件,它们将对您不可用,除非您是所有者。 - + 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. @@ -1616,17 +1851,17 @@ If this was an accident and you decide to keep your files, they will be re-synce 如果这是一次意外,而您决定保留您的文件,它们将从服务器重新同步。 - + Remove All Files? 移除所有文件? - + Remove all files 移除所有文件 - + Keep files 保留文件 @@ -1662,22 +1897,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state 不能重置文件夹状态 - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. 找到旧的同步日志“%1”,但无法删除。请确保目前没有应用程序正在使用它。 - + (backup) (备份) - + (backup %1) (备份 %1) @@ -1687,27 +1922,27 @@ If this was an accident and you decide to keep your files, they will be re-synce 未知状态。 - + Undefined state. 未知状态。 - + Waiting to start syncing. 等待启动同步。 - + Preparing for sync. 准备同步。 - + Sync is running. 同步正在运行。 - + Sync finished with unresolved conflicts. 同步已完成,但有未解决的冲突 @@ -1727,62 +1962,62 @@ If this was an accident and you decide to keep your files, they will be re-synce 用户撤销。 - + Last sync was successful. - + 最后一次同步已成功。 - + Setup error. 安装失败。 - + Sync request was cancelled. - + Sync is paused. 同步已暂停。 - + %1 (Sync is paused) %1(同步已暂停) - + No valid folder selected! 没有选择有效的文件夹! - + The selected path does not exist! 所选路径不存在! - + The selected path is not a folder! 选择的路径不是一个文件夹! - + You have no permission to write to the selected folder! 您没有写入所选文件夹的权限! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! 本地文件夹 %1 包含有正在使用的同步文件夹,请选择另一个! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! 本地文件夹 %1 是正在使用的同步文件夹,请选择另一个! - + There is already a sync from the server to this local folder. Please pick another local folder! 已经有一个从服务器到此文件夹的同步设置。请选择其他本地文件夹! @@ -1795,7 +2030,7 @@ If this was an accident and you decide to keep your files, they will be re-synce 添加同步文件夹 - + File 文件 @@ -1803,152 +2038,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder 请先登录后再添加文件夹 - + Click this button to add a folder to synchronize. 点击选择进行同步的本地文件夹。 - - + + Could not decrypt! + + + + + %1 (%2) - Example text: "File.txt (23KB)" %1(%2) - + Error while loading the list of folders from the server. 载入文件夹列表时发生错误。 - + Fetching folder list from server … 正在从服务器获取文件夹列表… - + There are unresolved conflicts. Click for details. 存在未解决的冲突。点击查看细节。 - + Virtual file support is enabled. 已启用虚拟文件支持 - + Signed out 已登出 - + Synchronizing VirtualFiles with local folder 正在同步虚拟文件与本地文件夹 - + Synchronizing with local folder 正与本地文件夹同步 - + Checking for changes in remote "%1" 正检查远程 "%1" 中的更改 - + Checking for changes in local "%1" 正检查本地 "%1" 的更改 - + Reconciling changes 状态发生变化 - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" 正在同步 %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) 每秒下载 %1 - + ↓ %1/s ↓ %1 每秒 - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) 每秒上传 %1 - + ↑ %1/s ↑ %1 每秒 - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2(%3 / %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" - + %5 left, %1 of %2, file %3 of %4 剩余:%5,%1 / %2, 文件数量 %3 / %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %2 的 %1,%4 的文件 %3 - + file %1 of %2 第 %1 个文件,共 %2 个 - + Waiting … 等待中... - + Waiting for %n other folder(s) … 正在等待 %n 个其他文件夹…… - + Preparing to sync … 正在准备同步… @@ -2179,13 +2418,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable 稳定版 - + beta 测试版 @@ -2237,32 +2476,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive 创建调试存档 - + Server notifications that require attention. 需要注意的服务器通知。 - + Show call notification dialogs. - + You cannot disable autostart because system-wide autostart is enabled. 你不能禁用自启动,因为系统级的自启动处于启用状态。 - + Change update channel? 更改更新频道? - + 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. 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. @@ -2271,27 +2510,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar 请注意,这只会选择从何种中池升级,并且没有降级:因此,通常无法立即从测试版通道返回到稳定版通道,这意味着您需要等待比当前安装的测试版更新的稳定版。 - + Change update channel 更改更新频道 - + Cancel 取消 - + Zip Archives Zip 归档 - + Debug Archive Created 调试存档已创建 - + Debug archive is created at %1 调试存档已创建于 %1 @@ -2299,22 +2538,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required 需要共享密码 - + Please enter a password for your link share: 请输入您的共享链接密码: - + Sharing error 共享错误 - + Could not retrieve or create the public link share. Error: %1 @@ -2552,6 +2791,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close 关闭 + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2884,60 +3128,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 使用 &虚拟文件,而非立即下载内容 %1 - + (experimental) (实验性) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Windows 分区根目录不支持虚拟文件作为本地文件夹。请在驱动器号下选择有效的子文件夹。 - + %1 folder "%2" is synced to local folder "%3" %1 文件夹 "%2" 已同步至本地文件夹 "%3" - + Sync the folder "%1" 同步文件夹 "%1" - + Warning: The local folder is not empty. Pick a resolution! 警告:本地文件夹不是空的。选择一个分辨率! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 剩余空间 - + Virtual files are not available for the selected folder 虚拟文件对所选文件夹不可用 - + Local Sync Folder 本地同步文件夹 - - + + (%1) (%1) - + There isn't enough free space in the local folder! 本地文件夹可用空间不足! @@ -3009,7 +3253,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 无法获得冲突 %1 文件的修改时间 @@ -3041,144 +3286,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">成功连接到 %1:%2 版本 %3(%4)</font><br/><br/> - + Invalid URL 无效URL - + Failed to connect to %1 at %2:<br/>%3 连接到 %1 (%2)失败:<br />%3 - + Timeout while trying to connect to %1 at %2. 连接到 %1 (%2) 时超时。 - + Trying to connect to %1 at %2 … 尝试连接到 %1 的 %2 … - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. 已通过身份验证的服务器请求被重定向到“%1”。URL 错误,服务器配置错误。 - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. 服务器拒绝了访问。<a href="%1">点击这里打开浏览器</a> 来确认您是否有权访问。 - + There was an invalid response to an authenticated WebDAV request 对已认证的 WebDAV 请求的响应无效 - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> 本地同步文件夹 %1 已存在,将使用它来同步。<br/><br/> - + Creating local sync folder %1 … 正在新建本地同步文件夹 %1 … - + OK 好 - + failed. 失败 - + Could not create local folder %1 不能创建本地文件夹 %1 - + No remote folder specified! 未指定远程文件夹! - + Error: %1 错误:%1 - + creating folder on Nextcloud: %1 在 Nextcloud 上创建文件夹:%1 - + Remote folder %1 created successfully. 远程文件夹 %1 成功创建。 - + The remote folder %1 already exists. Connecting it for syncing. 远程文件夹 %1 已存在。连接它以供同步。 - - + + The folder creation resulted in HTTP error code %1 创建文件夹出现 HTTP 错误代码 %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> 远程文件夹创建失败,因为提供的凭证有误!<br/>请返回并检查您的凭证。</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">远程文件夹创建失败,可能是由于提供的用户名密码不正确。</font><br/>请返回并检查它们。</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. 创建远程文件夹 %1 失败,错误为 <tt>%2</tt>。 - + A sync connection from %1 to remote directory %2 was set up. 已经设置了一个 %1 到远程文件夹 %2 的同步连接 - + Successfully connected to %1! 成功连接到了 %1! - + Connection to %1 could not be established. Please check again. 无法建立到 %1 的链接,请稍后重试。 - + Folder rename failed 文件夹更名失败 - + Cannot 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. 无法删除和备份该文件夹,因为其中的文件夹或文件在另一个程序中打开。请关闭文件夹或文件,然后点击重试或取消安装。 - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>本地同步目录 %1 已成功创建</b></font> @@ -3201,12 +3446,12 @@ Note that using any logging command line options will override this setting.取消 - + Enable experimental feature? 启用实验性功能? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3217,12 +3462,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 当“虚拟文件”模式被启用时,最初不会下载任何文件,而是为服务器上存在的每个文件创建一个小的“%1”文件。内容可以通过运行这些文件或使用它们的上下文菜单来下载。虚拟文件模式与选择性同步是互斥的。当前未选择的文件夹将被翻译成“仅在线”的文件夹,并且您选择的同步设置将被重置。切换到此模式将中止任何当前正在运行的同步。这是一种新的实验性模式。如果您决定使用它,请报告出现的任何问题。 - + Enable experimental placeholder mode 启用实验占位符模式 - + Stay safe 保持安全 @@ -3251,162 +3496,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. 符号链接在同步中不受支持。 - + File is listed on the ignore list. 文件位于忽略列表中 - + File names ending with a period are not supported on this file system. 此文件系统不支持以句点结尾的文件名。 - + File names containing the character "%1" are not supported on this file system. 此文件系统不支持包含字符“%1”的文件名 - + File name contains at least one invalid character 文件名包含至少一个无效字符 - + The file name is a reserved name on this file system. 此文件名是这个文件系统上的保留名。 - + Filename contains trailing spaces. 文件名包含结尾空白 - + Filename contains leading spaces. - + Filename contains leading and trailing spaces. - + Filename is too long. 文件名太长 - + File/Folder is ignored because it's hidden. 文件/文件夹被忽略,因为它是隐藏的。 - + Stat failed. 由于排除或错误,项目被跳过。 - + Conflict: Server version downloaded, local copy renamed and not uploaded. 冲突:服务器版本已下载,本地副本已重命名,但未上传。 - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + + + + The filename cannot be encoded on your file system. 文件名无法在您的文件系统上被编码 - + The filename is blacklisted on the server. 该文件名在服务器上被列入黑名单 - + File has extension reserved for virtual files. 文件有为虚拟文件保留的扩展名 - + size 大小 - + permission 权限 - + file id 文件标识 - + Server reported no %1 服务器报告无 %1 - + Cannot sync due to invalid modification time - + Error while deleting file record %1 from the database - + Conflict when uploading a folder. It's going to get cleared! 上传文件夹时发生冲突。它会被清除! - + Conflict when uploading a file. It's going to get removed! 上传时发生冲突。它将被移除! - + Ignored because of the "choose what to sync" blacklist 因“选择要同步的内容”黑名单而被忽略 - + Not allowed because you don't have permission to add subfolders to that folder 不被允许,因为您没有向该文件夹添加子文件夹的权限。 - + Not allowed because you don't have permission to add files in that folder 不被允许,因为您没有在该文件夹中添加文件的权限。 - + Not allowed to upload this file because it is read-only on the server, restoring 不允许上传这个文件,因为它在这台服务器上是只读的,恢复中。 - + Moved to invalid target, restoring 移动到无效目标,恢复中。 - + Not allowed to remove, restoring 不允许移除,恢复中。 - + Error while reading the database 读取数据库时出错 - + Server replied with an error while reading directory "%1" : %2 服务器在读取目录 "%1" 时返回了一个错误: %2 @@ -3414,22 +3664,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB - + Error updating metadata due to invalid modification time 由于修改时间无效,更新元数据时出错 - + Error updating metadata: %1 更新元数据出错:%1 - + File is currently in use 文件在使用中 @@ -3442,19 +3692,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss - + File %1 cannot be downloaded because encryption information is missing. 文件 %1 无法被下载,因为加密信息丢失。 - - + + File has changed since discovery 自从发现文件以来,它已经被修改了 - + Could not delete file record %1 from local DB @@ -3465,32 +3715,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss 文件 %1 无法被下载,因为一个本地文件名冲突! - + File %1 can not be downloaded because of a local file name clash! 由于本地文件名冲突,文件 %1 无法下载。 - + The download would reduce free local disk space below the limit 下载将减少低于限制的空闲本地磁盘空间 - + Free space on disk is less than %1 空闲磁盘空间少于 %1 - + File was deleted from server 已从服务器删除文件 - + The file could not be downloaded completely. 文件无法完整下载。 - + The downloaded file is empty, but the server said it should have been %1. 已下载的文件为空,但是服务器说它应该是 %1 @@ -3500,18 +3750,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 由于本地文件名冲突,文件 %1 无法保存。 - - + + File %1 has invalid modified time reported by server. Do not save it. 服务器报告文件 %1 的修改时间无效。不要保存它。 - + + File %1 downloaded but it resulted in a local file name clash! + + + + Error updating metadata: %1 更新元数据出错:%1 - + The file %1 is currently in use 文件 %1 在使用中 @@ -3532,7 +3787,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 不能删除文件 %1,错误:%2 @@ -3543,16 +3798,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + + + + Could not create folder %1 无法创建文件夹 %1 - + Error updating metadata: %1 更新元数据出错:%1 - + The file %1 is currently in use 文件 %1 在使用中 @@ -3560,7 +3820,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash 由于本地文件名冲突,不能删除 %1 @@ -3573,46 +3833,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash 文件 %1 无法被重命名至 %2,因为一个本地文件名冲突 - - - + + File %1 downloaded but it resulted in a local file name clash! + + + + + + could not get file %1 from local DB - + Error setting pin state 设置固定状态出错 - - + + Error updating metadata: %1 更新元数据出错:%1 - + The file %1 is currently in use 文件 %1 在使用中 - - + + Could not delete file record %1 from local DB - + Failed to propagate directory rename in hierarchy - + Failed to rename file 重命名文件失败 @@ -3633,7 +3898,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". 服务器返回了错误的 HTTP 代码。预期的是 204,但接收到的是 "%1 %2"。 @@ -3646,12 +3911,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 服务器返回的 HTTP 状态错误,应返回 201,但返回的是“%1 %2”。 - + Error writing metadata to the database: %1 将元数据写入数据库出错:%1 - + The file %1 is currently in use 文件 %1 在使用中 @@ -3659,42 +3924,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 无法将 %1 重命名为 %2,错误:%3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". 服务器返回的 HTTP 状态错误,应返回 201,但返回的是“%1 %2”。 - + could not get file %1 from local DB - + Could not delete file record %1 from local DB - + Error updating metadata: %1 更新元数据出错:%1 - + The file %1 is currently in use 文件 %1 在使用中 - + Error setting pin state 设置固定状态出错 - + Error writing metadata to the database 向数据库写入元数据错误 @@ -3884,7 +4149,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply 回复 @@ -3902,23 +4167,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 设置 - + %1 Settings This name refers to the application name e.g Nextcloud %1 设置 - + General 常规 - + Network 网络 - + Account 账号 @@ -3926,17 +4191,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link 分享链接 - + Link share - + + Internal link + + + + Enter a note for the recipient @@ -4012,7 +4282,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4021,132 +4291,169 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + + + + + Failed to encrypt folder + + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + + + + + Folder encrypted successfully + + + + + The following folder was encrypted successfully: "%1" + + + + Context menu share 上下文目录共享 - + Select new location … 请选择新位置 ... - + I shared something with you 我向您共享了一些东西 - - + + Share options 共享选项 - - + + Activity 动态 - + Copy private link to clipboard 复制私人链接到剪贴板 - + Send private link by email … 通过电子邮件发送私人链接… + + + Expire in %1 minutes + remaining time before lock expire + + - + Leave this share - + Resharing this file is not allowed 不允许再次分享此文件 - + Resharing this folder is not allowed 不允许重新分享这个文件夹 - - + + Copy public link 复制公开链接 - + Copy internal link 复制内部链接 - + + Encrypt + + + + Lock file 锁定文件 - + Unlock file 解锁文件 - + Locked by %1 - - Expire in %1 minutes - remaining time before lock expire - - - - + Expires in %1 minutes remaining time before lock expires - + Edit 编辑 - + Open in browser 在浏览器中打开 - + Resolve conflict … 解决冲突 ... - + Move and rename … 移动并重命名 ... - + Move, rename and upload … 移动,重命名并上传 ... - + Delete local changes 删除本地变更 - + Move and upload … 移动并上传 ... - + Delete 删除 @@ -4364,63 +4671,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1 (由于先前的错误而跳过,在%2中再次尝试 ) - + Could not update file: %1 无法上传文件:%1 - + Could not update virtual file metadata: %1 无法更新虚拟文件元数据:%1 - + Could not update file metadata: %1 - + Could not set file record to local DB: %1 - + Unresolved conflict. 未解决的冲突。 - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() 仅有 %1 有效,至少需要 %2 才能开始 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. 无法打开或创建本地同步数据库。请确保您在同步文件夹下有写入权限。 - + Using virtual files with suffix, but suffix is not set 使用带后缀的虚拟文件,但未设置后缀。 - + Unable to read the blacklist from the local database 无法从本地数据库读取黑名单 - + Unable to read from the sync journal. 无法读取同步日志。 - + Cannot open the sync journal 无法打开同步日志 @@ -4430,12 +4737,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 同步将很快恢复。 - + Disk space is low: Downloads that would reduce free space below %1 were skipped. 硬盘剩余容量过低:下载后将会导致剩余容量低于 %1 的文件将会被跳过。 - + There is insufficient space available on the server for some uploads. 对于某些上传文件来说,服务器端的可用空间不足。 @@ -4504,59 +4811,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download 下载 - + Add account 添加账号 - + Open main dialog 打开主对话框 - - + + Pause sync 暂停同步 - - + + Resume sync 恢复同步 - + Settings 设置 - + Help 帮助 - + Exit %1 退出 %1 - + Pause sync for all 全部暂停同步 - + Resume sync for all 全部恢复同步 - + %1: %2 %1:%2 @@ -4564,24 +4871,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 桌面客户端</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>版本 %1。详情请点击<a href='%2'>这里</a>。</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>正使用虚拟文件插件:%1</small></p> - + <p>This release was supplied by %1</p> <p>该版本由 %1 提供</p> @@ -4589,22 +4896,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. 获取提供商失败 - + Failed to fetch search providers for '%1'. Error: %2 未能获取 ''%1' 的搜索提供商。错误: %2 - + Search has failed for '%2'. 搜索 '%2' 失败 - + Search has failed for '%1'. Error: %2 搜索“%1”失败。错误:%2 @@ -4612,30 +4919,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads 重试所有上传 + + + + Resolve conflict + + OCC::UserModel - + Confirm Account Removal 确认移除账号 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您确定要移除与账号<i>%1</i>的连接吗?</p><p><b>注意:</b> 这 <b>不会</b> 删除任何文件。</p> - + Remove connection 移除连接 - + Cancel 取消 @@ -4773,8 +5086,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time 由于修改时间无效,更新元数据时出错 @@ -4782,8 +5095,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time 由于修改时间无效,更新元数据时出错 @@ -4881,123 +5194,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version 不支持的服务器版本 - + 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. 帐户 %1 上的服务器运行不支持的版本 %2。将此客户端与不支持的服务器版本一起使用是未经测试的,并且有潜在的危险。继续进行,风险自担。 - + Disconnected 连接已断开 - + Disconnected from some accounts 已从某些账号断开 - + Disconnected from %1 已从服务器断开 %1 - + Disconnected from accounts: 已断开账号: - + Account %1: %2 账号 %1: %2 - + Please sign in 请登录 - + Signed out 已退出 - + Account synchronization is disabled 账号同步已禁用 - - + + Synchronization is paused 同步已暂停 - + Folder %1: %2 文件夹 %1:%2 - + Unresolved conflicts 未解决的冲突 - + Up to date 更新 - + Error during synchronization 同步过程中发生错误 - + There are no sync folders configured. 没有已配置的同步文件夹。 - + No sync folders configured 没有配置同步目录 - + Checking for changes in remote "%1" 正检查远程 "%1" 中的更改 - + Checking for changes in local "%1" 正检查本地 "%1" 的更改 - + Syncing %1 of %2 (%3 left) 正在同步 %2 的 %1(剩余 %3) - + Syncing %1 of %2 正在同步 %1,共 %2 - + Syncing %1 (%2 left) 同步 %1(剩余 %2) - + Syncing %1 正在同步 %1 - + %1 (%2, %3) %1(%2, %3) @@ -5149,27 +5462,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss 新文件夹 - + You renamed %1 你重命名了 %1 - + You deleted %1 你删除了 %1 - + You created %1 你创建了 %1 - + You changed %1 你修改了 %1 - + Synced %1 已同步 %1 @@ -5235,30 +5548,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss 标记为已读 + + ShareDelegate + + + Create a new share link + + + + + Copy share link location + + + + + Share options + + + + + ShareDetailsPage + + + An error occurred setting the share password. + + + + + Edit share + + + + + Dismiss + + + + + Share label + + + + + Allow editing + + + + + Password protect + + + + + Set expiration date + + + + + Note to recipient + + + + + Unshare + + + + + Add another link + + + + + Copy share link + + + ShareView - + Password required for new share - + Share password 分享密码 - + Sharing is disabled - + This item cannot be shared. - + Sharing is disabled. @@ -5274,7 +5663,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. 未能连接至数据库 @@ -5332,6 +5721,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 加载更多结果 + + UnifiedSearchResultNothingFound + + + No results for + + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + + + UserLine @@ -5395,67 +5800,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status 在线状态 - + Online 在线 - + Away 离开 - + Do not disturb 勿扰 - + Mute all notifications 静音所有通知 - + Invisible 不可见 - + Appear offline 显示为离线 - + Status message 状态消息 - + What is your status? 你什么状态? - + Clear status message after 在指定时间段后清除状态消息 - + Cancel 取消 - + Clear status message 清除状态消息 - + Set status message 设置状态消息 @@ -5539,24 +5944,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloud 桌面主对话框 - + Current account 当前账号 - - + + Resume sync for all 全部恢复同步 - - + + Pause sync for all 全部暂停同步 @@ -5566,22 +5971,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 设定用户状态 - + Add account 添加账号 - + Add new account 添加新账号 - + Settings 设置 - + Exit 退出 @@ -5590,11 +5995,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar 当前用户头像 - - - Current account avatar - 当前账号头像 - Current user status is online @@ -5606,70 +6006,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss 当前用户状态为“请勿打扰” - + + Current account avatar + 当前账号头像 + + + Current account status is online 当前账号状态为在线 - + Current account status is do not disturb 当前账号状态为请勿打扰 - + + %1 - File activity + %1 - 文件动态 + + + Account switcher and settings menu 账号切换器和设置菜单 - + Open local folder of current account 打开当前账号的本地文件夹 - + Connected 已连接 - + Disconnected 连接已断开 - + Open Nextcloud Talk in browser 在浏览器中打开 Nextcloud Talk - + More apps 更多的应用程序 - + Open %1 in browser 在浏览器中打开%1 - + Unified search results list 统一的搜索结果列表 - - - %1 - File activity - %1 - 文件动态 - main.cpp - + System Tray not available 系统托盘不可用 - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 需要一个工作的系统托盘。如果您正在运行XFCE,请遵照<a href="http://docs.xfce.org/xfce/xfce4-panel/systray">这些说明</a>操作。否则,请安装系统托盘应用程序,如“trayer”,然后重试。 @@ -5677,7 +6082,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>使用Qt %5, %6,从 %3, %4 上的Git版本<a href="%1">%2</a>构建</small></p> @@ -5711,72 +6116,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + + + + Deleted 已删除 - + Moved to %1 已移动到 %1 - + Ignored 已忽略 - + Filesystem access error 文件系统访问错误 - + Error 错误 - + Updated local metadata 已更新本地元数据 - + Unknown 未知 - + downloading 正在下载 - + uploading 正在上传 - + deleting 删除 - + moving 移动 - + ignoring 忽略 - + error 错误 - + updating local metadata 正在更新本地元数据 @@ -5879,7 +6289,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss Make always available locally - 使文件总是本地可用 + 始终在本地可用 diff --git a/translations/client_zh_HK.ts b/translations/client_zh_HK.ts index cf4a90f1a..0937a2567 100644 --- a/translations/client_zh_HK.ts +++ b/translations/client_zh_HK.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally 在近端打開 %1 - + In %1 在 %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions 顯示更多操作 @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss 撤銷 + + + Open file details + 打開檔案細節 + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list 活動紀錄清單 @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu 清除狀態訊息選項單 @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + 撤銷 + + + Activity 活動紀錄 - + Sharing 分享 @@ -226,12 +236,12 @@ 此平台不具有移至回收桶功能 - + Error removing "%1": %2 刪除 “%1” 時出錯:%2 - + Could not remove folder "%1" 無法移除資料夾 "%1" @@ -321,7 +331,7 @@ 從伺服器端回傳錯誤的 HTTP 代碼, 預期是 204, 但是接收到的是 "%1 %2"。 - + "%1 Failed to unlock encrypted folder %2". "%1 無法解鎖已加密資料夾 %2"。 @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. 檔案 %1 已被 %2 上鎖。 - + Lock operation on %1 failed with error %2 %1 的上鎖操作失敗,錯誤為 %2 - + Unlock operation on %1 failed with error %2 %1 的解鎖操作失敗,錯誤為 %2 @@ -354,9 +364,9 @@ - - - + + + Cancel 取消 @@ -401,12 +411,12 @@ 您似乎在此資料夾上啟用了「虛擬文件」功能。目前,無法隱式下載經過端到端加密的虛擬檔案。為了獲得最佳的虛擬檔案和端到端加密體驗,請確保已加密的資料夾標記有“在近端始終可用”。 - + End-to-end Encryption with Virtual Files 虛擬檔案的端到端加密 - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". 您似乎在此資料夾上啟用了「虛擬文件」功能。目前,無法隱式下載經過端到端加密的虛擬檔案。為了獲得最佳的虛擬檔案和端到端加密體驗,請確保已加密的資料夾標記有“在近端始終可用”。 @@ -416,29 +426,29 @@ 不加密資料夾 - + Do not encrypt folder 不加密資料夾 - + Encrypt folder 加密資料夾 - + No account configured. 沒有設置帳號。 - - Display mnemonic - 顯示助記碼 + + Disable encryption + 停用加密 - End-to-end encryption has been enabled for this account - 此賬戶已啟用端到端加密 + Display mnemonic + 顯示助記碼 @@ -446,19 +456,24 @@ 啟用加密 - + + End-to-end encryption has been enabled for this account + 此賬戶已啟用端到端加密 + + + Warning 警告 - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? 端到端加密尚未在此裝置上設定。一旦其設定好,您將可以加密此資料夾。 您想要設定端到端加密嗎? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. 您無法加密包含內容的資料夾,請刪除檔案。 @@ -471,121 +486,121 @@ Wait for the new sync, then encrypt it. 此賬戶支援端到端加密 - + Encryption failed 加密失敗 - + Could not encrypt folder because the folder does not exist anymore 無法加密資料夾,因為該資料夾不再存在 - - + + Open folder 開啟資料夾 - + Encrypt 加密 - - + + Edit Ignored Files 編輯要略過的檔案 - - + + Create new folder 新增資料夾 - - + + Availability 可得性 - + Choose what to sync 選擇要同步的項目 - + Force sync now 強制同步 - + Restart sync 重新啟動同步 - + Resume sync 繼續同步 - + Pause sync 暫停同步 - + Remove folder sync connection 移除資料夾同步連線 - + Disable virtual file support … 停用虛擬檔案支援... - + Enable virtual file support %1 … 啟用虛擬檔案支援 %1 … - + (experimental) (實驗性) - + Folder creation failed 資料夾建立失敗 - + <p>Could not create local folder <i>%1</i>.</p> <p>無法建立本機資料夾<i>%1</i>。</p> - + Confirm Folder Sync Connection Removal 確認移除資料夾同步連線 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您確定要停止同步資料夾 <i>%1</i>?</p><p><b>注意:</b> 此操作 <b>不會</b> 刪除任何檔案</p> - + Remove Folder Sync Connection 移除資料夾同步連線 - + Disable virtual file support? 停用虛擬檔案支援? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -598,7 +613,7 @@ This action will abort any currently running synchronization. 此操作將中止任何當前正在運行的同步。 - + Disable support 停用支援 @@ -608,145 +623,177 @@ This action will abort any currently running synchronization. 端到端加密助記碼 - + End-to-end encryption mnemonic 端到端加密助記碼 - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). 為了保護您的身分,我們將用含12個單詞的助記碼進行加密。請將這些單詞記在一個安全的地方。要將其他裝置(如手提電話或手提電腦)加入您的賬戶中,需用到此助記碼。 - + + Disable end-to-end encryption + 停用端到端加密 + + + + Disable end-to-end encryption for %1? + 停用 %1 的端到端加密? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + 刪除端到端加密將刪除本地同步的加密檔案。<br>加密檔案將保留在伺服器上。 + + + Sync Running 正在同步中 - + The syncing operation is running.<br/>Do you want to terminate it? 正在同步中<br/>你真的想要中斷? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1(%3%)中的 %2 正在使用, 有些資料夾,包括網路掛載或分享資料夾,可能有不同的限制。 - + %1 of %2 in use 已使用 %2 中的 %1% - + Currently there is no storage usage information available. 目前無法查詢儲存空間使用資訊。 - + %1 in use %1 正在使用 - + %1 as %2 %1 為 %2 - + The server version %1 is unsupported! Proceed at your own risk. 伺服器版本%1過舊,已不支援。繼續的風險請自負。 - + Connected to %1. 已連線到 %1 - + Server %1 is temporarily unavailable. 伺服器 %1 暫時無法使用。 - + Server %1 is currently in maintenance mode. 伺服器 %1 現正處於維護模式 - + Signed out from %1. 從 %1 登出 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. 正從瀏覽器獲取許可。如須重新開啟瀏覽器,請<a href='%1'>點擊此處</a>。 - + Connecting to %1 … 正在連線到 %1... - + No connection to %1 at %2. %1 沒有連線到 %2 - + Server configuration error: %1 at %2. 伺服器設定錯誤:%1 在 %2。 - + No %1 connection configured. 沒有 %1 連線設置。 - + There are folders that were not synchronized because they are too big: 有部份的資料夾因為容量太大沒有辦法同步: - + There are folders that were not synchronized because they are external storages: 有部分資料夾因為是外部存儲沒有辦法同步: - + There are folders that were not synchronized because they are too big or external storages: 有部分資料夾因為容量太大或是外部存儲沒有辦法同步: - + Confirm Account Removal 確認移除帳號 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您確定要中斷此帳號 <i>%1</i> 的連線?</p><p><b>注意:</b>此操作 <b>不會</b> 刪除任何的檔案。</p> - + Remove connection 移除連線 - - + This account supports end-to-end encryption 此賬戶支援端到端加密 - + Set up encryption 設定加密 - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - 已在另一裝置上為此賬戶啟用端到端加密。<br>可通過輸入您的助記碼在此裝置上啟用。 + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + 已在另一裝置上為此賬戶啟用端到端加密。<br>可通過輸入您的助記碼在此裝置上啟用。<br>這將啟用現有加密資料夾的同步。 + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + 對伺服器的經過身份驗證的請求已重定向到 “%1”。 URL 有錯誤,伺服器配置亦有錯誤。 + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + 從伺服器存取被拒絕。為了正確驗證您的存取資訊 <a href="%1">請點選這裡</a> 透過瀏覽器來存取服務 + + + + There was an invalid response to an authenticated WebDAV request + 伺服器回應 WebDAV 驗證請求不合法 @@ -800,7 +847,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. 請開啟活動以檢視更多活動app @@ -810,12 +857,12 @@ This action will abort any currently running synchronization. 正在擷取活動紀錄 ... - + Fetching activities … 正在擷取活動紀錄 ... - + Files from the ignore list as well as symbolic links are not synced. 略過清單中的檔案以及符號連結不會同步。 @@ -866,32 +913,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. 繼續將意味著<b>刪除這些設置</b>。 - + Continuing will mean <b>ignoring these settings</b>. 繼續將意味著<b>略過這些設置</b>。 - + 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>. 某些設置是在此客戶端的較新版本中配置的,並使用了此版本中不可用的功能。<br><br>%1<br><br> 當前配置檔案已備份到 <i>%2</i>。 - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit 結束 - + Continue 繼續 - + Error accessing the configuration file 存取配置文件時錯誤 @@ -901,12 +975,12 @@ This action will abort any currently running synchronization. 存取設定檔%1時發生錯誤 請確定檔案可以被用戶存取 - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. 存取 %1 的配置檔案時出錯。請確保您的系統帳戶可以存取該檔案。 - + Quit %1 離開 %1 @@ -952,56 +1026,216 @@ This action will abort any currently running synchronization. 檔案 %1 的修改時間無效。 請勿上傳到伺服器。 - + File Removed (start upload) %1 檔案已移除(開始上傳)%1 - + File %1 has invalid modification time. Do not upload to the server. 檔案 %1 的修改時間無效。 請勿上傳到伺服器。 - + Local file changed during syncing. It will be resumed. 近端端的檔案在同步的過程中被更改。同步將會重新開始。 - - + + Local file changed during sync. 近端端的檔案在同步過程中被更改。 - + Network error: %1 網絡錯誤:%1 - + Error updating metadata: %1 更新元數據時出錯:%1 - + The file %1 is currently in use 檔案 %1 正在使用中 - + The local file was removed during sync. 近端的檔案在同步過程中被刪除。 - + Restoration failed: %1 復原失敗;%1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + 無法重命名檔案,因為伺服器上已存在同名檔案。請選擇另一個名字。 + + + + Could not rename file. Please make sure you are connected to the server. + 無法重命名檔案。請確保您已連接到伺服器。 + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + 您無權重命名此檔案。請要求檔案的擁有者重命名它。 + + + + Failed to fetch permissions with error %1 + 擷取權限失敗,錯誤為 %1 + + + + Filename contains leading and trailing spaces. + 檔案名包含前導和尾隨空格。 + + + + Filename contains leading spaces. + 檔案名包含前導空格。 + + + + Filename contains trailing spaces. + 檔案名包含尾隨空格。 + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + 大小寫衝突 + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + 無法同步檔案,因為其會與該系統上既有的檔案產生大小寫衝突。 + + + + Error + 錯誤 + + + + Existing file + 既有檔案 + + + + file A + 檔案 A + + + + fileA + + + + + + today + 今日 + + + + + 0 byte + 0 位元組 + + + + + Open existing file + 開啟現有的檔案 + + + + Case clashing file + 大小寫衝突檔案 + + + + file B + 檔案 B + + + + fileB + + + + + + Open clashing file + 開啟衝突檔案 + + + + Please enter a new name for the clashing file: + 請輸入衝突檔案的新名稱: + + + + New filename + 新檔案名稱 + + + + Rename file + 重新命名檔案 + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + 無法同步檔案「%1」,因為其會與該系統上既有的檔案產生大小寫衝突。 + + + + %1 does not support equal file names with only letter casing differences. + %1 不支援僅字母大小寫不同的檔案名稱。 + + + + Filename contains leading and trailing spaces. + 檔案名包含前導和尾隨空格。 + + + + Filename contains leading spaces. + 檔案名包含前導空格。 + + + + Filename contains trailing spaces. + 檔案名包含尾隨空格。 + + + + Use invalid name + 使用無效的名稱 + + + + Filename contains illegal characters: %1 + 檔案名含有非法字符:%1 + + OCC::CleanupPollsJob - + Error writing metadata to the database 寫入後設資料(metadata)時發生錯誤 @@ -1019,12 +1253,12 @@ This action will abort any currently running synchronization. 請輸入您端對端加密的密碼短語:<br><br>用戶:%2<br>賬戶:%3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> 請輸入您的端到端加密密碼:<br><br>用戶名:%2<br>帳戶:%3<br> - + Enter E2E passphrase 請輸入端到端密碼短語 @@ -1200,8 +1434,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! 伺服器錯誤:PROPFIND回覆未採用XML格式! @@ -1209,27 +1443,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 開啟目錄 %1 發生錯誤 - + Directory not accessible on client, permission denied 用戶端無法存取目錄,權限被拒 - + Directory not found: %1 找不到目錄:%1 - + Filename encoding is not valid 檔案名稱編碼無效 - + Error while reading directory %1 讀取目錄 %1 發生錯誤 @@ -1237,91 +1471,91 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. 收到無效的權杖。 - - - - - - + + + + + + Please try again. 請再試一次。 - + Invalid file path was provided. 提供了無效的檔案路徑。 - + Could not find an account for local editing. 找不到用於近端編輯的賬戶。 - - + + Could not validate the request to open a file from server. 無法驗證從伺服器開啟檔案的請求。 - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. 找不到用於近端編輯的檔案。請確保檔案的途徑有效並且在近端同步。 - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. 找不到用於近端編輯的檔案。請確保它沒有被選擇性同步排除。 - + Server error: PROPFIND reply is not XML formatted! 伺服器錯誤:PROPFIND回覆未採用XML格式! - + Could not find a remote file info for local editing. Make sure its path is valid. 找不到用於近端編輯的檔案。請確保檔案的途徑有效。 - + Could not open %1 - + 無法開啟 %1 - + File %1 already locked. - + 檔案 %1 已經上鎖。 - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + 鎖定將持續 %1 分鐘。完成編輯後,您也可以手動解鎖此檔案。 - + File %1 now locked. - + 檔案 %1 現已被上鎖。 - + File %1 could not be locked. - + 無法鎖上檔案 %1。 OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. 無法生成用於加密的元數據。解鎖文件夾。這可能是您的OpenSSL庫的問題。 @@ -1450,144 +1684,144 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. 近端資料夾 %1 不存在 - + %1 should be a folder but is not. 資料夾不存在, %1 必須是資料夾 - + %1 is not readable. %1 是不可讀的 - + %1 and %n other file(s) have been removed. %1 跟 %n 個其他檔案已經被刪除 - + %1 has been removed. %1 names a file. %1 已被移除。 - + %1 and %n other file(s) have been added. %1 跟 %n 個其他檔案已經被加入 - + %1 has been added. %1 names a file. %1 已加入。 - + %1 and %n other file(s) have been updated. %1 跟 %n 個其他檔案已經被修改 - + %1 has been updated. %1 names a file. %1 已被更新。 - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 已被改名為 %2 並且 %n其他檔案已被改名 - + %1 has been renamed to %2. %1 and %2 name files. %1 已被重新命名為 %2。 - + %1 has been moved to %2 and %n other file(s) have been moved. %1 已被搬移到%2 並且 %n 其他檔案已經被搬移 - + %1 has been moved to %2. %1 已被搬移至 %2。 - + %1 has and %n other file(s) have sync conflicts. %1 跟 %n 其他檔案同步時發生抵觸 - + %1 has a sync conflict. Please check the conflict file! %1 同步時發生抵觸,請檢查發生抵觸的檔案 - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 與 %n 其他檔案因為錯誤無法被同步。請從紀錄檔觀看細節。 - + %1 could not be synced due to an error. See the log for details. %1 因為錯誤無法被同步。請從紀錄檔觀看細節。 - + %1 and %n other file(s) are currently locked. %1以及%n個其他文件正在被鎖定狀態 - + %1 is currently locked. %1正在被鎖定狀態 - + Sync Activity 同步活動 - + Could not read system exclude file 無法讀取系統的排除檔案 - + A new folder larger than %1 MB has been added: %2. 一個大於%1MB的資料夾已被新增至:%2 - + A folder from an external storage has been added. 一個來自外部空間的資料夾已被新增 - + Please go in the settings to select it if you wish to download it. 若要下載此項目,請前往設定選擇它 - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. 已創建%1資料夾,但該資料夾已從要同步的檔案中剔除,因此不會被同步。 - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. 已新增%1檔案,但該檔案已從要同步的檔案中剔除,因此不會被同步。 - + 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). @@ -1600,7 +1834,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1611,7 +1845,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a 假如您決定刪除這些檔案,除非您是檔案的所有者,否則您將無法讀取這些檔案。 - + 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. @@ -1620,17 +1854,17 @@ If this was an accident and you decide to keep your files, they will be re-synce 如果您意外地刪除了檔案並決定保留它們,則它們將從伺服器重新同步。 - + Remove All Files? 移除所有檔案? - + Remove all files 移除所有檔案 - + Keep files 保留檔案 @@ -1666,22 +1900,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state 無法重置資料夾狀態 - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. 發現較舊的同步處理日誌 "%1",但無法移除。請確認沒有應用程式正在使用它。 - + (backup) (備份) - + (backup %1) (備份 %1) @@ -1691,27 +1925,27 @@ If this was an accident and you decide to keep your files, they will be re-synce 未知狀態 - + Undefined state. 未定義狀態。 - + Waiting to start syncing. 正在等待同步開始 - + Preparing for sync. 正在準備同步。 - + Sync is running. 同步執行中 - + Sync finished with unresolved conflicts. 同步完成,但存在未解決的抵觸。 @@ -1731,62 +1965,62 @@ If this was an accident and you decide to keep your files, they will be re-synce 用戶中斷。 - + Last sync was successful. 上次同步成功。 - + Setup error. 設置錯誤。 - + Sync request was cancelled. 同步請求已取消。 - + Sync is paused. 同步已暫停 - + %1 (Sync is paused) %1(同步暫停) - + No valid folder selected! 沒有選擇有效的資料夾 - + The selected path does not exist! 所選的路徑不存在! - + The selected path is not a folder! 所選的路徑並非資料夾! - + You have no permission to write to the selected folder! 您沒有權限來寫入被選擇的資料夾! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! 近端資料夾 %1 裡已經有被資料夾同步功能使用的資料夾,請選擇其他資料夾! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! 近端資料夾 %1 是被包含在一個已經被資料夾同步功能使用的資料夾,請選擇其他資料夾! - + There is already a sync from the server to this local folder. Please pick another local folder! 此資料夾已與Server設定同步,請選擇其他資料夾 @@ -1799,7 +2033,7 @@ If this was an accident and you decide to keep your files, they will be re-synce 新增資料夾同步功能的連線 - + File 檔案 @@ -1807,152 +2041,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder 您必須連上伺服器才能新增資料夾 - + Click this button to add a folder to synchronize. 點擊此按鈕來新增同步資料夾 - - + + Could not decrypt! + 無法解密! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1(%2) - + Error while loading the list of folders from the server. 從伺服器端同步資料夾清單時發生錯誤。 - + Fetching folder list from server … 正在從伺服器取得資料清單... - + There are unresolved conflicts. Click for details. 存在未解決的抵觸,請查看細節 - + Virtual file support is enabled. 已啟用虛擬檔案支援。 - + Signed out 已登出 - + Synchronizing VirtualFiles with local folder 與近端資料夾同步虛擬檔案 - + Synchronizing with local folder 與近端資料夾同步 - + Checking for changes in remote "%1" 正在檢查遠端「%1」中的變更 - + Checking for changes in local "%1" 檢查近端「%1」的變動 - + Reconciling changes 正在排解更動 - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" 同步 %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) 下載 %1/s - + ↓ %1/s ↓ %1/s - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) 上傳 %1/s - + ↑ %1/s ↑ %1/s - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2(%4 之 %3) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" 還剩幾秒鐘,%2 之 %1, 檔案 %4 之 %3 - + %5 left, %1 of %2, file %3 of %4 剩餘 %5,%2 之 %1, 檔案 %4 之 %3 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %2 之 %1, 檔案 %4 之 %3 - + file %1 of %2 檔案 %2 之 %1 - + Waiting … 請稍後... - + Waiting for %n other folder(s) … 等候其他 %n 個資料夾 - + Preparing to sync … 正在準備同步... @@ -2183,13 +2421,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable 穩定版 - + beta 測試版 @@ -2241,32 +2479,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive 建立除錯壓縮檔 - + Server notifications that require attention. 伺服器公告,請注意 - + Show call notification dialogs. 顯示通話通告對話框。 - + You cannot disable autostart because system-wide autostart is enabled. 您不可以停用自動啟動,因為已啟用系統廣域自動啟動。 - + Change update channel? 變更更新頻道? - + 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. 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. @@ -2275,27 +2513,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar 請注意,這僅選擇從哪個池升級中進行升級,並且沒有降級:因此通常無法立即從Beta通道返回到穩定通道,這意味著要等待比當前安裝的測試版本更新的穩定版本。 - + Change update channel 變更更新頻道 - + Cancel 取消 - + Zip Archives ZIP 壓縮檔 - + Debug Archive Created 已建立除錯壓縮檔 - + Debug archive is created at %1 除錯壓縮檔已建立於在 %1 @@ -2303,22 +2541,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required 透過密碼保護分享連結 - + Please enter a password for your link share: 請輸入分享連結密碼: - + Sharing error 分享發生錯誤 - + Could not retrieve or create the public link share. Error: %1 @@ -2556,6 +2794,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close 關閉 + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p> 2017-2023 Nextcloud GmbH 版權所有<br />2012-2023 ownCloud GmbH 版權所有</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2891,60 +3134,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 使用虛擬檔案(&v),而不是立即下載內容 %1 - + (experimental) (實驗性) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Windows分區根目錄不支持將虛擬文件作為近端資料夾使用。請在硬盤驅動器號下選擇一個有效的子資料夾。 - + %1 folder "%2" is synced to local folder "%3" %1 資料夾 "%2" 與近端資料夾 "%3" 同步 - + Sync the folder "%1" 同步資料夾 "%1" - + Warning: The local folder is not empty. Pick a resolution! 警告:近端資料夾不為空。選擇一個解決方案! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 剩餘空間 - + Virtual files are not available for the selected folder 選擇的資料夾無法使用虛擬檔案 - + Local Sync Folder 近端同步資料夾 - - + + (%1) (%1) - + There isn't enough free space in the local folder! 近端資料夾沒有足夠的剩餘空間! @@ -3016,7 +3259,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 無法獲得衝突 %1 檔案的修改時間 @@ -3048,144 +3292,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">成功連線到 %1: %2 版本 %3(%4)</font><br/><br/> - + Invalid URL 連結無效 - + Failed to connect to %1 at %2:<br/>%3 從 %2 連線到 %1 失敗:<br/>%3 - + Timeout while trying to connect to %1 at %2. 從 %2 嘗試連線到 %1 逾時。 - + Trying to connect to %1 at %2 … 嘗試以 %1 身分連線到 %2 - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. 對伺服器的經過身份驗證的請求已重定向到 “%1”。 URL 有錯誤,伺服器配置亦有錯誤。 - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. 從伺服器存取被拒絕。為了正確驗證您的存取資訊 <a href="%1">請點選這裡</a> 透過瀏覽器來存取服務 - + There was an invalid response to an authenticated WebDAV request 伺服器回應 WebDAV 驗證請求不合法 - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> 近端同步資料夾%1已存在, 將其設置為同步<br/><br/> - + Creating local sync folder %1 … 正在新增本機同步資料夾 %1... - + OK OK - + failed. 失敗 - + Could not create local folder %1 無法建立近端資料夾 %1 - + No remote folder specified! 沒有指定遠端資料夾! - + Error: %1 錯誤: %1 - + creating folder on Nextcloud: %1 正在Nextcloud上新增資料夾:%1 - + Remote folder %1 created successfully. 遠端資料夾%1建立成功! - + The remote folder %1 already exists. Connecting it for syncing. 遠端資料夾%1已存在,連線同步中 - - + + The folder creation resulted in HTTP error code %1 在HTTP建立資料夾失敗, error code %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> 由於帳號或密碼錯誤,遠端資料夾建立失敗<br/>請檢查您的帳號密碼。</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">遠端資料夾建立失敗,也許是因為所提供的帳號密碼錯誤</font><br/>請重新檢查您的帳號密碼</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. 建立遠端資料夾%1發生錯誤<tt>%2</tt>失敗 - + A sync connection from %1 to remote directory %2 was set up. 從%1到遠端資料夾%2的連線已建立 - + Successfully connected to %1! 成功連接到 %1 ! - + Connection to %1 could not be established. Please check again. 無法建立連線%1, 請重新檢查 - + Folder rename failed 重新命名資料夾失敗 - + Cannot 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. 無法移除與備份此資料夾,因為有其他的程式正在使用其中的資料夾或者檔案。請關閉使用中的資料夾或檔案並重試或者取消設定。 - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>近端同步資料夾 %1 建立成功!</b></font> @@ -3208,12 +3452,12 @@ Note that using any logging command line options will override this setting.取消 - + Enable experimental feature? 啟用實驗性功能? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3230,12 +3474,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 這是一種新的實驗模式。如果您決定使用它,請報告出現的任何問題。 - + Enable experimental placeholder mode 啟用實驗性佔位符模式 - + Stay safe 維持穩定 @@ -3264,162 +3508,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. 同步不支援符號連結 - + File is listed on the ignore list. 檔案被列在忽略清單。 - + File names ending with a period are not supported on this file system. 此檔案系統不支援以「。」結尾的檔案名。 - + File names containing the character "%1" are not supported on this file system. 此檔案系統不支援含 "%1" 字元的檔案名稱。 - + File name contains at least one invalid character 檔案名稱含有不合法的字元 - + The file name is a reserved name on this file system. 此檔案名已被此檔案系統保留所用。 - + Filename contains trailing spaces. 檔案名的結尾為空白符。 - + Filename contains leading spaces. 檔案名包含前導空格。 - + Filename contains leading and trailing spaces. 檔案名包含前導和尾隨空格。 - + Filename is too long. 檔案名稱太長。 - + File/Folder is ignored because it's hidden. 檔案或資料夾被隱藏,因此跳過 - + Stat failed. 狀態失敗。 - + Conflict: Server version downloaded, local copy renamed and not uploaded. 抵觸:已下載伺服器版本,近端版本已更名但並未上傳。 - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + 大小寫衝突:伺服器檔案已下載並重新命名以避免衝突。 + + + The filename cannot be encoded on your file system. 您的檔案系統無法對此檔案名進行編碼。 - + The filename is blacklisted on the server. 伺服器已將此檔名列為黑名單。 - + File has extension reserved for virtual files. 檔案名包含為虛擬檔案保留的擴展名。 - + size 大小 - + permission 權限 - + file id 檔案 ID - + Server reported no %1 伺服器報告沒有 %1 - + Cannot sync due to invalid modification time 由於修改時間無效,無法同步 - + Error while deleting file record %1 from the database 從數據庫中刪除檔案記錄 %1 時出錯 - + Conflict when uploading a folder. It's going to get cleared! 上傳資料夾時發生衝突。將被清除! - + Conflict when uploading a file. It's going to get removed! 上傳檔案時發生衝突。將被清除! - + Ignored because of the "choose what to sync" blacklist 被忽略,因為它在“選擇要同步的內容”黑名單中 - + Not allowed because you don't have permission to add subfolders to that folder 拒絕此操作,您沒有在此新增子資料夾的權限。 - + Not allowed because you don't have permission to add files in that folder 拒絕此操作,您沒有新增檔案在此資料夾的權限。 - + Not allowed to upload this file because it is read-only on the server, restoring 不允許上傳此檔案,因為它在伺服器上是唯讀的,正在還原 - + Moved to invalid target, restoring 已移至無效目標,正在還原 - + Not allowed to remove, restoring 不允許刪除,還原 - + Error while reading the database 讀取數據庫時發生錯誤。 - + Server replied with an error while reading directory "%1" : %2 伺服器在讀取目錄「%1」回覆錯誤:%2 @@ -3427,22 +3676,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB 無法從近端數據庫中刪除檔案 %1 - + Error updating metadata due to invalid modification time 由於修改時間無效,更新元數據時出錯。 - + Error updating metadata: %1 更新元數據時出錯:%1 - + File is currently in use 檔案正在使用中 @@ -3455,19 +3704,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss 無法從近端數據庫獲取檔案 %1 - + File %1 cannot be downloaded because encryption information is missing. %1檔案因缺乏加密資訊而未能下載。 - - + + File has changed since discovery 尋找的過程中檔案已經被更改 - + Could not delete file record %1 from local DB 無法從近端數據庫中刪除檔案 %1 @@ -3478,32 +3727,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss 檔案 %1 無法被下載,因為近端端的檔案名稱已毀損! - + File %1 can not be downloaded because of a local file name clash! 檔案 %1 無法被下載,因為近端端的檔案名稱已毀損! - + The download would reduce free local disk space below the limit 此項下載將會使剩餘的近端儲存空間降到低於限值 - + Free space on disk is less than %1 可用的硬碟空間已經少於 %1 - + File was deleted from server 檔案已從伺服器被刪除 - + The file could not be downloaded completely. 檔案下載無法完成。 - + The downloaded file is empty, but the server said it should have been %1. 已下載的檔案為空,儘管伺服器說檔案大小為%1。 @@ -3513,18 +3762,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 檔案 %1 無法存檔,因為近端端的檔案名稱已毀損! - - + + File %1 has invalid modified time reported by server. Do not save it. 伺服器報告檔案 %1 的修改時間無效。 不要保存它。 - + + File %1 downloaded but it resulted in a local file name clash! + 已下載檔案 %1,但其導致了近端檔案名稱衝突! + + + Error updating metadata: %1 更新元數據時出錯:%1 - + The file %1 is currently in use 檔案 %1 正在使用中 @@ -3545,7 +3799,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 無法刪除檔案 %1,錯誤: %2 @@ -3556,16 +3810,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + 無法建立資料夾 %1,因為近端檔案或資料夾名稱有衝突! + + + Could not create folder %1 無法建立資料夾 %1 - + Error updating metadata: %1 更新元數據時出錯:%1 - + The file %1 is currently in use 檔案 %1 正在使用中 @@ -3573,7 +3832,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash 無法刪除 %1 ,因為近端端的檔案名稱已毀損! @@ -3586,46 +3845,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash 檔案 %1 無法更名成 %2,因為近端端的檔案名稱已毀損 - - - + + File %1 downloaded but it resulted in a local file name clash! + 已下載檔案 %1,但其導致了近端檔案名稱衝突! + + + + + could not get file %1 from local DB 無法從近端數據庫獲取檔案 %1 - + Error setting pin state 設置PIN狀態時出錯 - - + + Error updating metadata: %1 更新元數據時出錯:%1 - + The file %1 is currently in use 檔案 %1 正在使用中 - - + + Could not delete file record %1 from local DB 無法從近端數據庫中刪除檔案 %1 - + Failed to propagate directory rename in hierarchy 未能在層次結構中傳播目錄重命名 - + Failed to rename file 重新命名檔案失敗 @@ -3646,7 +3910,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". 伺服器返回的 HTTP 代碼錯誤。預期 204,但收到“%1%2”。 @@ -3659,12 +3923,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 從伺服器端回傳錯誤的 HTTP 代碼, 預期是 201, 但是接收到的是 "%1 %2"。 - + Error writing metadata to the database: %1 將詮釋資料寫入到資料庫時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 正在使用中 @@ -3672,42 +3936,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 無法將 %1 重命名為 %2,錯誤:%3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". 從伺服器端回傳錯誤的 HTTP 代碼, 預期是 201, 但是接收到的是 "%1 %2"。 - + could not get file %1 from local DB 無法從近端數據庫獲取檔案 %1 - + Could not delete file record %1 from local DB 無法從近端數據庫中刪除檔案 %1 - + Error updating metadata: %1 更新元數據時出錯:%1 - + The file %1 is currently in use 檔案 %1 正在使用中 - + Error setting pin state 設置PIN狀態時出錯 - + Error writing metadata to the database 寫入後設資料(metadata)時發生錯誤 @@ -3897,7 +4161,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply 回覆 @@ -3915,23 +4179,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 設定 - + %1 Settings This name refers to the application name e.g Nextcloud %1 設定 - + General 一般 - + Network 網路 - + Account 賬戶 @@ -3939,17 +4203,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link 分享連結 - + Link share 連結分享 - + + Internal link + 內部連結 + + + Enter a note for the recipient 輸入給收件人的訊息 @@ -4025,7 +4294,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1(%2) @@ -4034,132 +4303,171 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + 無法加密位於“%1”的資料夾 + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + 賬戶 %1 沒有配置端到端加密。請在您的帳戶設置中配置此項以啟用資料夾加密。 + + + + Failed to encrypt folder + 加密資料夾失敗 + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + 無法加密以下資料夾:“%1”。 + +伺服器回覆了錯誤:%2 + + + + Folder encrypted successfully + 成功加密資料夾。 + + + + The following folder was encrypted successfully: "%1" + 以下資料夾已成功加密:“%1” + + + Context menu share 分享內容選單 - + Select new location … 選擇新位址... - + I shared something with you 我與你分享了檔案 - - + + Share options 分享選項 - - + + Activity 活動紀錄 - + Copy private link to clipboard 將私用連結複製至剪貼板 - + Send private link by email … 用電子郵件發送私人連結 + + + Expire in %1 minutes + remaining time before lock expire + %1 分鐘後過期 + - + Leave this share 離開此分享 - + Resharing this file is not allowed 此檔案不允許二次分享 - + Resharing this folder is not allowed 不允許重新分享此資料夾 - - + + Copy public link 複製公共連結 - + Copy internal link 複製內部連結 - + + Encrypt + 加密 + + + Lock file 鎖上檔案 - + Unlock file 解鎖檔案 - + Locked by %1 被 %1 鎖上 - - Expire in %1 minutes - remaining time before lock expire - %1 分鐘後過期 - - - + Expires in %1 minutes remaining time before lock expires %1 分鐘後過期 - + Edit 編輯 - + Open in browser 用瀏覽器打開 - + Resolve conflict … 解決抵觸 ... - + Move and rename … 移動並重新命名... - + Move, rename and upload … 移動、重新命名並上傳... - + Delete local changes 刪除近端變更 - + Move and upload … 移動並上傳... - + Delete 刪除 @@ -4377,63 +4685,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1(因先前錯誤而跳過,%2後重試) - + Could not update file: %1 無法更新檔案:%1 - + Could not update virtual file metadata: %1 無法更新虛擬文件元數據:%1 - + Could not update file metadata: %1 無法更新檔案元數據:%1 - + Could not set file record to local DB: %1 無法將檔案記錄設置到近端數據庫: %1 - + Unresolved conflict. 未解決的抵觸。 - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() 目前僅有 %1 可以使用,至少需要 %2 才能開始 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. 無法開啟或新增近端同步數據庫。請確保您有寫入同步資料夾的權限。 - + Using virtual files with suffix, but suffix is not set 使用帶後綴的虛擬文件,但未設置後綴 - + Unable to read the blacklist from the local database 無法從近端數據庫讀取黑名單。 - + Unable to read from the sync journal. 無法讀取同步日誌。 - + Cannot open the sync journal 同步處理日誌無法開啟 @@ -4443,12 +4751,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 同步會很快恢復 - + Disk space is low: Downloads that would reduce free space below %1 were skipped. 剩餘空間不足:下載後將使剩餘空間降至低於%1的檔案一律跳過。 - + There is insufficient space available on the server for some uploads. 伺服器上的剩餘空間不足以容納某些要上載的檔案。 @@ -4517,59 +4825,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download 下載 - + Add account 新增賬戶 - + Open main dialog 開啟主對話方塊 - - + + Pause sync 暫停同步 - - + + Resume sync 繼續同步 - + Settings 設定 - + Help 支援 - + Exit %1 離開 %1 - + Pause sync for all 暫停所有同步 - + Resume sync for all 恢復所有同步 - + %1: %2 %1:%2 @@ -4577,24 +4885,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 桌面版用戶端</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>版本為%1。詳細資訊請<a href='%2'>點擊此處</a>。</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>使用虛擬文件插件:%1</small></p> - + <p>This release was supplied by %1</p> 此版本由%1發佈。 @@ -4602,22 +4910,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. 無法擷取提供者。 - + Failed to fetch search providers for '%1'. Error: %2 無法擷取 “%1” 的搜尋提供者。 錯誤:%2 - + Search has failed for '%2'. 搜尋 “%2” 失敗。 - + Search has failed for '%1'. Error: %2 搜尋 “%1” 失敗。 錯誤:%2 @@ -4625,30 +4933,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads 重試所有上傳 + + + + Resolve conflict + 解決抵觸 + OCC::UserModel - + Confirm Account Removal 請確認移除賬戶 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您確定要移除<i>%1</i>的連線嗎?</p><p><b>提示:</b>這項操作不會刪除任何檔案</p> - + Remove connection 移除連線 - + Cancel 取消 @@ -4786,8 +5100,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time 由於修改時間無效,更新元數據時出錯。 @@ -4795,8 +5109,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time 由於修改時間無效,更新元數據時出錯。 @@ -4894,123 +5208,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version 不支援此伺服器版本 - + 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. %1 賬戶所在的伺服器正運行不受支援的舊版本 %2。此客戶端在該伺服器版本上未經測試,可能會有風險。請慎行。 - + Disconnected 已經離線 - + Disconnected from some accounts 已從一些賬戶斷開 - + Disconnected from %1 從 %1 斷線 - + Disconnected from accounts: 已從帳號離線: - + Account %1: %2 帳號 %1:%2 - + Please sign in 請登入 - + Signed out 已登出 - + Account synchronization is disabled 已禁用賬戶同步 - - + + Synchronization is paused 已暫停同步 - + Folder %1: %2 資料夾 %1:%2 - + Unresolved conflicts 未解決的抵觸 - + Up to date 最新的 - + Error during synchronization 同步時發生錯誤 - + There are no sync folders configured. 尚未設置同步資料夾。 - + No sync folders configured 尚未設定同步資料夾 - + Checking for changes in remote "%1" 正在檢查遠端「%1」中的變更 - + Checking for changes in local "%1" 檢查近端「%1」的變動 - + Syncing %1 of %2 (%3 left) 正在同步 %1,共%2(剩餘 %3) - + Syncing %1 of %2 正在同步第%1項,共%2項 - + Syncing %1 (%2 left) 正在同步%1(剩餘%2項) - + Syncing %1 正在同步%1 - + %1 (%2, %3) %1(%2,%3) @@ -5162,27 +5476,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss 新資料夾 - + You renamed %1 您已將 %1 重新命名 - + You deleted %1 您刪除了 %1 - + You created %1 您新增了 %1 - + You changed %1 您改變了 %1 - + Synced %1 已同步 %1 @@ -5248,30 +5562,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss 標為已讀 + + ShareDelegate + + + Create a new share link + 創建新分享連結 + + + + Copy share link location + 複製分享連結位置 + + + + Share options + 分享選項 + + + + ShareDetailsPage + + + An error occurred setting the share password. + 設置分享密碼時發生錯誤 + + + + Edit share + 編輯分享 + + + + Dismiss + 撤銷 + + + + Share label + 分享標籤 + + + + Allow editing + 允許編輯 + + + + Password protect + 密碼保護 + + + + Set expiration date + 設置屆滿日期 + + + + Note to recipient + 給收件人的訊息 + + + + Unshare + 撤回分享 + + + + Add another link + 添加另一個連結 + + + + Copy share link + 複製分享連結 + + ShareView - + Password required for new share 新分享需要密碼 - + Share password 分享密碼 - + Sharing is disabled 分享功能已停用 - + This item cannot be shared. 無法分享此項目。 - + Sharing is disabled. 分享功能已停用。 @@ -5287,7 +5677,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. 連接數據庫失敗。 @@ -5345,6 +5735,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 載入更多結果 + + UnifiedSearchResultNothingFound + + + No results for + 沒有結果 + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + 搜索結果部分 %1 + + UserLine @@ -5408,67 +5814,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status 線上狀態 - + Online 在線 - + Away 離開 - + Do not disturb 請勿打擾 - + Mute all notifications 靜音所有通知 - + Invisible 隱藏 - + Appear offline 顯示為離線 - + Status message 狀態訊息 - + What is your status? 您目前的狀態是什麼呢? - + Clear status message after 繼此之後清除狀態訊息 - + Cancel 取消 - + Clear status message 清除狀態訊息 - + Set status message 設定狀態訊息 @@ -5552,24 +5958,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloud 桌面版主對話框 - + Current account 目前賬戶 - - + + Resume sync for all 恢復所有同步 - - + + Pause sync for all 暫停所有同步 @@ -5579,22 +5985,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 設置用戶狀態 - + Add account 新增賬戶 - + Add new account 新增帳號 - + Settings 設定 - + Exit 離開 @@ -5603,11 +6009,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar 當前用戶虛擬化身大頭照 - - - Current account avatar - 目前賬戶虛擬化身大頭照 - Current user status is online @@ -5619,70 +6020,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss 目前用戶狀態為請勿打擾 - + + Current account avatar + 目前賬戶虛擬化身大頭照 + + + Current account status is online 目前賬戶狀態為在線 - + Current account status is do not disturb 目前帳戶狀態為請勿打擾 - + + %1 - File activity + %1 - 檔案活動紀錄 + + + Account switcher and settings menu 帳戶切換器和設置選項單 - + Open local folder of current account 打開當前賬戶的近端資料夾 - + Connected 已連線 - + Disconnected 已經離線 - + Open Nextcloud Talk in browser 瀏覽器中開啟 Nextclould Talk - + More apps 更多應用程式 - + Open %1 in browser 瀏覽器中開啟 %1 - + Unified search results list 統一搜索結果列表 - - - %1 - File activity - %1 - 檔案活動紀錄 - main.cpp - + System Tray not available 系統常駐程式無法使用 - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1需要可運作的系統常駐程式區。若您正在執行XFCE,請參考 <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">這份教學</a>。若非如此則請安裝一個系統常駐的應用程式,如 "trayer",並再度嘗試。 @@ -5690,7 +6096,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>根據Git版本號<a href="%1">%2</a>在 %3, %4建置 使用了Qt %5,%6</small></p> @@ -5724,72 +6130,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + 已下載伺服器上的版本,並將本機已更改的檔案複製至大小寫衝突檔案 + + + Deleted 已刪除 - + Moved to %1 搬移到 %1 - + Ignored 已忽略 - + Filesystem access error 存取檔案系統錯誤 - + Error 錯誤 - + Updated local metadata 近端元資料已更新 - + Unknown 未知 - + downloading 下載中 - + uploading 上傳中 - + deleting 刪除中 - + moving 搬移中 - + ignoring 忽略中 - + error 錯誤 - + updating local metadata 正在更新近端元資料 diff --git a/translations/client_zh_TW.ts b/translations/client_zh_TW.ts index ea6545847..94e6080b9 100644 --- a/translations/client_zh_TW.ts +++ b/translations/client_zh_TW.ts @@ -2,12 +2,12 @@ ActivityItem - + Open %1 locally 在本機開啟 %1 - + In %1 在 %1 @@ -15,8 +15,8 @@ ActivityItemActions - - + + Show more actions 顯示更多動作 @@ -24,10 +24,15 @@ ActivityItemContent - + Dismiss 忽略 + + + Open file details + 開啟檔案詳細資訊 + Open share dialog @@ -37,7 +42,7 @@ ActivityList - + Activity list 事件清單 @@ -50,7 +55,7 @@ BasicComboBox - + Clear status message menu 清除狀態訊息選單 @@ -189,12 +194,17 @@ FileDetailsPage - + + Dismiss + 忽略 + + + Activity 活動 - + Sharing 分享 @@ -226,12 +236,12 @@ 此平台不具有移至回收桶功能 - + Error removing "%1": %2 移除「%1」時發生錯誤:%2 - + Could not remove folder "%1" 無法移除資料夾「%1」 @@ -321,7 +331,7 @@ 伺服器回傳錯誤的 HTTP 代碼。預期為 204,但收到的是「%1 %2」。 - + "%1 Failed to unlock encrypted folder %2". 「%1 解鎖已加密的資料夾 %2 失敗」。 @@ -329,17 +339,17 @@ OCC::Account - + File %1 is already locked by %2. 檔案 %1 已被 %2 鎖定。 - + Lock operation on %1 failed with error %2 %1 的鎖定操作失敗,錯誤為 %2 - + Unlock operation on %1 failed with error %2 %1 的解除鎖定操作失敗,錯誤為 %2 @@ -353,9 +363,9 @@ - - - + + + Cancel 取消 @@ -400,12 +410,12 @@ 您似乎在此資料夾啟用了虛擬檔案的功能。目前無法下載透過端到端加密的虛擬檔案。為了得到最佳的虛擬檔案與端到端加密體驗,請確保已加密的資料夾被標記為「一律可在本機使用」。 - + End-to-end Encryption with Virtual Files 虛擬檔案的端到端加密 - + You seem to have the Virtual Files feature enabled on this folder. At the moment, it is not possible to implicitly download virtual files that are end-to-end encrypted. To get the best experience with virtual files and end-to-end encryption, make sure the encrypted folder is marked with "Make always available locally". 您似乎在此資料夾啟用了虛擬檔案的功能。目前無法下載透過端到端加密的虛擬檔案。為了得到最佳的虛擬檔案與端到端加密體驗,請確保已加密的資料夾被標記為「一律可在本機使用」。 @@ -415,29 +425,29 @@ 不加密資料夾 - + Do not encrypt folder 不要加密資料夾 - + Encrypt folder 加密資料夾 - + No account configured. 未設定帳號。 - - Display mnemonic - 顯示助記碼 + + Disable encryption + 停用加密 - End-to-end encryption has been enabled for this account - 此帳號已啟用端到端加密 + Display mnemonic + 顯示助記碼 @@ -445,19 +455,24 @@ 啟用加密 - + + End-to-end encryption has been enabled for this account + 此帳號已啟用端到端加密 + + + Warning 警告 - + End-to-end encryption is not configured on this device. Once it is configured, you will be able to encrypt this folder. Would you like to set up end-to-end encryption? 端到端加密尚未在此裝置上設定。一旦其設定好,您將可以加密此資料夾。 您想要設定端到端加密嗎? - + You cannot encrypt a folder with contents, please remove the files. Wait for the new sync, then encrypt it. 您無法加密有內容的資料夾,請移除檔案。 @@ -470,121 +485,121 @@ Wait for the new sync, then encrypt it. 此帳號支援端到端加密 - + Encryption failed 加密失敗 - + Could not encrypt folder because the folder does not exist anymore 無法加密資料夾,因為該資料夾不存在 - - + + Open folder 開啟資料夾 - + Encrypt 加密 - - + + Edit Ignored Files 編輯要忽視的檔案 - - + + Create new folder 建立新資料夾 - - + + Availability 可用性 - + Choose what to sync 選擇要同步的項目 - + Force sync now 強制同步 - + Restart sync 重新啟動同步 - + Resume sync 繼續同步 - + Pause sync 暫停同步 - + Remove folder sync connection 移除資料夾同步連線 - + Disable virtual file support … 停用虛擬檔案支援…… - + Enable virtual file support %1 … 啟用虛擬檔案支援 %1…… - + (experimental) (實驗性) - + Folder creation failed 資料夾建立失敗 - + <p>Could not create local folder <i>%1</i>.</p> <p>無法建立本機資料夾<i>%1</i>。</p> - + Confirm Folder Sync Connection Removal 確認移除資料夾同步連線 - + <p>Do you really want to stop syncing the folder <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您真的想要停止同步資料夾 <i>%1</i> 嗎?</p><p><b>注意:</b>這<b>不會</b>刪除任何檔案。</p> - + Remove Folder Sync Connection 移除資料夾同步連線 - + Disable virtual file support? 停用虛擬檔案支援? - + This action will disable virtual file support. As a consequence contents of folders that are currently marked as "available online only" will be downloaded. The only advantage of disabling virtual file support is that the selective sync feature will become available again. @@ -597,7 +612,7 @@ This action will abort any currently running synchronization. 此動作將會中止任何目前正在執行的同步。 - + Disable support 停用支援 @@ -607,145 +622,177 @@ This action will abort any currently running synchronization. 端到端加密助記詞 - + End-to-end encryption mnemonic 端到端加密助記字串 - + To protect your Cryptographic Identity, we encrypt it with a mnemonic of 12 dictionary words. Please note these down and keep them safe. They will be needed to add other devices to your account (like your mobile phone or laptop). 為了保護您的身份,我們將用含 12 個單詞的助記詞進行加密。請將這些單詞記在一個安全的地方。要將其他裝置(如手機或筆記型電腦)加入您的帳號中,需用到此助記詞。 - + + Disable end-to-end encryption + 停用端到端加密 + + + + Disable end-to-end encryption for %1? + 停用 %1 的端到端加密? + + + + Removing end-to-end encryption will remove locally-synced files that are encrypted.<br>Encrypted files will remain on the server. + 移除端到端加密將會移除本機同步的加密檔案。<br>加密檔案將會保留在伺服器上。 + + + Sync Running 正在執行同步 - + The syncing operation is running.<br/>Do you want to terminate it? 正在執行同步動作。<br/>您真的想要中斷嗎? - + %1 (%3%) of %2 in use. Some folders, including network mounted or shared folders, might have different limits. %1 (%3%) 中的 %2 正在使用, 有些資料夾,包括網路掛載或分享資料夾,可能有不同的限制。 - + %1 of %2 in use 已使用 %2 中的 %1% - + Currently there is no storage usage information available. 目前無法查詢儲存空間使用資訊。 - + %1 in use %1 正在使用 - + %1 as %2 %1 作為 %2 - + The server version %1 is unsupported! Proceed at your own risk. 已不支援伺服器版本 %1!繼續的風險請自負。 - + Connected to %1. 已連線到 %1 - + Server %1 is temporarily unavailable. 伺服器 %1 暫時無法使用。 - + Server %1 is currently in maintenance mode. 伺服器 %1 目前正處於維護模式。 - + Signed out from %1. 從 %1 登出。 - + Obtaining authorization from the browser. <a href='%1'>Click here</a> to re-open the browser. 正在從瀏覽器取得授權。<a href='%1'>點擊此處</a>以重新開啟瀏覽器。 - + Connecting to %1 … 正在連線到 %1…… - + No connection to %1 at %2. 在 %2 沒有連線到 %1。 - + Server configuration error: %1 at %2. 伺服器設定錯誤:%1 於 %2。 - + No %1 connection configured. 未設定 %1 連線。 - + There are folders that were not synchronized because they are too big: 有部份的資料夾因為容量太大沒有辦法同步: - + There are folders that were not synchronized because they are external storages: 有部分資料夾因為是外部儲存空間沒有辦法同步: - + There are folders that were not synchronized because they are too big or external storages: 有部分資料夾因為容量太大或是外部儲存空間沒有辦法同步: - + Confirm Account Removal 確認移除帳號 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您真的想要移除到帳號 <i>%1</i> 的連線嗎?</p><p><b>注意:</b>這<b>不會</b>刪除任何檔案。</p> - + Remove connection 移除連線 - - + This account supports end-to-end encryption 此帳號支援端點對端點加密 - + Set up encryption 設定加密 - - End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic. - 已在其他裝置上為此帳號啟用端到端加密。<br>可透過輸入您的助記字串在此裝置上啟用。 + + End-to-end encryption has been enabled on this account with another device.<br>It can be enabled on this device by entering your mnemonic.<br>This will enable synchronisation of existing encrypted folders. + 已在其他裝置上為此帳號啟用端到端加密。<br>可透過輸入您的助記字串在此裝置上啟用。<br>這將啟用現有加密資料夾的同步。 + + + + OCC::AccountSetupFromCommandLineJob + + + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. + 對伺服器的已驗證請求將會被重新導向至「%1」。URL 錯誤,伺服器設定錯誤。 + + + + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. + 伺服器禁止存取。為了驗證您是否有適當的存取權限,<a href="%1">點擊此處</a>以使用您的瀏覽器存取服務。 + + + + There was an invalid response to an authenticated WebDAV request + 伺服器回應 WebDAV 驗證請求無效 @@ -799,7 +846,7 @@ This action will abort any currently running synchronization. OCC::ActivityListModel - + For more activities please open the Activity app. 請開啟活動應用程式以檢視更多活動。 @@ -809,12 +856,12 @@ This action will abort any currently running synchronization. 正在擷取活動紀錄…… - + Fetching activities … 正在擷取活動紀錄…… - + Files from the ignore list as well as symbolic links are not synced. 忽略列表中的檔案與符號連結不會同步。 @@ -865,32 +912,59 @@ This action will abort any currently running synchronization. OCC::Application - + Continuing will mean <b>deleting these settings</b>. 繼續代表了<b>刪除這些設定</b>。 - + Continuing will mean <b>ignoring these settings</b>. 繼續代表了<b>忽略這些設定</b>。 - + 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>. 部份設定是在此客戶端的較新版本中設定的,且使用了此版本不提供的功能。<br><br>%1<br><br>目前的設定檔已備份至 <i>%2</i>。 - + + Some settings were configured in %1 versions of this client and use features that are not available in this version.<br><br>Continuing will mean <b>%2 these settings</b><br><br>The current configuration file was already backed up to <i>%3</i>. + + + + + newer + newer software version + + + + + older + older software version + + + + + ignoring + + + + + deleting + + + + Quit 離開 - + Continue 繼續 - + Error accessing the configuration file 存取設定檔時發生錯誤 @@ -900,12 +974,12 @@ This action will abort any currently running synchronization. 存取位於 %1 的設定檔時發生錯誤。請確保您的使用者可以存取該檔案。 - + There was an error while accessing the configuration file at %1. Please make sure the file can be accessed by your system account. 存取位於 %1 的設定檔時發生錯誤。請確保您的系統帳號可以存取該檔案。 - + Quit %1 離開 %1 @@ -951,56 +1025,216 @@ This action will abort any currently running synchronization. 檔案 %1 的修改時間無效。不要上傳到伺服器。 - + File Removed (start upload) %1 已移除檔案(開始上傳)%1 - + File %1 has invalid modification time. Do not upload to the server. 檔案 %1 的修改時間無效。不要上傳到伺服器。 - + Local file changed during syncing. It will be resumed. 本機檔案在同步的過程中被修改。其將會被復原。 - - + + Local file changed during sync. 本機檔案在同步的過程中被修改。 - + Network error: %1 網路錯誤:%1 - + Error updating metadata: %1 更新詮釋資料時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 目前使用中 - + The local file was removed during sync. 本機檔案在同步的過程中被移除。 - + Restoration failed: %1 還原失敗:%1 + + OCC::CaseClashConflictSolver + + + Cannot rename file because a file with the same name does already exist on the server. Please pick another name. + 無法重新命名檔案,因為伺服器上已有同名檔案。請換一個名字。 + + + + Could not rename file. Please make sure you are connected to the server. + 無法重新命名檔案。請確保您已連線至伺服器。 + + + + You don't have the permission to rename this file. Please ask the author of the file to rename it. + 您無權重新命名此檔案。請要求檔案的作者重新命名它。 + + + + Failed to fetch permissions with error %1 + 擷取權限失敗,錯誤 %1 + + + + Filename contains leading and trailing spaces. + 檔案名稱包含了前導及結尾空格。 + + + + Filename contains leading spaces. + 檔案名稱包含了前導空格。 + + + + Filename contains trailing spaces. + 檔案名稱包含了結尾空格。 + + + + OCC::CaseClashFilenameDialog + + + Case Clash Conflict + 大小寫衝突 + + + + The file could not be synced because it generates a case clash conflict with an existing file on this system. + 無法同步檔案,因為其會與該系統上既有的檔案產生大小寫衝突。 + + + + Error + 錯誤 + + + + Existing file + 既有檔案 + + + + file A + 檔案 A + + + + fileA + fileA + + + + + today + 今天 + + + + + 0 byte + 0 位元組 + + + + + Open existing file + 開啟既有檔案 + + + + Case clashing file + 大小寫衝突檔案 + + + + file B + 檔案 B + + + + fileB + fileB + + + + + Open clashing file + 開啟衝突檔案 + + + + Please enter a new name for the clashing file: + 請輸入衝突檔案的新名稱: + + + + New filename + 新檔案名稱 + + + + Rename file + 重新命名檔案 + + + + The file "%1" could not be synced because of a case clash conflict with an existing file on this system. + 無法同步檔案「%1」,因為其會與該系統上既有的檔案產生大小寫衝突。 + + + + %1 does not support equal file names with only letter casing differences. + %1 不支援僅字母大小寫不同的檔案名稱。 + + + + Filename contains leading and trailing spaces. + 檔案名稱包含了前導及結尾空格。 + + + + Filename contains leading spaces. + 檔案名稱包含了前導空格。 + + + + Filename contains trailing spaces. + 檔案名稱包含了結尾空格。 + + + + Use invalid name + 使用無效名稱 + + + + Filename contains illegal characters: %1 + 檔案名稱包含了非法字元:%1 + + OCC::CleanupPollsJob - + Error writing metadata to the database 將詮釋資料寫入到資料庫時發生錯誤 @@ -1018,12 +1252,12 @@ This action will abort any currently running synchronization. 請輸入您的端到端加密認證資訊:<br><br>使用者:%2<br>帳號:%3<br> - + Please enter your end-to-end encryption passphrase:<br><br>Username: %2<br>Account: %3<br> 請輸入您的端到端加密通關密語:<br><br>使用者名稱:%2<br>帳號:%3<br> - + Enter E2E passphrase 輸入端到端加密認證資訊 @@ -1199,8 +1433,8 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleDirectoryJob - - + + Server error: PROPFIND reply is not XML formatted! 伺服器錯誤:PROPFIND 回覆未使用 XML 格式! @@ -1208,27 +1442,27 @@ This action will abort any currently running synchronization. OCC::DiscoverySingleLocalDirectoryJob - + Error while opening directory %1 開啟目錄 %1 時發生錯誤 - + Directory not accessible on client, permission denied 客戶端無法存取目錄,權限被拒 - + Directory not found: %1 找不到目錄:%1 - + Filename encoding is not valid 檔案名稱編碼無效 - + Error while reading directory %1 讀取目錄 %1 時發生錯誤 @@ -1236,91 +1470,91 @@ This action will abort any currently running synchronization. OCC::EditLocallyJob - + Invalid token received. 收到無效的權杖。 - - - - - - + + + + + + Please try again. 請再試一次。 - + Invalid file path was provided. 提供了無效的檔案路徑。 - + Could not find an account for local editing. 找不到用於本機編輯的帳號。 - - + + Could not validate the request to open a file from server. 無法驗證從伺服器開啟檔案的請求。 - - + + Could not find a file for local editing. Make sure its path is valid and it is synced locally. 找不到用於本機編輯的檔案。請確保其路徑有效且在本機同步。 - - - - + + + + Could not find a file for local editing. Make sure it is not excluded via selective sync. 找不到用於本機編輯的檔案。請確保其沒有被選擇性同步排除。 - + Server error: PROPFIND reply is not XML formatted! 伺服器錯誤:PROPFIND 回覆不是 XML 格式! - + Could not find a remote file info for local editing. Make sure its path is valid. 找不到用於本機編輯的遠端檔案資訊。請確保其路徑有效。 - + Could not open %1 - + 無法開啟 %1 - + File %1 already locked. - + 檔案 %1 已被鎖定。 - - + + Lock will last for %1 minutes. You can also unlock this file manually once you are finished editing. - + 鎖定將會持續 %1 分鐘。一旦您完成編輯,您也可以手動解鎖此檔案。 - + File %1 now locked. - + 檔案 %1 現在已被鎖定。 - + File %1 could not be locked. - + 檔案 %1 無法被鎖定。 OCC::EncryptFolderJob - + Could not generate the metadata for encryption, Unlocking the folder. This can be an issue with your OpenSSL libraries. 無法生成用於加密的詮釋資料,正在解鎖資料夾。 @@ -1450,145 +1684,145 @@ This can be an issue with your OpenSSL libraries. OCC::Folder - + Local folder %1 does not exist. 本機資料夾 %1 不存在。 - + %1 should be a folder but is not. %1 應該是資料夾,但並不是。 - + %1 is not readable. %1 不可讀。 - + %1 and %n other file(s) have been removed. 已移除 %1 跟 %n 個其他檔案。 - + %1 has been removed. %1 names a file. 已移除 %1。 - + %1 and %n other file(s) have been added. 已新增 %1 跟 %n 個其他檔案。 - + %1 has been added. %1 names a file. 已新增 %1。 - + %1 and %n other file(s) have been updated. 已更新 %1 跟 %n 個其他檔案。 - + %1 has been updated. %1 names a file. 已更新 %1。 - + %1 has been renamed to %2 and %n other file(s) have been renamed. %1 已被更名為 %2,其他 %n 個檔案也被更名。 - + %1 has been renamed to %2. %1 and %2 name files. %1 已被重新命名為 %2。 - + %1 has been moved to %2 and %n other file(s) have been moved. %1 已被移動到 %2,其他 %n 個檔案也被移動。 - + %1 has been moved to %2. %1 已被移動到 %2。 - + %1 has and %n other file(s) have sync conflicts. %1 跟 %n 個其他檔案同步時發生衝突。 - + %1 has a sync conflict. Please check the conflict file! %1 同步時發生衝突。請檢查發生衝突的檔案! - + %1 and %n other file(s) could not be synced due to errors. See the log for details. %1 跟 %n 個其他檔案因為錯誤無法被同步。請檢視紀錄檔以取得詳細資訊。 - + %1 could not be synced due to an error. See the log for details. %1 因為錯誤無法被同步。請檢視紀錄檔以取得詳細資訊。 - + %1 and %n other file(s) are currently locked. %1 跟 %n 個其他檔案正在被鎖定狀態。 - + %1 is currently locked. %1 目前已被鎖定。 - + Sync Activity 同步活動 - + Could not read system exclude file 無法讀取系統的排除檔案 - + A new folder larger than %1 MB has been added: %2. 一個大於 %1 MB 的資料夾已被新增至:%2 - + A folder from an external storage has been added. 一個來自外部空間的資料夾已被新增。 - + Please go in the settings to select it if you wish to download it. 若要下載此項目,請前往設定選擇它。 - + The folder %1 was created but was excluded from synchronization previously. Data inside it will not be synchronized. 已建立 %1 資料夾,但先前已從同步中排除。因此其中的資料將不會被同步。 - + The file %1 was created but was excluded from synchronization previously. It will not be synchronized. 已建立 %1 檔案,但先前已從同步中排除。因此其中的資料將不會被同步。 - + 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). @@ -1601,7 +1835,7 @@ This means that the synchronization client might not upload local changes immedi %1 - + 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 restore the files, they will be re-synced with the server if you have rights to do so. @@ -1612,7 +1846,7 @@ If you decide to delete the files, they will be unavailable to you, unless you a 假如您決定移除這些檔案,除非您是檔案的所有者,否則您將無法讀取這些檔案。 - + 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. @@ -1621,17 +1855,17 @@ If this was an accident and you decide to keep your files, they will be re-synce 如果這是意外,而且您決定保留您的檔案,它們將會自伺服器重新同步。 - + Remove All Files? 移除所有檔案? - + Remove all files 移除所有檔案 - + Keep files 保留檔案 @@ -1667,22 +1901,22 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderMan - + Could not reset folder state 無法重設資料夾狀態 - + An old sync journal "%1" was found, but could not be removed. Please make sure that no application is currently using it. 發現較舊的同步處理日誌「%1」,但無法移除。請確認沒有應用程式正在使用它。 - + (backup) (備份) - + (backup %1) (備份 %1) @@ -1692,27 +1926,27 @@ If this was an accident and you decide to keep your files, they will be re-synce 未定義狀態。 - + Undefined state. 未定義狀態。 - + Waiting to start syncing. 正在等待同步開始。 - + Preparing for sync. 正在準備同步。 - + Sync is running. 正在執行同步。 - + Sync finished with unresolved conflicts. 同步完成,但有未解決的衝突。 @@ -1732,62 +1966,62 @@ If this was an accident and you decide to keep your files, they will be re-synce 使用者中斷。 - + Last sync was successful. 上次同步成功。 - + Setup error. 設定錯誤。 - + Sync request was cancelled. 同步請求已取消。 - + Sync is paused. 同步已暫停。 - + %1 (Sync is paused) %1(同步已暫停) - + No valid folder selected! 未選取有效的資料夾! - + The selected path does not exist! 所選的路徑不存在! - + The selected path is not a folder! 所選的路徑並非資料夾! - + You have no permission to write to the selected folder! 您沒有權限來寫入被選取的資料夾! - + The local folder %1 already contains a folder used in a folder sync connection. Please pick another one! 本地資料夾 %1 裡已經有被資料夾同步功能使用的資料夾,請選擇其他資料夾! - + The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one! 本地資料夾 %1 是被包含在一個已經被資料夾同步功能使用的資料夾,請選擇其他資料夾! - + There is already a sync from the server to this local folder. Please pick another local folder! 此本機資料夾已設定為從伺服器同步。請挑選其他本機資料夾! @@ -1800,7 +2034,7 @@ If this was an accident and you decide to keep your files, they will be re-synce 新增資料夾同步功能的連線 - + File 檔案 @@ -1808,152 +2042,156 @@ If this was an accident and you decide to keep your files, they will be re-synce OCC::FolderStatusModel - + You need to be connected to add a folder 您必須連上伺服器才能新增資料夾 - + Click this button to add a folder to synchronize. 點擊此按鈕來新增同步資料夾 - - + + Could not decrypt! + 無法解密! + + + + %1 (%2) - Example text: "File.txt (23KB)" %1 (%2) - + Error while loading the list of folders from the server. 從伺服器端同步資料夾列表時發生錯誤。 - + Fetching folder list from server … 正在從伺服器擷取資料夾列表…… - + There are unresolved conflicts. Click for details. 有未解決的衝突。點擊以檢視詳細資訊。 - + Virtual file support is enabled. 已啟用虛擬檔案支援。 - + Signed out 已登出 - + Synchronizing VirtualFiles with local folder 與本機資料夾同步虛擬檔案 - + Synchronizing with local folder 與本機資料夾同步 - + Checking for changes in remote "%1" 正在檢查遠端「%1」的變動 - + Checking for changes in local "%1" 正在檢查本機「%1」的變動 - + Reconciling changes 正在排解更動 - + Syncing %1 Example text: "Syncing 'foo.txt', 'bar.txt'" 正在同步 %1 - - + + , , - + download %1/s Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated)) 下載 %1/秒 - + ↓ %1/s ↓ %1/秒 - + upload %1/s Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated)) 上傳 %1/秒 - + ↑ %1/s ↑ %1/秒 - + %1 %2 (%3 of %4) Example text: "uploading foobar.png (2MB of 2MB)" %1 %2(%3 的 %4) - + %1 %2 Example text: "uploading foobar.png" %1 %2 - + A few seconds left, %1 of %2, file %3 of %4 Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7" 將在幾秒內完成,%2 之 %1, 檔案 %4 之 %3 - + %5 left, %1 of %2, file %3 of %4 剩餘%5,%1 的 %2,檔案 %3 的 %4 - + %1 of %2, file %3 of %4 Example text: "12 MB of 345 MB, file 6 of 7" %1 的 %2,檔案 %3 的 %4 - + file %1 of %2 檔案 %1 的 %2 - + Waiting … 請稍候…… - + Waiting for %n other folder(s) … 正在等待其他 %n 個資料夾…… - + Preparing to sync … 正在準備同步…… @@ -2184,13 +2422,13 @@ If this was an accident and you decide to keep your files, they will be re-synce - + stable 穩定版 - + beta 測試版 @@ -2242,32 +2480,32 @@ If this was an accident and you decide to keep your files, they will be re-synce - + Create Debug Archive 建立除錯壓縮檔 - + Server notifications that require attention. 需要注意的伺服器通知。 - + Show call notification dialogs. 顯示來電通知對話方塊。 - + You cannot disable autostart because system-wide autostart is enabled. 您無法停用自動啟動,因為已啟用系統層面的自動啟動。 - + Change update channel? 變更更新頻道? - + 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. 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. @@ -2276,27 +2514,27 @@ Note that this selects only what pool upgrades are taken from, and that there ar 請注意,這只是選取從哪個軟體庫中取得升級,無法降級,因此通常無法立刻從測試頻道回到穩定頻道,這代表了要等到比目前測試版本還新的穩定版本才會切換成功。 - + Change update channel 變更更新頻道 - + Cancel 取消 - + Zip Archives ZIP 壓縮檔 - + Debug Archive Created 已建立除錯壓縮檔 - + Debug archive is created at %1 除錯壓縮檔已在 %1 建立 @@ -2304,22 +2542,22 @@ Note that this selects only what pool upgrades are taken from, and that there ar OCC::GetOrCreatePublicLinkShare - + Password for share required 透過密碼保護分享連結 - + Please enter a password for your link share: 請輸入分享連結密碼: - + Sharing error 分享發生錯誤 - + Could not retrieve or create the public link share. Error: %1 @@ -2557,6 +2795,11 @@ Items where deletion is allowed will be deleted if they prevent a directory from Close 關閉 + + + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2023 Nextcloud GmbH<br />Copyright 2012-2023 ownCloud GmbH</p> + <p>Copyright 2017-2021 Nextcloud GmbH<br />Copyright 2012-2021 ownCloud GmbH</p> @@ -2892,60 +3135,60 @@ Note that using any logging command line options will override this setting. - + Use &virtual files instead of downloading content immediately %1 使用虛擬檔案取代立即下載內容 %1 (&V) - + (experimental) (實驗性) - + Virtual files are not supported for Windows partition roots as local folder. Please choose a valid subfolder under drive letter. Windows 分割區跟目錄不支援將虛擬檔案作為本機資料夾使用。請在磁碟區代號下選擇有效的子資料夾。 - + %1 folder "%2" is synced to local folder "%3" %1 資料夾「%2」與本機資料夾「%3」同步 - + Sync the folder "%1" 同步資料夾「%1」 - + Warning: The local folder is not empty. Pick a resolution! 警告:本機的資料夾不是空的。請選擇解決方案! - + %1 free space %1 gets replaced with the size and a matching unit. Example: 3 MB or 5 GB %1 剩餘空間 - + Virtual files are not available for the selected folder 選取的資料夾無法使用虛擬檔案 - + Local Sync Folder 本機同步資料夾 - - + + (%1) (%1) - + There isn't enough free space in the local folder! 本機資料夾沒有足夠的剩餘空間! @@ -3017,7 +3260,8 @@ Note that using any logging command line options will override this setting. OCC::OwncloudPropagator - + + Impossible to get modification time for file in conflict %1 無法取得衝突 %1 檔案的修改時間 @@ -3049,144 +3293,144 @@ Note that using any logging command line options will override this setting. OCC::OwncloudSetupWizard - + <font color="green">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/> <font color="green">成功連線到 %1:%2 版本 %3 (%4)</font><br/><br/> - + Invalid URL 連結無效 - + Failed to connect to %1 at %2:<br/>%3 從 %2 連線到 %1 失敗:<br/>%3 - + Timeout while trying to connect to %1 at %2. 從 %2 嘗試連線到 %1 逾時。 - + Trying to connect to %1 at %2 … 嘗試以 %1 身分連線到 %2…… - + The authenticated request to the server was redirected to "%1". The URL is bad, the server is misconfigured. 伺服器要求的認證請求被導向「%1」。這個網址可能不安全,此伺服器可能設定有錯。 - + Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser. 從伺服器存取被拒絕。為了正確驗證您的存取資訊,<a href="%1">請點選這裡</a>透過瀏覽器來存取服務。 - + There was an invalid response to an authenticated WebDAV request 伺服器回應 WebDAV 驗證請求無效 - + Local sync folder %1 already exists, setting it up for sync.<br/><br/> 本機同步資料夾 %1 已存在,將其設定為同步。<br/><br/> - + Creating local sync folder %1 … 正在新增本機同步資料夾 %1…… - + OK 確定 - + failed. 失敗。 - + Could not create local folder %1 無法建立本機資料夾 %1 - + No remote folder specified! 未指定遠端資料夾! - + Error: %1 錯誤:%1 - + creating folder on Nextcloud: %1 正在 Nextcloud 上建立資料夾:%1 - + Remote folder %1 created successfully. 遠端資料夾 %1 成功建立。 - + The remote folder %1 already exists. Connecting it for syncing. 遠端資料夾 %1 已存在。正在連線同步。 - - + + The folder creation resulted in HTTP error code %1 資料夾建立結果為 HTTP 錯誤碼 %1 - + The remote folder creation failed because the provided credentials are wrong!<br/>Please go back and check your credentials.</p> 由於帳號或密碼錯誤,遠端資料夾建立失敗!<br/>請檢查您的帳號密碼。</p> - + <p><font color="red">Remote folder creation failed probably because the provided credentials are wrong.</font><br/>Please go back and check your credentials.</p> <p><font color="red">遠端資料夾建立失敗,也許是因為所提供的帳號密碼錯誤。</font><br/>請重新檢查您的帳號密碼。</p> - - + + Remote folder %1 creation failed with error <tt>%2</tt>. 建立遠端資料夾 %1 時發生錯誤 <tt>%2</tt>。 - + A sync connection from %1 to remote directory %2 was set up. 從 %1 到遠端資料夾 %2 的連線已建立。 - + Successfully connected to %1! 成功連線至 %1! - + Connection to %1 could not be established. Please check again. 無法建立到 %1 的連線。請再檢查一次。 - + Folder rename failed 重新命名資料夾失敗 - + Cannot 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. 無法移除與備份此資料夾,因為有其他的程式正在使用其中的資料夾或者檔案。請關閉使用中的資料夾或檔案並重試或者取消設定。 - + <font color="green"><b>Local sync folder %1 successfully created!</b></font> <font color="green"><b>本機同步資料夾 %1 建立成功!</b></font> @@ -3209,12 +3453,12 @@ Note that using any logging command line options will override this setting.取消 - + Enable experimental feature? 啟用實驗性功能? - + 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. The virtual files mode is mutually exclusive with selective sync. Currently unselected folders will be translated to online-only folders and your selective sync settings will be reset. @@ -3231,12 +3475,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 這是一種新的、實驗性的模式。如果您決定要使用它,請回報出現的任何問題。 - + Enable experimental placeholder mode 啟用實驗性的佔位模式 - + Stay safe 注意安全 @@ -3265,162 +3509,167 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ProcessDirectoryJob - + Symbolic links are not supported in syncing. 同步不支援符號連結。 - + File is listed on the ignore list. 檔案被列在忽略清單。 - + File names ending with a period are not supported on this file system. 此檔案系統不支援以「.」結尾的檔案名。 - + File names containing the character "%1" are not supported on this file system. 此檔案系統不支援包含「%1」字元的檔案名稱。 - + File name contains at least one invalid character 檔案名稱包含至少一個無效的字元 - + The file name is a reserved name on this file system. 此檔案名稱為檔案系統的保留名稱。 - + Filename contains trailing spaces. 檔案名稱的結尾為空格。 - + Filename contains leading spaces. 檔案名稱包含了前導空格。 - + Filename contains leading and trailing spaces. 檔案名稱包含了前導及結尾空格。 - + Filename is too long. 檔案名稱太長。 - + File/Folder is ignored because it's hidden. 因為檔案或資料夾被隱藏,因此被忽略。 - + Stat failed. 統計失敗。 - + Conflict: Server version downloaded, local copy renamed and not uploaded. 衝突:已下載伺服器的版本,本機版本已更名但並未上傳。 - + + Case Clash Conflict: Server file downloaded and renamed to avoid clash. + 大小寫衝突:伺服器檔案已下載並重新命名以避免衝突。 + + + The filename cannot be encoded on your file system. 您的檔案系統無法對此檔案名進行編碼。 - + The filename is blacklisted on the server. 伺服器已將此檔名列為黑名單。 - + File has extension reserved for virtual files. 檔案有為虛擬檔案保留的副檔名。 - + size 大小 - + permission 權限 - + file id 檔案 ID - + Server reported no %1 伺服器回報沒有 %1 - + Cannot sync due to invalid modification time 由於修改時間無效,因此無法同步 - + Error while deleting file record %1 from the database 從資料庫刪除紀錄 %1 時發生錯誤 - + Conflict when uploading a folder. It's going to get cleared! 上傳資料夾時發生衝突。將會被清除! - + Conflict when uploading a file. It's going to get removed! 上傳檔案時發生衝突。其將會被移除! - + Ignored because of the "choose what to sync" blacklist 由於「選擇要同步的內容」黑名單而被忽略 - + Not allowed because you don't have permission to add subfolders to that folder 不允許,因為您無權新增子資料夾到該資料夾 - + Not allowed because you don't have permission to add files in that folder 不允許,因為您無權新增檔案到該資料夾 - + Not allowed to upload this file because it is read-only on the server, restoring 不允許上傳此檔案,因為這在伺服器上是唯讀,正在復原 - + Moved to invalid target, restoring 移動至無效目標,正在復原 - + Not allowed to remove, restoring 不允許刪除,正在復原 - + Error while reading the database 讀取資料庫時發生錯誤 - + Server replied with an error while reading directory "%1" : %2 伺服器在讀取目錄「%1」回覆錯誤:%2 @@ -3428,22 +3677,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateDirectory - + could not delete file %1 from local DB 無法從本機資料庫中刪除檔案 %1 - + Error updating metadata due to invalid modification time 因為修改時間無效,所以更新詮釋資料時發生錯誤 - + Error updating metadata: %1 更新詮釋資料時發生錯誤:%1 - + File is currently in use 檔案目前正在使用中 @@ -3456,19 +3705,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss 無法從本機資料庫取得檔案 %1 - + File %1 cannot be downloaded because encryption information is missing. %1 檔案因為缺少加密資訊而無法下載。 - - + + File has changed since discovery 尋找的過程中檔案已經被更改 - + Could not delete file record %1 from local DB 無法從本機資料庫刪除檔案紀錄 %1 @@ -3479,32 +3728,32 @@ This is a new, experimental mode. If you decide to use it, please report any iss 檔案 %1 無法被下載,因為本機檔案名稱有衝突! - + File %1 can not be downloaded because of a local file name clash! 檔案 %1 無法被下載,因為本機檔案名稱有衝突! - + The download would reduce free local disk space below the limit 下載將會減少剩餘的本機磁碟空間,使其低於限制 - + Free space on disk is less than %1 可用的磁碟空間已經少於 %1 - + File was deleted from server 檔案已從伺服器刪除 - + The file could not be downloaded completely. 檔案下載無法完成。 - + The downloaded file is empty, but the server said it should have been %1. 已下載的檔案為空,但伺服器表示其應為 %1。 @@ -3514,18 +3763,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 檔案 %1 無法儲存,因為本機檔案名稱有衝突! - - + + File %1 has invalid modified time reported by server. Do not save it. 伺服器回報檔案 %1 的修改時間無效。不要儲存。 - + + File %1 downloaded but it resulted in a local file name clash! + 已下載檔案 %1,但其導致了本機檔案名稱衝突! + + + Error updating metadata: %1 更新詮釋資料時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 目前正在使用中 @@ -3546,7 +3800,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalMkdir - + could not delete file %1, error: %2 無法刪除檔案 %1,錯誤:%2 @@ -3557,16 +3811,21 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Folder %1 cannot be created because of a local file or folder name clash! + 無法建立資料夾 %1,因為本機檔案或資料夾名稱有衝突! + + + Could not create folder %1 無法建立資料夾 %1 - + Error updating metadata: %1 更新詮釋資料時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 目前正在使用中 @@ -3574,7 +3833,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRemove - + Could not remove %1 because of a local file name clash 無法移除檔案 %1,因為本機檔案名稱有衝突 @@ -3587,46 +3846,51 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateLocalRename - + File %1 cannot be renamed to %2 because of a local file name clash 檔案 %1 無法重新命名為 %2,因為本機檔案名稱有衝突 - - - + + File %1 downloaded but it resulted in a local file name clash! + 已下載檔案 %1,但其導致了本機檔案名稱衝突! + + + + + could not get file %1 from local DB 無法從本機資料庫取得檔案 %1 - + Error setting pin state 設定釘選狀態時發生錯誤 - - + + Error updating metadata: %1 更新詮釋資料時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 目前正在使用中 - - + + Could not delete file record %1 from local DB 無法從本機資料庫刪除檔案紀錄 %1 - + Failed to propagate directory rename in hierarchy 無法在層次結構中傳播目錄重新命名 - + Failed to rename file 重新命名檔案失敗 @@ -3647,7 +3911,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteDeleteEncryptedRootFolder - + Wrong HTTP code returned by server. Expected 204, but received "%1 %2". 伺服器回傳錯誤的 HTTP 代碼。預期為 204,但收到的是「%1 %2」。 @@ -3660,12 +3924,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 伺服器回傳錯誤的 HTTP 代碼。預期為 201,但收到的是「%1 %2」。 - + Error writing metadata to the database: %1 將詮釋資料寫入到資料庫時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 目前正在使用中 @@ -3673,42 +3937,42 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::PropagateRemoteMove - + Could not rename %1 to %2, error: %3 無法將 %1 重新命名為 %2,錯誤:%3 - + Wrong HTTP code returned by server. Expected 201, but received "%1 %2". 伺服器回傳錯誤的 HTTP 代碼。預期為 201,但收到的是「%1 %2」。 - + could not get file %1 from local DB 無法從本機資料庫取得檔案 %1 - + Could not delete file record %1 from local DB 無法從本機資料庫刪除檔案紀錄 %1 - + Error updating metadata: %1 更新詮釋資料時發生錯誤:%1 - + The file %1 is currently in use 檔案 %1 目前正在使用中 - + Error setting pin state 設定釘選狀態時發生錯誤 - + Error writing metadata to the database 將詮釋資料寫入到資料庫時發生錯誤 @@ -3898,7 +4162,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ServerNotificationHandler - + Reply 回覆 @@ -3916,23 +4180,23 @@ This is a new, experimental mode. If you decide to use it, please report any iss 設定 - + %1 Settings This name refers to the application name e.g Nextcloud %1 設定 - + General 一般 - + Network 網路 - + Account 帳號 @@ -3940,17 +4204,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareModel - + Share link 分享連結 - + Link share 連結分享 - + + Internal link + 內部連結 + + + Enter a note for the recipient 輸入給收件者的訊息 @@ -4026,7 +4295,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ShareeModel - + %1 (%2) sharee (shareWithAdditionalInfo) %1 (%2) @@ -4035,132 +4304,171 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SocketApi - + + Failed to encrypt folder at "%1" + 加密位於「%1」的資料夾失敗 + + + + The account %1 does not have end-to-end encryption configured. Please configure this in your account settings to enable folder encryption. + 帳號 %1 沒有設定端到端加密。請在您的帳號設定中設定這個以啟用資料夾加密。 + + + + Failed to encrypt folder + 加密資料夾失敗 + + + + Could not encrypt the following folder: "%1". + +Server replied with error: %2 + 無法加密以下資料夾:「%1」。 + +伺服器回覆錯誤:%2 + + + + Folder encrypted successfully + 資料夾加密成功 + + + + The following folder was encrypted successfully: "%1" + 以下資料夾加密成功:「%1」 + + + Context menu share 分享內容選單 - + Select new location … 選取新位置…… - + I shared something with you 我與您分享了一些東西 - - + + Share options 分享選項 - - + + Activity 事件 - + Copy private link to clipboard 將私人連結複製到剪貼簿 - + Send private link by email … 用電子郵件發送私人連結…… + + + Expire in %1 minutes + remaining time before lock expire + %1 分鐘後過期 + - + Leave this share 離開此分享 - + Resharing this file is not allowed 此檔案不允許二次分享 - + Resharing this folder is not allowed 此資料夾不允許二次分享 - - + + Copy public link 複製公開連結 - + Copy internal link 複製內部連結 - + + Encrypt + 加密 + + + Lock file 鎖定檔案 - + Unlock file 解鎖檔案 - + Locked by %1 被 %1 鎖定 - - Expire in %1 minutes - remaining time before lock expire - %1 分鐘後過期 - - - + Expires in %1 minutes remaining time before lock expires %1 分鐘後過期 - + Edit 編輯 - + Open in browser 用瀏覽器打開 - + Resolve conflict … 解決衝突…… - + Move and rename … 移動並重新命名…… - + Move, rename and upload … 移動、重新命名並上傳…… - + Delete local changes 刪除本機變更 - + Move and upload … 移動並上傳…… - + Delete 刪除 @@ -4378,63 +4686,63 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::SyncEngine - + %1 (skipped due to earlier error, trying again in %2) %1(因先前錯誤而跳過,%2 後重試) - + Could not update file: %1 無法更新檔案:%1 - + Could not update virtual file metadata: %1 無法更新虛擬檔案詮釋資料:%1 - + Could not update file metadata: %1 無法更新檔案詮釋資料:%1 - + Could not set file record to local DB: %1 無法將檔案紀錄設定至本機資料庫:%1 - + Unresolved conflict. 未解決的衝突。 - + Only %1 are available, need at least %2 to start Placeholders are postfixed with file sizes using Utility::octetsToString() 目前僅有 %1 可以使用,至少需要 %2 才能開始 - + Unable to open or create the local sync database. Make sure you have write access in the sync folder. 無法開啟或建立本機同步資料庫。請確保您有寫入同步資料夾的權限。 - + Using virtual files with suffix, but suffix is not set 正在使用有後綴的虛擬檔案,但未設定後綴 - + Unable to read the blacklist from the local database 無法從本機資料庫讀取黑名單 - + Unable to read from the sync journal. 無法讀取同步日誌。 - + Cannot open the sync journal 無法開啟同步日誌 @@ -4444,12 +4752,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss 同步會很快恢復 - + Disk space is low: Downloads that would reduce free space below %1 were skipped. 剩餘空間不足:下載後將使剩餘空間降至低於 %1 的檔案一律跳過。 - + There is insufficient space available on the server for some uploads. 伺服器上的剩餘空間不足以容納某些要上傳的檔案。 @@ -4518,59 +4826,59 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Systray - + Download 下載 - + Add account 新增帳號 - + Open main dialog 開啟主對話框 - - + + Pause sync 暫停同步 - - + + Resume sync 繼續同步 - + Settings 設定 - + Help 說明 - + Exit %1 離開 %1 - + Pause sync for all 暫停所有同步 - + Resume sync for all 恢復所有同步 - + %1: %2 %1:%2 @@ -4578,24 +4886,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::Theme - + <p>%1 Desktop Client</p> Example text: "<p>Nextcloud Desktop Client</p>" (%1 is the application name) <p>%1 桌面版客戶端</p> - - + + <p>Version %1. For more information please click <a href='%2'>here</a>.</p> <p>版本為 %1。詳細資訊請點擊<a href='%2'>此處</a>。</p> - + <p><small>Using virtual files plugin: %1</small></p> <p><small>正在使用虛擬檔案外掛程式:%1</small></p> - + <p>This release was supplied by %1</p> <p>此版本由 %1 提供</p> @@ -4603,22 +4911,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::UnifiedSearchResultsListModel - + Failed to fetch providers. 擷取提供者失敗。 - + Failed to fetch search providers for '%1'. Error: %2 擷取「%1」的搜尋提供者失敗。錯誤:%2 - + Search has failed for '%2'. 搜尋「%2」失敗。 - + Search has failed for '%1'. Error: %2 搜尋「%1」失敗。錯誤:%2 @@ -4626,30 +4934,36 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::User - + Retry all uploads 重試所有上傳 + + + + Resolve conflict + 解決衝突 + OCC::UserModel - + Confirm Account Removal 請確認移除帳號 - + <p>Do you really want to remove the connection to the account <i>%1</i>?</p><p><b>Note:</b> This will <b>not</b> delete any files.</p> <p>您真的想要移除帳號 <i>%1</i> 的連線嗎?</p><p><b>請注意:</b>這將<b>不會</b>刪除任何檔案。</p> - + Remove connection 移除連線 - + Cancel 取消 @@ -4787,8 +5101,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsSuffix - - + + Error updating metadata due to invalid modification time 因為修改時間無效,所以更新詮釋資料時發生錯誤 @@ -4796,8 +5110,8 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::VfsXAttr - - + + Error updating metadata due to invalid modification time 因為修改時間無效,所以更新詮釋資料時發生錯誤 @@ -4895,123 +5209,123 @@ This is a new, experimental mode. If you decide to use it, please report any iss OCC::ownCloudGui - + Unsupported Server Version 不支援的伺服器版本 - + 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. %1 帳號所在的伺服器執行了不支援的版本 %2。將此客戶端與不支援的伺服器版本一同使用是未經測試且有潛在的危險性。若要繼續,請自負風險。 - + Disconnected 已斷線 - + Disconnected from some accounts 與某些帳號斷線 - + Disconnected from %1 從 %1 斷線 - + Disconnected from accounts: 與帳號斷線: - + Account %1: %2 帳號 %1:%2 - + Please sign in 請登入 - + Signed out 已登出 - + Account synchronization is disabled 已停用帳號同步 - - + + Synchronization is paused 已暫停同步 - + Folder %1: %2 資料夾 %1:%2 - + Unresolved conflicts 未解決的衝突 - + Up to date 最新的 - + Error during synchronization 同步時發生錯誤 - + There are no sync folders configured. 沒有設定同步資料夾。 - + No sync folders configured 未設定同步資料夾 - + Checking for changes in remote "%1" 正在檢查遠端「%1」中的變更 - + Checking for changes in local "%1" 正在檢查本機「%1」中的變更 - + Syncing %1 of %2 (%3 left) 正在同步 %1,共 %2(剩餘 %3) - + Syncing %1 of %2 正在同步第 %1 項,共 %2 項 - + Syncing %1 (%2 left) 正在同步第 %1 項(剩餘 %2 項) - + Syncing %1 正在同步 %1 - + %1 (%2, %3) %1 (%2, %3) @@ -5163,27 +5477,27 @@ This is a new, experimental mode. If you decide to use it, please report any iss 新資料夾 - + You renamed %1 您已重新命名 %1 - + You deleted %1 您已刪除 %1 - + You created %1 您已建立 %1 - + You changed %1 您已變更 %1 - + Synced %1 已同步 %1 @@ -5249,30 +5563,106 @@ This is a new, experimental mode. If you decide to use it, please report any iss 標記為已讀 + + ShareDelegate + + + Create a new share link + 建立新分享連結 + + + + Copy share link location + 複製分享連結位置 + + + + Share options + 分享選項 + + + + ShareDetailsPage + + + An error occurred setting the share password. + 設定分享密碼時發生錯誤 + + + + Edit share + 編輯分享 + + + + Dismiss + 忽略 + + + + Share label + 分享標籤 + + + + Allow editing + 允許編輯 + + + + Password protect + 密碼保護 + + + + Set expiration date + 設定到期日 + + + + Note to recipient + 給收件人的備註 + + + + Unshare + 取消分享 + + + + Add another link + 新增其他連結 + + + + Copy share link + 複製分享連結 + + ShareView - + Password required for new share 新分享需要密碼 - + Share password 分享密碼 - + Sharing is disabled 分享功能已停用 - + This item cannot be shared. 無法分享此項目。 - + Sharing is disabled. 已停用分享功能。 @@ -5288,7 +5678,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss SyncJournalDb - + Failed to connect database. 連結資料庫失敗。 @@ -5346,6 +5736,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 載入更多結果 + + UnifiedSearchResultNothingFound + + + No results for + 沒有結果 + + + + UnifiedSearchResultSectionItem + + + Search results section %1 + 搜尋結果部份 %1 + + UserLine @@ -5409,67 +5815,67 @@ This is a new, experimental mode. If you decide to use it, please report any iss UserStatusSelector - + Online status 線上狀態 - + Online 線上 - + Away 離開 - + Do not disturb 請勿打擾 - + Mute all notifications 靜音所有通知 - + Invisible 隱藏 - + Appear offline 顯示為離線 - + Status message 狀態訊息 - + What is your status? 您目前的狀態是什麼呢? - + Clear status message after 在這個時間後清除狀態訊息 - + Cancel 取消 - + Clear status message 清除狀態訊息 - + Set status message 設定狀態訊息 @@ -5553,24 +5959,24 @@ This is a new, experimental mode. If you decide to use it, please report any iss Window - + Nextcloud desktop main dialog Nextcloud 桌面版主要對話框 - + Current account 目前帳號 - - + + Resume sync for all 恢復所有同步 - - + + Pause sync for all 暫停所有同步 @@ -5580,22 +5986,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss 設定使用者狀態 - + Add account 新增帳號 - + Add new account 新增帳號 - + Settings 設定 - + Exit 離開 @@ -5604,11 +6010,6 @@ This is a new, experimental mode. If you decide to use it, please report any iss Current user avatar 目前使用者的大頭照 - - - Current account avatar - 目前的帳號大頭照 - Current user status is online @@ -5620,70 +6021,75 @@ This is a new, experimental mode. If you decide to use it, please report any iss 目前的使用者狀態為請勿打擾 - + + Current account avatar + 目前的帳號大頭照 + + + Current account status is online 目前的帳號狀態為在線上 - + Current account status is do not disturb 目前的帳號狀態為請勿打擾 - + + %1 - File activity + %1 - 檔案事件 + + + Account switcher and settings menu 帳號切換器與設定選單 - + Open local folder of current account 開啟目前帳號的本機資料夾 - + Connected 已連線 - + Disconnected 已斷線 - + Open Nextcloud Talk in browser 在瀏覽器中開啟 Nextcloud Talk - + More apps 更多應用程式 - + Open %1 in browser 在瀏覽器中開啟 %1 - + Unified search results list 統一搜尋結果清單 - - - %1 - File activity - %1 - 檔案事件 - main.cpp - + System Tray not available 系統匣不可用 - + %1 requires on a working system tray. If you are running XFCE, please follow <a href="http://docs.xfce.org/xfce/xfce4-panel/systray">these instructions</a>. Otherwise, please install a system tray application such as "trayer" and try again. %1 需要可運作的系統匣。如果您正在執行 XFCE,請遵循<a href="http://docs.xfce.org/xfce/xfce4-panel/systray">這些介紹</a>。否則請安裝如「trayer」等系統匣應用程式並再試一次。 @@ -5691,7 +6097,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss nextcloudTheme::about() - + <p><small>Built from Git revision <a href="%1">%2</a> on %3, %4 using Qt %5, %6</small></p> <p><small>從 Git 修訂版本 <a href="%1">%2</a> 在 %3 上建置,%4 使用 Qt %5,%6</small></p> @@ -5725,72 +6131,77 @@ This is a new, experimental mode. If you decide to use it, please report any iss + Server version downloaded, copied changed local file into case conflict conflict file + 已下載伺服器上的版本,並將本機已更改的檔案複製至大小寫衝突檔案 + + + Deleted 已刪除 - + Moved to %1 移動至 %1 - + Ignored 已忽略 - + Filesystem access error 檔案系統存取錯誤 - + Error 錯誤 - + Updated local metadata 已更新本機詮釋資料 - + Unknown 未知 - + downloading 正在下載 - + uploading 正在上傳 - + deleting 正在刪除 - + moving 正在移動 - + ignoring 正在忽略 - + error 錯誤 - + updating local metadata 正在更新本機詮釋資料 -- 2.30.2